Windows CNG(加密新一代)生成的RSA SHA512签名NCryptSignHash与openssl RSA_签名生成的签名不匹配

Windows CNG(加密新一代)生成的RSA SHA512签名NCryptSignHash与openssl RSA_签名生成的签名不匹配,openssl,rsa,sign,cng,wincrypt,Openssl,Rsa,Sign,Cng,Wincrypt,我们正在尝试用CNG生成RSA SHA512签名,我们编写了代码并生成了与OpenSSL不匹配的哈希值 用于签名的私钥,我们使用OpenSSL命令以DER格式生成,如下所示 openssl genpkey -out privkey.pem -algorithm rsa openssl pkcs8 -topk8 -inform PEM -outform DER -in privkey.pem -out privkey.der -nocrypt openssl rsa -in privkey.pem

我们正在尝试用CNG生成RSA SHA512签名,我们编写了代码并生成了与OpenSSL不匹配的哈希值

用于签名的私钥,我们使用OpenSSL命令以DER格式生成,如下所示

openssl genpkey -out privkey.pem -algorithm rsa
openssl pkcs8 -topk8 -inform PEM -outform DER -in privkey.pem -out privkey.der -nocrypt
openssl rsa -in privkey.pem -pubout -outform DER -out pubkey.der
使用以下代码使用Windows CNG生成签名:

#包括
#包括
#包括
#pragma注释(lib,“crypt32”)
#pragma注释(lib,“ncrypt.lib”)
#包括
无效的
isi_hextump(常量字符*msg,常量无符号字符*in,无符号整数len)
{
printf(“%s[%d][”,msg,len);
对于(;len>0;len--,在++中){
printf(“%02X”,*in);
}
printf(“]\n”);
}
静态整数
readBinFile(无符号字符**缓冲区,字符*文件,长*大小)
{
文件*fp;
尺寸(t foo);;
printf(“\n在readBinFile中”);
fp=fopen(文件“rb”);
如果(fp==NULL){
printf(“错误:读取文件%s\n”,文件);
返回-1;
}
fseek(fp,0,SEEK_END);
*尺寸=ftell(fp);
fseek(fp,0,SEEK_集);
*缓冲区=malloc(*大小);
如果((foo=fread(*缓冲区,1,*大小,fp))!=*大小)
{
printf(“错误:将文件读取到缓冲区%s:%ld\n”,文件,*大小);
返回-1;
}
printf(“\n退出readBinFile”,*缓冲区);
isi_hextump(“Pavan char at:”,*缓冲区,*大小);
返回0;
}
NTSTATUS
计算哈希(
_In_读取字节(数据长度)
PBYTE数据,
_在DWORD数据长度中,
_输出结果由缓冲区输出(数据摘要长度指针)
PBYTE*数据摘要指针,
_Out_uuDWORD*数据摘要长度指针
)
{
非关税国家地位;
BCRYPT_ALG_HANDLE HashAlgHandle=NULL;
BCRYPT\u HASH\u HANDLE HashHandle=NULL;
PBYTE HashDigest=NULL;
DWORD哈希长度=0;
DWORD ResultLength=0;
*DataDigestPointer=NULL;
*DataDigestLength指针=0;
//
//打开哈希算法句柄
//
Status=bcryptoppenalgorithmprovider(
&哈沙尔甘德尔,
BCRYPT_算法,
无效的
0);
如果(状态)
{
}
//
//计算散列的长度
//
Status=BCryptGetProperty(
哈沙尔甘德尔,
b crypt_HASH_长度,
(PBYTE)和长度,
sizeof(长度),
&结果长度,
0);
如果(状态)
{
}
//在堆上分配哈希缓冲区
HashDigest=(PBYTE)HeapAlloc(GetProcessHeap(),0,HashDigestLength);
if(NULL==HashDigest)
{
printf(“\n无内存”);
状态=状态\无\内存;
}
//
//创建一个散列
//
状态=BCryptCreateHash(
哈沙尔甘德尔,
&哈希句柄,
无效的
0, 
无效的
0, 
0);
如果(状态)
{
}
//
//散列数据
//
状态=BCryptHashData(
哈希句柄,
(b)数据,
数据长度,
0);
/*状态=BCryptHashData(
哈希句柄,
(b)数据,
sizeof(数据),
0); */
如果(状态)
{
}
//
//关闭散列
//
状态=BCryptFinishHash(
哈希句柄,
哈什文摘,
长度,
0);
如果(状态)
{
}
isi_hextump(“摘要:”,HashDigest,HashDigestLength);
*DataDigestPointer=HashDigest;
HashDigest=NULL;
*DataDigestLength指针=HashDigestLength;
状态=0;
清理:
if(NULL!=HashDigest)
{
HeapFree(GetProcessHeap(),0,HashDigest);
HashDigest=NULL;
}
if(NULL!=哈希句柄)
{
状态=BCryptDestroyHash(HashHandle);
HashHandle=NULL;
}
if(NULL!=HashAlgHandle)
{
BCryptCloseAlgorithmProvider(HashAlgHandle,0);
}
返回状态;
}
int main()
{
长期私有化=0;
无符号字符*privkey=NULL;
if(readBinFile(&privkey,&privkey.der,&privksize)!=0)
返回1;
CRYPT_DECODE_PARA DECODE_PARA={0,0,0};
BCRYPT_RSAKEY_BLOB*rsa_private_key=NULL;
DWORD rsa_私钥_大小=0;
BOOL ret_val=FALSE;
PCRYPT_PRIVATE_KEY_INFO PrivateKeyInfo;
ret_val=CryptDecodeObjectEx(X509 ASN_编码| PKCS_7 ASN_编码,
PKCS_私钥_密钥_信息,
私钥,
私有化,
CRYPT_DECODE_ALLOC_标志| CRYPT_DECODE_NOCOPY_标志,
0,
(无效**)和PrivateKeyInfo,
&rsa_私钥_密钥_大小);
如果(!ret_val)
{
printf(“\nCryptDecodeObjectEx()失败:状态,ret val”,GetLastError(),ret_val);
}
其他的
{
printf(“\nCryptDecodeObjectEx()成功:状态,返回值”,GetLastError(),返回值);
}
ret_val=CryptDecodeObjectEx(X509 ASN_编码| PKCS_7 ASN_编码,
CN