OpenSSL和MS CryptoAPI兼容性问题

OpenSSL和MS CryptoAPI兼容性问题,openssl,cryptoapi,Openssl,Cryptoapi,我面临着Microsoft CrypoAPI和OpenSSL之间的不兼容问题,我无法解决它 我想使用带有公钥的CAPI对消息进行RSA加密,然后使用OpenSSL(使用私钥)对其进行解密,但运气不好 我正在做的步骤如下: 使用pem格式的OpenSSL生成公钥/私钥对 openssl genrsa-out private.pem 2048 openssl rsa-in private.pem-outform pem-pubout-out public.pem 然后在CAPI中,我导入生成的

我面临着Microsoft CrypoAPI和OpenSSL之间的不兼容问题,我无法解决它

我想使用带有公钥的CAPI对消息进行RSA加密,然后使用OpenSSL(使用私钥)对其进行解密,但运气不好

我正在做的步骤如下:

  • 使用pem格式的OpenSSL生成公钥/私钥对
openssl genrsa-out private.pem 2048

openssl rsa-in private.pem-outform pem-pubout-out public.pem

  • 然后在CAPI中,我导入生成的密钥,如下所示: dsadsa
const char*szPemPrivKey=
“----开始RSA私钥------”
“MIIEpAIBAAKCAQEAvUT7PaQzzhSmyQKrnroWCk2tdy9O1BR6bINObhGXoDfK4tnU”
“qgpr0MbM8VjCvpgNjJT8m5RZkvSxcmaWZZQnXxr/SESnrmwk6CcRAvEk45M3LTix”
“N0ttuzzqdbg9z0bgx1a1p866s87mof6wbb9yufv79n7j+xZRQC8mnRtvmzjRZ3W”
“MOcBZ8n1C106gOq//SwvB28mGWTpJ+OPASV3MKxtydid5V7/yq2Lx4NrvJN+1E4”
“NOX6pliteCFCvnyzeze9KDUJ5Cv45IFRUO9M5EBO759LKPL1X69PTG7RPHEYULYY”
“urwEGExC1jp/Nbft0zOehsF4wwFqwQVQ34m5LQIDAQABAoIBAD6dQISu+th1aovb”
“T01GHYEJOHKA66RQ6IUC/Dj7wZ5DqynpbwvQGXMLua1F5AYG3tjmoIZvNxqCP4w”
“XBAMWC2RZ8JNVVU/3KX4EXYQVZQFLS5QXEXIGCUBV+B4qpc52Xq4IFgca88lcG”
“l6VYVXMuSa9Shk652PqD+OEcHWY+AyGxetGealo88Iwe2LBZrd9I1FAW8MRJ+wi”
“b9mVhZbjbrI+W9O7CFDE4D9LO4WZGRUNRA0THKUYFWJGTTJ3EP2JCWLE1IJ3MY”
“c/Mf8U8RlMU8N/YS77WTCxUA3DK0GE8HITQVD1NHSYUPM0xQINTKRSG0RI/2+”
“1C6GKJ0CGYEA9K9SNRLFUQSHWFYR40NPJ8R5X9YAPJFK8PRXSMDPOI8TPDYI66”
“fmnUsbV0ikM+9U898myUAF3SxZIZfw+LYI3ofdstnv6wc9+C9JP9WBGXSRYBURW”
“d3uPuemee7+CXTVEWI0PEAVERSP+m6MZ/F+SRkQjyLmBXu7soxaspMCgYEAxgWL”
“/wkz6WCf37+9TUHO0MG7vOQ2sI7Bc+82dAa9fsxLwpncmkNxEv+hK3k7Jlr2J4pZ”
“SVERHCQ3OHM2ADRI5CFQAZO4BGDOP7ZYWZUW/MakZdCf8olWCifXEPWcxBo8FGW”
“9/3XEbXkW481HDrX4wyn2b3ptdSqMcdDMKmifT8CgYEA6vtVWYG2teSE5OED0b13”
“VinnV0YTLY1BLHYW6134ZLJMIL9YBHX7VKBVDCO3OC7NSYENAO8DQWJ9U0Z4ZYW”
“aeeecM9+foSlPIJxINhJSCy30Mha6j24/UICg05iTwFaOr2vayOMZZxikeF/a8ei”
“u2fmGZkil/OX524UKYFMYLUGYAIFTJTYZICKRVBXZUNHVH0JAN/HmtSeTiH3ov”
“3jkfaepgRDtEEfeUXYtQAD2+DEnx5E4aKSJS9OE0jthmdx3OR07B/e31yqfthYnE”
“yeyUxvL7vB0mAZUL53IGX2a5x0lIk8J4TKiH09bKK4von/GojDuxtShus5xM4RL”
“C8174QKBgQDbRGyg3VCwo3p0sdqm5UlCL0pc36T5bBUfkVGpJdBZxbIx283CvY35”
“OGqcYdiANMn+alg9idxfafygg1qtqskf74cmi+gY7Z8n2OKsjF0cR8VkIYoI9BL”
“iDXvlWs2QVsv+1CIYmZdI8nkExirzRvBD75ZqNdGSWkrfuYnr/bpHg==”
“----结束RSA私钥------”;
常量字符*szPemPubKey=
“----开始公钥------”
“Miibijanbgkqhkig9w0baqefaocaq8amiibcgkcaqeavut7paqzzhsmyqkrnrow”
“Ck2tdy9O1BR6bINObhGXoDfK4tnUqgpr0MbM8VjCvpgNjJT8m5RZkvSxcmaWZZQn”
“Xxr/SESNRMWK6CCRAVEK45M3LTIXN0TTUZQDBG9Z0BGX1A1P866S87MOF6WBB9”
“yUfV79N7J+xZRQC8mnRtvmzjRZ3WMOcBZ8n1C106gOq//SwvB28mGWTpJ+opASv3”
“mkxTydiDd5v7/yq2Lx4NrvJN+1e4nox6plitecfcvnyzeze9kduj5cv45ifruo9m”
“5ebo759lKpL1X69ptG7RpHEYULYYurwEGExC1jp/Nbft0zOehsF4wwFqwQVQ34m5”
“LQIDAQAB”
“----结束公钥------”;
/* 
..... 这里有一些无关的代码*/
char-derPubKey[2048];
尺寸=2048;
证书公开密钥信息*公开密钥信息;
int publicKeyInfoLen;
HCRYPTPROV hProv=NULL;
HCRYPTKEY hKey=NULL;
/*
*从PEM格式转换为DER格式-删除页眉和页脚并从base64解码
*/
if(!CryptStringToBinaryA(szPemPubKey,0,CRYPT_STRING_BASE64HEADER,(BYTE*)derPubKey,(DWORD*)和derPubKeyLen,NULL,NULL))
{
fprintf(stderr,“CryptStringToBinary失败。错误:%d\n”,GetLastError());
}
/*
*从DER格式解码为证书\u公钥\u信息
*/
如果(!CryptDecodeObjectEx(X509\u ASN\u编码,X509\u公钥\u信息,(字节*)derPubKey,derPubKeyLen,
CRYPT_ENCODE_ALLOC_标志、NULL和publicKeyInfo(DWORD*)和publicKeyInfoLen))
{
fprintf(stderr,“CryptDecodeObjectEx 1失败。错误:%p\n”,GetLastError());
返回-1;
}
//创建临时和易失性CSP上下文以便导入
//用于签名的密钥和用法
if(!CryptAcquireContext(&hProv,NULL,MS_增强型_PROV,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT))
{
printf(“CryptAcquireContext失败,错误为0x%.8X\n”,GetLastError());
转到主出口;
}
/*
*使用上下文导入公钥
*/
if(!CryptImportPublicKeyInfo(hProv、X509\u ASN\u编码、publicKeyInfo和hKey))
{
fprintf(stderr,“CryptImportPubliceInfo失败。错误:%d\n”,GetLastError());
返回-1;
}
似乎已正确导入密钥并填充了
hKey

  • 到目前为止,一切顺利。然后我尝试加密一个明文
