[OpenSSL][原]获得文件签名
测试数据链接:http://jacky-dai.iteye.com/admin/blogs/1743774
#include <openssl/rsa.h> #include <openssl/evp.h> #pragma comment(lib, "libeay32.lib") void ReverseBuffer(unsigned char *pBuf, unsigned long ulLen){ if(0 == ulLen) { return; } //char tmp; unsigned char ucTemp; for(unsigned long i = 0, j = ulLen-1; i < ulLen/2; i++, j--) { ucTemp = pBuf[i]; pBuf[i] = pBuf[j]; pBuf[j] = ucTemp; }}void OpenSSLGenFileSignature_byFile(){ RSA* rsa = RSA_new(); MSkeyConvertToOpenSSLKey("Test_1024_Key.prv", *rsa); EVP_PKEY *evpKey = EVP_PKEY_new(); //新建一个EVP_PKEY变量 EVP_PKEY_set1_RSA(evpKey, rsa); const EVP_MD* algrothm = EVP_sha1(); EVP_MD_CTX mdctx; EVP_MD_CTX_init(&mdctx); EVP_VerifyInit_ex(&mdctx, algrothm, NULL); byte file[512] = {0}; DWORD dwFileSize = sizeof(file); ReadBufferFromFile("PublicKey.bin", file, &dwFileSize); EVP_SignUpdate(&mdctx, file, dwFileSize); BYTE signValue[128] = {0}; UINT signLen = 0; EVP_SignFinal(&mdctx, signValue, &signLen, evpKey); EVP_MD_CTX_cleanup(&mdctx); EVP_PKEY_free(evpKey); RSA_free(rsa);}void OpenSSLGenFileSignature_byFileHash(){ RSA* rsa = RSA_new(); MSkeyConvertToOpenSSLKey("Test_1024_Key.prv", *rsa); const EVP_MD* algrothm = EVP_sha1(); byte byHashData[32] = {0}; DWORD dwHashSize = sizeof(byHashData); ReadBufferFromFile("HashData.bin", byHashData, &dwHashSize); ReverseBuffer(byHashData, dwHashSize); byte bySignedBuf[512] = {0}; UINT nSignSize = 0; int nRet = RSA_sign(algrothm->type, byHashData, (UINT)dwHashSize, bySignedBuf, &nSignSize, rsa); RSA_free(rsa);}