`

[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
}
分享到:
评论

相关推荐

    openssl win x64

    例如,你可以使用 OpenSSL 的 API 来创建自签名证书,进行数据加解密,或者在应用程序中实现 HTTPS 连接。 总的来说,OpenSSL 在 Windows x64 平台上的编译和使用是一项关键的任务,它为开发者提供了强大的加密功能...

    delphi7调用openssl修正版

    原版存在接口不匹配和版本过低的问题,这些问题在修正版中得到了修复,升级了OpenSSL到1.0.1b版本。在OpenSSL的不同版本中,其内部结构和API可能会有所调整,因此,当升级版本时,必须确保Delphi的封装代码与新版本...

    openssl-patch.rar

    标题“openssl-patch.rar”指的是一个修复OpenSSL的补丁文件,特别针对Windows XP操作系统。在Windows XP系统中,由于其原始代码自带的数字证书可能已经过期,这可能导致在编译新代码或安装某些软件时遇到问题。...

    android-openssl

    Android OpenSSL 是一个专门为Android平台定制的OpenSSL库,它包含了OpenSSL的源代码以及使用NDK(Native Development Kit)编译后的二进制文件。OpenSSL是一个强大的安全套接层(SSL/TLS)协议实现,同时也包括了...

    [Open SSL[原]]获得文件信息摘要

    标题中的“OpenSSL[原]获得文件信息摘要”指的是使用OpenSSL库来获取文件的哈希摘要信息。OpenSSL是一个强大的安全套接层(SSL)和传输层安全(TLS)协议实现,同时也包含了一些用于加密、解密、生成摘要以及数字...

    openssl-1.0.2l及Perl编译工具

    2. **获取OpenSSL源码**:解压openssl-1.0.2l.tar.gz文件,得到openssl-1.0.2l源代码目录。这个目录应该包含了一系列的源代码文件和构建脚本。 3. **配置环境**:打开命令提示符,进入openssl-1.0.2l源代码目录。...

    Delphi 原生实现SM2加解密 压缩 解压缩

    在IT行业中,加密技术是确保数据安全的重要手段之一,而SM2算法作为我国自主研发的公钥密码算法,因其高效性和安全性,在很多领域得到了广泛应用。本文将深入探讨如何使用Delphi原生实现SM2加解密以及压缩解压缩的...

    python-3.8.0-embed-amd64.zip

    4. `libcrypto-1_1.dll` 和 `libssl-1_1.dll`:这些是OpenSSL库的动态链接文件,用于加密和安全套接层(SSL)通信。它们对于Python进行HTTPS请求和其他加密操作至关重要。 5. `sqlite3.dll`:这是SQLite数据库引擎...

    indy 10.5.8.rar

    这两个文件是OpenSSL库的一部分,用于实现加密和安全套接层(SSL/TLS)协议,是HTTPS安全通信的核心组件。在访问使用HTTPS的网站时,这些文件是必不可少的,因为它们提供了必要的加密算法和证书验证功能。没有它们,...

    pki考试题目.docx

    一、论述题(40 分):以文件网络传输的安全性分析为例,阐述PKI系统产生的必要性与基本技术特点分析。 随着网络的发展,信息安全已成为焦点问题之一,尤其是网上支付和网络银行对信息安全的要求显得更为突出。为了...

    SHA-256算法的C++实现及demo

    这种算法的设计目的是为数据提供不可逆的、唯一的标识,常用于验证数据完整性、数字签名和加密证书等场景。 在C++中实现SHA-256算法,你需要理解以下几个关键步骤: 1. **初始化哈希值**:SHA-256算法开始时会使用...

Global site tag (gtag.js) - Google Analytics