测试数据链接:
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);
}
This example digests the data ``Test Message\n'' and ``Hello World\n'', using the digest name passed on the command line.
#include <stdio.h>
#include <openssl/evp.h>
main(int argc, char *argv[])
{
EVP_MD_CTX *mdctx;
const EVP_MD *md;
char mess1[] = "Test Message\n";
char mess2[] = "Hello World\n";
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len, i;
OpenSSL_add_all_digests();
if(!argv[1]) {
printf("Usage: mdtest digestname\n");
exit(1);
}
md = EVP_get_digestbyname(argv[1]);
if(!md) {
printf("Unknown message digest %s\n", argv[1]);
exit(1);
}
mdctx = EVP_MD_CTX_create();
EVP_DigestInit_ex(mdctx, md, NULL);
EVP_DigestUpdate(mdctx, mess1, strlen(mess1));
EVP_DigestUpdate(mdctx, mess2, strlen(mess2));
EVP_DigestFinal_ex(mdctx, md_value, &md_len);
EVP_MD_CTX_destroy(mdctx);
printf("Digest is: ");
for(i = 0; i < md_len; i++) printf("%02x", md_value[i]);
printf("\n");
}
#include <openssl/rsa.h>
#include <openssl/evp.h>
//////////////////////////////////////////////////////
void OpenSSL_Test_SHA1(void)
{
const EVP_MD* algrothm = EVP_sha1();
EVP_MD_CTX mdctx;
BYTE file[6] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x36};
BYTE signValue[128] = {0};
UINT signLen = 0;
EVP_MD_CTX_init(&mdctx);
EVP_DigestInit_ex(&mdctx, EVP_sha1(), NULL);
EVP_DigestUpdate(&mdctx, file, 6);
EVP_DigestFinal_ex(&mdctx, signValue, &signLen);
printf("%s:%d %s\n", __FILE__, __LINE__, __FUNCTION__);
PrintHexBuffer(signValue, signLen);
//7C4A8D09CA3762AF61E59520943DC26494F8941B
}