从Java到NodeJS的RSA公钥

时间:2018-07-14 14:21:16

标签: java node.js cryptography rsa

使用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也将无法对其进行解密。

任何帮助将不胜感激!

2 个答案:

答案 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

crypto.publicEncrypt

在Java端解密时,有必要按如下方式通知Java该填充:

Cipher cipher = Cipher.getInstance("RSA/NONE/OAEPPadding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);

这解决了此问题,并允许Java和NodeJS之间交换消息。