Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中使用私钥加密数据,在Java中使用公钥解密数据_Java_C_Encryption_Rsa - Fatal编程技术网

在C中使用私钥加密数据,在Java中使用公钥解密数据

在C中使用私钥加密数据,在Java中使用公钥解密数据,java,c,encryption,rsa,Java,C,Encryption,Rsa,我有一个用例,我想在C中使用私钥加密一些数据,在java中使用公钥解密 我使用openssl生成了公钥/私钥。我能够运行一个c代码来使用私钥加密数据 类似于以下代码: #include <openssl/pem.h> #include <openssl/ssl.h> #include <openssl/rsa.h> #include <openssl/evp.h> #include <openssl/bio.h> #include &l

我有一个用例,我想在C中使用私钥加密一些数据,在java中使用公钥解密

我使用openssl生成了公钥/私钥。我能够运行一个c代码来使用私钥加密数据

类似于以下代码:

#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);
我的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建议加密和解密之间使用不同的填充

在加密时尝试使用“pkcs1ppadding”作为解密实例。

尝试使用
“RSA/None/pkcs1ppadding”
而不是
“RSA”
。 如果您无法使用
“RSA/None/pkcs1ppadding”
找到
密码
实例,请尝试添加像Bouncy Castle provider这样的安全提供程序。
Security.addProvider(新org.bouncycastle.jce.provider.BouncyCastleProvider())
添加bouncy castle依赖项应该足够简单


RSA不是这样工作的。您使用公钥加密,然后使用私钥解密。也许您希望使用私钥签名并使用公钥验证。加密和解密的RSA算法是相同的,因此您可以使用私钥加密,然后使用公钥解密。这用于数字签名。出于安全原因,您不应使用私钥加密多个数据包。大多数高级RSA工具/API不允许您运行私钥加密/解密。您可能需要为Java端搜索不同的自定义RSA实现。@JonatanGoebel,您可以用私钥加密(使用与您使用的相同的词:sign)任意数量的数据包。正如您所说,您正在对它们进行签名,这样就可以使用公钥对它们进行未加密(验证)而不会产生风险。不建议使用相同的密钥对消息进行签名和加密(或者更糟糕的是,对相同的明文进行签名和加密),因为密钥模块可能会因此受损。
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)