使用Java的公共密钥在NodeJS中进行加密时遇到了麻烦。
我已经在keytool
中创建了一个RSA密钥,并将公共密钥输出为base64编码的字符串。
Base64.Encoder encoder = Base64.getEncoder();
byte[] pubKeyBytes = publicKey.getEncoded();
String pubKeyBase64 = encoder.encodeToString(pubKeyBytes);
然后我获取了base64编码的公钥,将其包装在-----BEGIN PUBLIC KEY-----
和-----END PUBLIC KEY-----
中,并用它进行加密,然后base64对节点中的字符串进行编码。
const encryptedBuffer = crypto.publicEncrypt(encodedPublicKey, buffer);
const encryptedEncodedText = encryptedBuffer.toString("base64");
当我尝试在Java中解密encryptedEncodedText
(首先进行base64解码)时,它将引发BadPadding
异常。有趣的是,如果我将私钥导出到PEM,Node也将无法对其进行解密。
任何帮助将不胜感激!
答案 0 :(得分:1)
我试图重现您的问题。对我来说,效果很好。我怀疑唯一有问题的步骤可能是在手动创建PEM文件时。请确保:
\n
之后和-----BEGIN PUBLIC KEY-----
之前加上换行符(-----END PUBLIC KEY-----
)。 如下所示:
var key = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqwEldwNI5s1LkUzwyQZkPQQFpgtj29W7RcHgdwAbUOe31Q8bybAgzg5cUMqdIQlQHq6S5dxsSJBTDCZozSu+pxtKqRLz0JjtCTZD5gS+CJR9DlXH5GgJt+KDiO6olbKiVsP/tsMPgRCFKUMiMKU+dA06dwrUqJlC1k/JzuYVrbwIDAQAB\n-----END PUBLIC KEY-----"
var plaintext = "hello world"
var buffer = new Buffer(plaintext, "utf8")
console.log(crypto.publicEncrypt(key, buffer))
为避免所有这些问题,您可以使用bouncycastle library从Java直接生成PEM文件。
答案 1 :(得分:1)
经过大量搜索和测试,结果发现这是一个填充问题。
提供给Node的公共密钥没有通过密码,因此根据文档,它默认为RSA_PKCS1_OAEP_PADDING
:
在Java端解密时,有必要按如下方式通知Java该填充:
Cipher cipher = Cipher.getInstance("RSA/NONE/OAEPPadding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
这解决了此问题,并允许Java和NodeJS之间交换消息。