使用pkcs12文件进行OpenSSL RSA公共/私有加密/解密 我将从C到C的服务移植到C++中,涉及到RSA加密。使用OpenSSL 1.0.2。(两周前我写了第一行C++,所以请你容忍我。)

使用pkcs12文件进行OpenSSL RSA公共/私有加密/解密 我将从C到C的服务移植到C++中,涉及到RSA加密。使用OpenSSL 1.0.2。(两周前我写了第一行C++,所以请你容忍我。),c++,openssl,rsa,pkcs12,C++,Openssl,Rsa,Pkcs12,我正在尝试使用RSA加密/解密数据。加密使用通过HTTPS调用服务器检索的公钥(使用SSL证书的公钥) 解密发生在服务器上-从PFX文件(PKCS12)加载私钥 我在解密方面遇到问题-错误:0407109F:rsa例程:rsa\u padding\u check\u PKCS1\u type\u 2:pkcs解码错误 我做错了什么 加密-从服务器获取公钥(HTTPS) int-MyUtil::EncryptWithPublicKeyRetrievedFromServer(int-length,无

我正在尝试使用RSA加密/解密数据。加密使用通过HTTPS调用服务器检索的公钥(使用SSL证书的公钥)

解密发生在服务器上-从PFX文件(PKCS12)加载私钥

我在解密方面遇到问题-错误:0407109F:rsa例程:rsa\u padding\u check\u PKCS1\u type\u 2:pkcs解码错误

我做错了什么

加密-从服务器获取公钥(HTTPS)

int-MyUtil::EncryptWithPublicKeyRetrievedFromServer(int-length,无符号字符*bytesToEncrypt,无符号字符*输出){
//从服务器获取证书
boost::asio::ssl::context ctx(boost::asio::ssl::context::sslv23);
boost::asio::io_服务io_服务;
ctx.set_default_verify_path();
客户机myClient=客户机(io_服务,ctx);
自动证书=myClient.GetX509Certificate(“www.myHttpsDomain.com”);
//获取公钥
自动密钥=X509\u获取\u公开密钥(证书);
自动rsa=EVP_PKEY_get1_rsa(密钥);
//加密
返回RSA_public_encrypt(长度、bytesToEncrypt、输出、RSA、RSA_PKCS1_填充);
}
解密-使用私钥

int-MyUtil::DecryptWithPrivateKey(int-length,unsigned char*bytesToDecrypt,unsigned char*output){
auto filePath=“C:\\myCertificateWithPrivate和PublicKey.pfx”;
自动传递=“MySecretPassword”;
文件*fp;
执行副总裁*PKEY;
X509*证书;
(X509)*ca的栈_=NULL;
PKCS12*p12;
OpenSSL_添加_所有算法();
错误加载加密字符串();
#pragma警告(禁用:4996)//MS投诉fopen
如果(!(fp=fopen(文件路径,“rb”)){
fprintf(stderr,“打开文件%s时出错”,文件路径);
出口(1);
}
p12=d2i_PKCS12_fp(fp,NULL);
fclose(fp);
如果(!p12){
fprintf(stderr,“读取PKCS#12文件时出错”);
错误打印错误fp(stderr);
出口(1);
}
//解析PKCS12(PFX)文件以获取私钥
if(!PKCS12_parse(p12,pass,&pkey,&cert,&ca)){
fprintf(stderr,“解析PKCS#12文件时出错\n”);
错误打印错误fp(stderr);
出口(1);
}
无PKCS12_(p12);
//解密
自动rsa=EVP_PKEY_get1_rsa(PKEY);
int-sizeOfDecryptedData;
if(sizeOfDecryptedData=RSA_private_decrypt(长度、bytesToDecrypt、输出、RSA、RSA_PKCS1_PADDING)=-1)
{
自动错误=新字符;
错误加载加密字符串();
ERR\u error\u字符串(ERR\u get\u error(),ERR);
fprintf(stderr,“加密消息时出错:%s\n”,err);
//-->错误:0407109F:rsa例程:rsa_padding_check_PKCS1_type_2:pkcs解码错误
删除错误;
}
sk_X509_pop_free(ca,X509_free);
X509_免费(证书);
免费执行副总裁(PKEY);
fclose(fp);
返回sizeOfDecryptedData;
}
我还尝试通过PEM格式加载私钥,然后解密

int-MyUtil::DecryptWithPrivateKey(int-length,unsigned char*bytesToDecrypt,unsigned char*output){
char*private\u key\u file\u name=“C:\\privatekey.cer”;
#pragma警告(禁用:4996)//MS投诉fopen
FILE*fp=fopen(私钥文件名,“r”);
RSA*RSA=PEM_read_RSAPrivateKey(fp,NULL,NULL,NULL);
fclose(fp);
if(sizeOfDecryptedData=RSA_private_decrypt(长度、bytesToDecrypt、输出、RSA、RSA_PKCS1_PADDING)=-1)
{
自动错误=新字符;
错误加载加密字符串();
ERR\u error\u字符串(ERR\u get\u error(),ERR);
fprintf(stderr,“加密消息时出错:%s\n”,err);
//-->错误:0407109F:rsa例程:rsa_padding_check_PKCS1_type_2:pkcs解码错误
删除错误;
}
返回解密字节;
}

您的加密代码似乎有一个输入错误:您编写的是SA_PKCS1_填充,而不是RSA_PKCS1_填充。我不确定这是否会影响你的问题?我想你的编译器应该已经警告过你了…@xmoex:很抱歉-这只是堆栈溢出时的一个格式错误。代码编译并运行。我也试过不同的填充物,但都没用。我想是的。。。太简单了:-)在加密部分添加一些错误检查怎么样?我会尝试使用新生成的密钥对进行检查,该密钥对是ascii硬编码到您的测试中的,以确保加载或检索密钥/证书数据时不会产生其他副作用(例如:)私有解密对我来说似乎没问题(至少对于PEM格式的密钥),因此我会在获取公钥的代码中查找问题