char*plaintext=“123456”;
LPBYTE pEncryptedData=NULL;
DWORD EncryptedDataLen=0;
LPBYTE pEncryptedDataRev=NULL;/*我稍后会解释这一点(:*/
DWORD EncryptedDataRevLen=0;
pEncryptedData=(LPBYTE)LocalAlloc(0500);
加密数据=6;
pEncryptedDataRev=(LPBYTE)LocalAlloc(0500);
加密数据=6;
CopyMemory(pEncryptedData,纯文本,6);
if(CryptEncrypt(hKey、NULL、TRUE、0、pEncryptedData和EncryptedDatelen,500)){
DWORD DWBYTESSWRITED=0;
hFile=CreateFile(L“poc_enc”,//写入文件的名称
GENERIC_WRITE,//打开进行写入
0,//不共享
NULL,//默认安全性
CREATE_NEW,//仅创建新文件
文件\属性\正常,//正常文件
NULL);//没有属性模板
反向扫描(pEncryptedData、pEncryptedData、EncryptedData);
可写文件(
hFile,//打开文件句柄
pEncryptedData,//要写入的数据的开始
EncryptedCatalen,//要写入的字节数
&DwBytesWrited,//写入的字节数
NULL);//无重叠结构
闭合手柄(hFile);
} 
你可以看到,我正在用
R反转加密数据
    RSA operation error
16968:error:0407109F:rsa routines:RSA_padding_check_PKCS1_type_2:pkcs decoding error:.\crypto\rsa\rsa_pk1.c:273:
16968:error:04065072:rsa routines:RSA_EAY_PRIVATE_DECRYPT:padding check failed:.\crypto\rsa\rsa_eay.c:602:
void ReverseStream(LPBYTE Source, LPBYTE Destination, DWORD Size)
{
    int SourceCnt = Size;
    int DestCnt = 0;

    for (SourceCnt = Size - 1, DestCnt = 0; SourceCnt >= 0; SourceCnt--, DestCnt++)
        Destination[DestCnt] = Source[SourceCnt];
}