Sta*_*lav 5 openssl cryptography rsa cryptoapi mscapi
我使用makecert实用程序生成了带私钥的X509证书
makecert -n "CN=RootCATest" -r -sv RootCATest.pvk RootCATest.cer
makecert -sk MyKeyName -iv RootCATest.pvk -n "CN=tempCert" -ic RootCATest.cer -sr currentuser -ss my -sky signature —pe
Run Code Online (Sandbox Code Playgroud)
然后我用OpenSSL将RootCATest.pvk转换为RootCATest.pem.我提取了公钥:pubRootCATest.pem
我有一个名为'msg'的小文件.我使用SHA1签署此文件.
openssl dgst -sha1 -sign c:\RootCATest.pem -out c:\openssl c:\msg
Run Code Online (Sandbox Code Playgroud)
然后我想使用MS CryptoAPI获得相同的数字签名.
这是我的代码(注意:这是理解概念的代码所以我没有释放分配的内存)
void SwapBytes(BYTE *pv, int n)
{
BYTE *p = pv;
int lo, hi;
for(lo=0, hi=n-1; hi>lo; lo++, hi--)
{
BYTE tmp=p[lo];
p[lo] = p[hi];
p[hi] = tmp;
}
}
void sign()
{
FILE *file;
BYTE *msg;
int msg_size;
HCRYPTPROV hProv;
HCERTSTORE hStore;
PCCERT_CONTEXT pCert;
DWORD dwKeySpec;
BOOL fCallerFreeProv;
BYTE *pSignature;
DWORD sigLen;
// Read message bytes from file
file = fopen("c:\\msg", "r");
fseek(file, 0, SEEK_END);
msg_size = ftell(file);
fseek(file, 0, SEEK_SET);
msg = new BYTE[msg_size];
fread(msg, sizeof(BYTE), msg_size, file);
fclose(file);
hStore = CertOpenSystemStore(NULL, "My");
pCert = CryptUIDlgSelectCertificateFromStore(hStore, NULL, NULL, NULL, 0, 0, NULL);
CryptAcquireCertificatePrivateKey(pCert, CRYPT_ACQUIRE_COMPARE_KEY_FLAG, NULL, &hProv, &dwKeySpec, &fCallerFreeProv);
PrintCryptoProviderName(hProv); // prints Microsoft Strong Cryptographic Provider
ALG_ID hashAlgId = CALG_SHA1;
HCRYPTHASH hHash;
CryptCreateHash(hProv, CALG_SHA1, 0, 0, &hHash);
CryptHashData(hHash, msg, msg_size, 0);
CryptSignHash(hHash, dwKeySpec, NULL, 0, NULL, &sigLen);
pSignature = new BYTE[sigLen];
CryptSignHash(hHash, dwKeySpec, NULL, CRYPT_NOHASHOID, pSignature, &sigLen);
SwapBytes(pSignature, sigLen); // Here i reverse byte order as I read that MS CryptoAPI uses reversed byte order
// Write signature bytes to file
file = fopen("c:\\CryptSignHash", "w");
fwrite(pSignature, sizeof(BYTE), sigLen, file);
fclose(file);
}
Run Code Online (Sandbox Code Playgroud)
作为输出,我得到的签名与OpenSSL签名完全不同.我怎样才能获得相同的签名?
我认为有一些时刻需要注意:
我怎样才能获得相同的签名?
大多数数字签名算法(包括 RSA,我想您已经在这里使用过)都是不确定的。尝试使用同一个程序对同一个文件进行两次签名,您将得到不同的输出。
这意味着,使用相同的输入运行相同的算法两次将给出不同的签名。这不是问题,只要验证算法仍然设法接受签名算法生成的所有签名(使用合适的密钥)。
这种非确定性对于签名方案的安全性实际上通常是必要的。
要查看两种签名算法是否确实兼容,请尝试使用 MS Crypto API 验证 OpenSSL 签名,并使用 OpenSSL 验证 MS Crypto 签名。(然后将文件修改一个字节并检查它们是否不再验证。)
归档时间: |
|
查看次数: |
1840 次 |
最近记录: |