[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);
}

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
}

猜你喜欢

转载自jacky-dai.iteye.com/blog/1744159