[OpenSSL][原]获得文件签名

测试数据链接:[url]http://jacky-dai.iteye.com/admin/blogs/1743774[/url]


#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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值