![](/img/trans.png)
[英]What cryptographic algorithms should I use to encrypt data using private key and decrypt data using public key?
[英]Encrypt data using private key in C and decrypting data using public key in Java
我有用例,我想使用C中的私钥加密某些数据,并使用Java中的公钥解密。
我使用openssl生成了公用/专用密钥。 我能够运行ac代码以使用私钥加密数据。
类似于以下代码:
#include <openssl/pem.h>
#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/evp.h>
#include <openssl/bio.h>
#include <openssl/err.h>
int padding = RSA_PKCS1_PADDING;
char * data;
char *encrypted;
FILE * fp = fopen(<private_key_file>,"rb");
RSA *rsa= RSA_new() ;
rsa = PEM_read_RSAPrivateKey(fp, &rsa,NULL, NULL);
RSA_private_encrypt(data_len,data,encrypted,rsa,padding);
这可以正常工作,我也可以使用C中的公共密钥对其进行解密。我无法使用Java中的公共密钥对其进行解密。 为此,我将公钥转换为DER格式: $ openssl rsa -in private_key.pem -pubout -outform DER -out public_key.der
我正在使用以下代码
public String decrypt(byte[] encrypted) throws Exception
{
Cipher cipher = Cipher.getInstance("RSA");
KeyFactory kf = KeyFactory.getInstance("RSA");
byte[] encKey = readFromFile(PUBLIC_KEY_FILE, false);
X509EncodedKeySpec ks = new X509EncodedKeySpec(encKey);
PublicKey pk = kf.generatePublic(ks);
cipher.init(Cipher.DECRYPT_MODE, pk);
byte[] plainText = cipher.doFinal(encrypted);
return new String(plainText,"UTF-8");
}
我的Java代码出现以下异常。
Exception in thread "main" javax.crypto.BadPaddingException: Decryption error
at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380)
at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291)
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:356)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
at javax.crypto.Cipher.doFinal(Cipher.java:2121)
at AssyncKeyEncryptTest.decrypt(AssyncKeyEncryptTest.java:198)
at AssyncKeyEncryptTest.test(AssyncKeyEncryptTest.java:45)
at AssyncKeyEncryptTest.main(AssyncKeyEncryptTest.java:32)
有人可以帮我解决使用Java中的公共密钥解密数据的错误吗?
stacktrace建议在加密和解密之间使用不同的填充。
尝试使用“ PKCS1Padding”作为解密实例,因为您在加密时使用了它。
尝试使用"RSA/None/PKCS1Padding"
代替"RSA"
。 如果无法使用"RSA/None/PKCS1Padding"
找到Cipher
实例,请尝试添加安全性提供程序,例如Bouncy Castle Provider。
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
添加充气城堡的依赖关系应该足够简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.