在c中使用私钥加密数据,在java中使用公钥解密数据

ndasle7k  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(410)

我有一个用例,我想用c中的私钥加密一些数据,用java中的公钥解密它。
我使用openssl生成了公钥/私钥。我可以运行一个c代码来使用私钥加密数据。
类似于以下代码:

  1. # include <openssl/pem.h>
  2. # include <openssl/ssl.h>
  3. # include <openssl/rsa.h>
  4. # include <openssl/evp.h>
  5. # include <openssl/bio.h>
  6. # include <openssl/err.h>
  7. int padding = RSA_PKCS1_PADDING;
  8. char * data;
  9. char *encrypted;
  10. FILE * fp = fopen(<private_key_file>,"rb");
  11. RSA *rsa= RSA_new() ;
  12. rsa = PEM_read_RSAPrivateKey(fp, &rsa,NULL, NULL);
  13. 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 我使用以下代码

  1. public String decrypt(byte[] encrypted) throws Exception
  2. {
  3. Cipher cipher = Cipher.getInstance("RSA");
  4. KeyFactory kf = KeyFactory.getInstance("RSA");
  5. byte[] encKey = readFromFile(PUBLIC_KEY_FILE, false);
  6. X509EncodedKeySpec ks = new X509EncodedKeySpec(encKey);
  7. PublicKey pk = kf.generatePublic(ks);
  8. cipher.init(Cipher.DECRYPT_MODE, pk);
  9. byte[] plainText = cipher.doFinal(encrypted);
  10. return new String(plainText,"UTF-8");
  11. }

我的java代码有以下异常。

  1. Exception in thread "main" javax.crypto.BadPaddingException: Decryption error
  2. at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380)
  3. at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291)
  4. at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:356)
  5. at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
  6. at javax.crypto.Cipher.doFinal(Cipher.java:2121)
  7. at AssyncKeyEncryptTest.decrypt(AssyncKeyEncryptTest.java:198)
  8. at AssyncKeyEncryptTest.test(AssyncKeyEncryptTest.java:45)
  9. at AssyncKeyEncryptTest.main(AssyncKeyEncryptTest.java:32)

有人能帮我解决在java中使用公钥解密数据的错误吗?

voase2hg

voase2hg1#

尝试 "RSA/None/PKCS1Padding" 而不是 "RSA" . 如果你找不到 Cipher 示例 "RSA/None/PKCS1Padding" 然后尝试添加像bouncy castle provider这样的安全提供程序。 Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 添加bouncy castle依赖项应该足够简单。
http://www.bouncycastle.org/latest_releases.html

o0lyfsai

o0lyfsai2#

stacktrace建议在加密和解密之间使用不同的填充。
在加密时使用“pkcs1padding”作为解密示例。

相关问题