【发布时间】:2021-05-04 17:13:13
【问题描述】:
我需要解密来自使用 NodeJS 构建的外部服务的一些信息。 此服务要求提供 base64 中 pem 格式的 RSA (2048) 公钥,以加密信息。
我正在用 Java 创建密钥对:
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(2048);
KeyPair kp = kpg.generateKeyPair();
PublicKey pubkey = kp.getPublic();
PrivateKey privkey = kp.getPrivate();
String pemPublicString = "-----BEGIN PUBLIC KEY-----\n";
pemPublicString = pemPublicString+Base64.getEncoder().encodeToString(pubkey.getEncoded())+"\n";
pemPublicString = pemPublicString+"-----END PUBLIC KEY-----\n";
String pemPrivateString = "-----BEGIN RSA PRIVATE KEY-----\n";
pemPrivateString = pemPrivateString+Base64.getEncoder().encodeToString(privkey.getEncoded())+"\n";
pemPrivateString = pemPrivateString+"-----END RSA PRIVATE KEY-----\n";
//Send to node js service
String base64publickey = Base64.getEncoder().encodeToString(pemPublicString.getBytes());
//Store for decrypting
String base64privatekey = Base64.getEncoder().encodeToString(pemPrivateString.getBytes());
外部服务正在对信息进行如下加密并返回字节:
crypto.publicEncrypt(
{
key: publicKey,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
oaepHash: "sha256",
},
dataToEncrypt
);
我正在尝试将Java中的信息解密如下:
public String decrypt(String payload, String privateKey){
byte [] ciphertext = payload.getBytes(StandardCharsets.UTF_8);
Cipher oaepFromInit = Cipher.getInstance("RSA/ECB/OAEPPadding");
OAEPParameterSpec oaepParams = new OAEPParameterSpec("SHA-256", "MGF1", new
MGF1ParameterSpec("SHA-1"), PSource.PSpecified.DEFAULT);
oaepFromInit.init(Cipher.DECRYPT_MODE, getRSAPrivateKeyFrom(privateKey), oaepParams);
byte[] pt = oaepFromInit.doFinal(ciphertext);
return new String(pt, StandardCharsets.UTF_8);
}
private PrivateKey getRSAPrivateKeyFrom(String content) {
byte[] decodedBytes = Base64.getDecoder().decode(content);
String decodedString = new String(decodedBytes);
Security.addProvider(new BouncyCastleProvider());
PEMParser pemParser = new PEMParser(new StringReader(decodedString));
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
Object object = pemParser.readObject();
PrivateKey k = converter.getPrivateKey((PrivateKeyInfo) object);
return k;
}
现在我得到一个 BadPadding 异常,知道可能是什么问题吗? 提前致谢。
【问题讨论】:
-
你能试试
MGF1ParameterSpec("SHA-256")吗? Java 有点特殊,因为它不为 MGF 和标签使用相同的散列。通常,如果在库中只给出一个哈希,则它用于两者。如果不起作用,请尝试将"SHA-1"作为第一个参数... -
您的 RSA 私钥未正确编码,Java 使用 PKCS#8 作为默认编码,在 PEM 中应该只是
PRIVATE KEY,而不是RSA PRIVATE KEY。
标签: javascript java node.js rsa encryption-asymmetric