[英]How to create AsymmetricKeyParameter from the java.security.PublicKey
[英]How to create java.security.publicKey from a Key recived as a ByteString - OAEP Padding
我有一个用go编写的gRPC服务器,它为用Java编写的客户端提供公钥。 该密钥使用带有sha-256的OAEP填充,并且以我认为是PEM格式的ByteString形式接收。
我正在尝试读入接收到的字节并将其放入要用于解密的PublicKey对象中
plaintext, err := rsa.DecryptOAEP(sha256.New(), rng, d.decKey, ciphertext, label)
if err != nil {
log.Fatalf("Error from decryption: %s\n", err)
}
// H := H'
return plaintext
这是我执行client.getKey()。toString()时打印到控制台的键
-----BEGIN RSA PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5SuTn/IhVfLpcgEtbkty
ip6ajx8tcVNt862lj24cz/zGEqzD3sDaRaS+9l16l63T/mWutPqyCBWekg9oGK6Z
ni313nJyvMETCY1kc9mj7IB9yNd00eXr+jYJNF92qc3k0IlyxDjD6hE/InlKn1cM
njYOMYhZtsMSQQElIeYsiqOD1k55E4905XP8gh3K5YT8jVBHJHboJiXVqBJ0CQPq
LKYufey+WcX3p5wKKUgycKxB1zgS1BAHJ/l9x6fxDTE85CBIeRyfSXijHgiWGAEY
MDOIRIBpA8MT5q0Mghy9+KryIHNkc+659DAgCjghY8pmyFezF5gDzRpEi+jB5OOT
bQIDAQAB
-----END RSA PUBLIC KEY-----
我一直试图将其解析为字符串,剥离“ ----- BEGIN RSA PUBLIC KEY -----”和“ ----- END RSA PUBLIC KEY -----”并转换剩余的字符串到字节数组,然后到PublicKey对象
String key = client.getPublicKey(nonce).getRSAEncryptionKey().toString();
key = key.replace("-----BEGIN RSA PUBLIC KEY-----\n", "");
key = key.replace("-----END RSA PUBLIC KEY-----", "");
byte[] keyBytes = Base64.getDecoder().decode(key); //bytes of key
Cipher cipher_RSA;
try {
cipher_RSA = Cipher.getInstance("RSA");
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pk = keyFactory.generatePublic( spec);
cipher_RSA.init(Cipher.ENCRYPT_MODE, pk);
return cipher_RSA.doFinal(message);
}catch(Exception e){}
这样会一直导致“非法base64字符”。 我认为这与密钥使用OAEP填充有关。 但是,当我将密钥工厂/密码的实例更改为“ RSA / ECB / OAEPWITHSHA-256ANDMGF1PADDING”时,会收到此错误:
java.security.NoSuchAlgorithmException: RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING KeyFactory not available
不同的base64解码器对于在遇到非法base64字符时是否引发异常还是仅忽略该字符有不同的规则。 空格(包括换行符)不是有效的base64字符。 要更正错误,您必须在base64解码之前简单地从PEM公钥字符串中删除换行符。
key = key.replace("-----BEGIN RSA PUBLIC KEY-----\n", "");
key = key.replace("-----END RSA PUBLIC KEY-----", "");
// add the following line
key = key.replace("\n", "");
注意:这被简化了,因为它假定'\\ n'将是行分隔符。 您还可以将替换添加到其他常见的行分隔符字符序列中。 确保按长度顺序订购替换件,最长者优先,最后者最短。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.