RSA使用node.js加密在Java中获得BadPaddingException
我正在尝试加密节点中的一些数据以发送到Java服务器,并不断出现此错误BadPaddingException。我也看到过其他帖子,它们给出了在Java端更改密码实例的答案RSA使用node.js加密在Java中获得BadPaddingException,java,node.js,encryption,cryptography,Java,Node.js,Encryption,Cryptography,我正在尝试加密节点中的一些数据以发送到Java服务器,并不断出现此错误BadPaddingException。我也看到过其他帖子,它们给出了在Java端更改密码实例的答案 Cipher CheckCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); 但由于此服务器用于多个不同的服务,因此此应用程序不可能使用此服务器 我当前的实现是使用NodeForge var publicKey = fs.readFileSync('Public.key',
Cipher CheckCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
但由于此服务器用于多个不同的服务,因此此应用程序不可能使用此服务器
我当前的实现是使用NodeForge
var publicKey = fs.readFileSync('Public.key', 'utf8');
const key = new nodeRSA([publicKey]); //the file is not pem formatted and nodeRSA formats it to use in forge
var publicKeyForge = forge.pki.publicKeyFromPem(key.exportKey(scheme));
var providerIdBufferForge = forge.util.createBuffer(providerId, 'utf8');
var providerIdBytes = providerIdBufferForge.getBytes();
var providerIdEncrypted = publicKeyForge.encrypt(providerIdBytes, 'RSAES-PKCS1-V1_5');
var encryptedProviderId = forge.util.encode64(providerIdEncrypted);
然而,在Java端出现了填充错误
我还尝试过使用节点rsa和crypto.publicEncrypt。我很确定这是算法方案中的一个不匹配,但经过几天的尝试和错误,仍然是空的
Java端代码是
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] byteDecryptText = org.apache.commons.codec.binary.Base64.decodeBase64(dataToDecrypt);
decryptedText = cipher.doFinal(byteDecryptText);
decryptedData = new String(decryptedText, "UTF-8");
有人有过将节点RSA加密与基本Java RSA解密相匹配的经验吗
非常感谢您的帮助!
谢谢请不要依赖密码的默认行为。你需要控制哪些选项在起作用,否则你最终会遇到这样的问题。您应该能够精确地描述两端使用的填充,然后在代码中指定它。在java中不指定密码的填充,因为它已经在使用的代码只是一个糟糕的借口。。某个选项正在使用中,请指定它。。当这一切就绪时,您就会自动知道在javascript中使用什么选项。我不明白为什么您至少不能用完整的RSA转换字符串测试服务器。在任何情况下,Oracle提供程序默认为PKCS1PADDING,因此这不是您的问题。很可能您使用了错误的私钥,或者在某个地方混淆了数据,@EbbeM.Pedersen Java代码是多年前编写的,由另一个组维护,因此我真的没有任何选择。@JamesKPolk我同意数据在某个地方被混淆,虽然我直接使用了来自Forge的示例代码,但我并没有真正看到哪里出了问题。考虑到我可以直接访问开发人员,我非常确定这些密钥是正确的。关于数据可能在何处损坏的任何建议?我唯一的建议是展示一个完整的示例,其中包含私钥(当然是丢弃测试密钥)以及问题的节点和Java端的输入和输出。请不要依赖密码的默认行为。你需要控制哪些选项在起作用,否则你最终会遇到这样的问题。您应该能够精确地描述两端使用的填充,然后在代码中指定它。在java中不指定密码的填充,因为它已经在使用的代码只是一个糟糕的借口。。某个选项正在使用中,请指定它。。当这一切就绪时,您就会自动知道在javascript中使用什么选项。我不明白为什么您至少不能用完整的RSA转换字符串测试服务器。在任何情况下,Oracle提供程序默认为PKCS1PADDING,因此这不是您的问题。很可能您使用了错误的私钥,或者在某个地方混淆了数据,@EbbeM.Pedersen Java代码是多年前编写的,由另一个组维护,因此我真的没有任何选择。@JamesKPolk我同意数据在某个地方被混淆,虽然我直接使用了来自Forge的示例代码,但我并没有真正看到哪里出了问题。考虑到我可以直接访问开发人员,我非常确定这些密钥是正确的。关于数据可能在哪里损坏的任何建议?我唯一的建议是展示一个完整的示例,其中包含私钥(当然是丢弃的测试密钥)以及问题的节点和Java端的输入和输出。