`

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

 
阅读更多
#include <openssl/rsa.h>
#include <openssl/evp.h>
#pragma comment(lib, "libeay32.lib")

DWORD ReadBufferFromFile(LPCSTR lpFileName, PBYTE pBuffer, PDWORD pdwLength)
{
    if (NULL == lpFileName
        || NULL == pBuffer
        || NULL == pdwLength)
    {
        return -1;
    }

    //----------------------------------------------------------------
    // 0. Local variables declaration
    DWORD nbytes = 0;
    HANDLE hFile = NULL;
    DWORD dwBufferLen = *pdwLength;
    DWORD dwFileLen = 0;

    //----------------------------------------------------------------
    // 1. Read certificate to buff
    //    This certificate contains certificate info (CI) and digital signature (DS)
    hFile = CreateFileA(lpFileName, GENERIC_READ, 0, NULL,
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );

    if (hFile == INVALID_HANDLE_VALUE) 
    {
        return -1;
    }

    dwFileLen = GetFileSize(hFile, NULL);
    *pdwLength = dwFileLen;

    if (dwBufferLen >= dwFileLen)
    {
        ReadFile(hFile, pBuffer, dwFileLen, &nbytes, NULL);
    }
    else
    {
        if (hFile != NULL)
        {
            CloseHandle(hFile);
        }

        return -1;
    }

    if (hFile != NULL)
    {
        CloseHandle(hFile);
    }

    return 0;
}

void FlipBuffer(unsigned char *pBuf, unsigned long ulLen)
{
    if(0 == ulLen)
    {
        return;
    }

    //char tmp;
    unsigned char ucTemp;
    for(unsigned long i = 0; i < ulLen >> 1; ++i)
    {
        ucTemp = pBuf[i];
        pBuf[i] = pBuf[ulLen - i - 1];
        pBuf[ulLen - i - 1] = ucTemp;
    }
}

void MSkeyConvertToOpenSSLKey(const char* filename, RSA& Rsa)
{
    if (NULL == filename)
    {
        return;
    }

    unsigned char byPrivateKeyBlob[2324] = {0};
    DWORD dwPrvKeySize = sizeof(byPrivateKeyBlob);
    ReadBufferFromFile(filename, byPrivateKeyBlob, &dwPrvKeySize);

    BYTE *pszPubBlob = byPrivateKeyBlob;
    RSAPUBKEY *rsapubkey = reinterpret_cast<RSAPUBKEY *>(pszPubBlob + sizeof(PUBLICKEYSTRUC));

    BYTE *pE = (BYTE *)&(rsapubkey->pubexp);
    DWORD dwElen = sizeof(DWORD);

    DWORD dwModulusLen = rsapubkey->bitlen / 8;
    DWORD dwPrimeLen = rsapubkey->bitlen/16;
    BYTE *pOffset = pszPubBlob + sizeof(BLOBHEADER) + sizeof(RSAPUBKEY);

    BYTE *pN = pOffset;
    pOffset += dwModulusLen;

    BYTE *pP = pOffset;
    pOffset += dwPrimeLen;

    BYTE *pQ = pOffset;
    pOffset += dwPrimeLen;

    BYTE *pP1 = pOffset;
    pOffset += dwPrimeLen;

    BYTE *pQ1 = pOffset;
    pOffset += dwPrimeLen;

    BYTE *pPQ = pOffset;
    pOffset += dwPrimeLen;

    BYTE *pD = pOffset;
    pOffset += dwModulusLen;

    FlipBuffer(pE, dwElen);
    FlipBuffer(pN, dwModulusLen);
    FlipBuffer(pP, dwPrimeLen);
    FlipBuffer(pQ, dwPrimeLen);
    FlipBuffer(pP1, dwPrimeLen);
    FlipBuffer(pQ1, dwPrimeLen);
    FlipBuffer(pPQ, dwPrimeLen);
    FlipBuffer(pD, dwModulusLen);

    while(0x00 == *pE)
    {
        pE = pE + 1;
        dwElen = dwElen - 1;
    }
    BIGNUM *pBE = BN_new();
    pBE = BN_bin2bn(pE, dwElen, pBE);

    BIGNUM *pBN = BN_new();
    pBN = BN_bin2bn(pN, dwModulusLen, pBN);

    BIGNUM *pBP = BN_new();
    pBP = BN_bin2bn(pP, dwPrimeLen, pBP);

    BIGNUM *pBQ = BN_new();
    pBQ = BN_bin2bn(pQ, dwPrimeLen, pBQ);

    BIGNUM *pBP1 = BN_new();
    pBP1 = BN_bin2bn(pP1, dwPrimeLen, pBP1);

    BIGNUM *pBQ1 = BN_new();
    pBQ1 = BN_bin2bn(pQ1, dwPrimeLen, pBQ1);

    BIGNUM *pBPQ = BN_new();
    pBPQ = BN_bin2bn(pPQ, dwPrimeLen, pBPQ);

    BIGNUM *pBD = BN_new();
    pBD = BN_bin2bn(pD, dwModulusLen, pBD);

    Rsa.n = pBN;
    Rsa.e = pBE;
    Rsa.p = pBP;
    Rsa.q = pBQ;
    Rsa.dmp1 = pBP1;
    Rsa.dmq1 = pBQ1;
    Rsa.iqmp = pBPQ;
    Rsa.d = pBD;
}

void OpenSSLGenFileHash()
{
    RSA* rsa = RSA_new();
    MSkeyConvertToOpenSSLKey("Test_1024_Key.prv", *rsa);

    const EVP_MD* algrothm = EVP_sha1();
    EVP_MD_CTX mdctx;
    EVP_MD_CTX_init(&mdctx);
    EVP_DigestInit_ex(&mdctx, algrothm, NULL);

    byte file[512] = {0};
    DWORD dwFileSize = sizeof(file);
    ReadBufferFromFile("PublicKey.bin", file, &dwFileSize);

    EVP_DigestUpdate(&mdctx, file, dwFileSize);

    BYTE signValue[128] = {0};
    UINT signLen = 0;
    EVP_DigestFinal_ex(&mdctx, signValue, &signLen);

    EVP_MD_CTX_cleanup(&mdctx);

    RSA_free(rsa);
}
分享到:
评论

相关推荐

    openSSL open source for SSL

    "openSSL open source for SSL" 的标题明确指出 OpenSSL 是一个开放源代码的解决方案,专为 SSL 和 TLS 协议设计。 SSL(Secure Socket Layer)是早期的网络通信加密标准,而 TLS(Transport Layer Security)是其...

    opensll 加密解密

    OpenSSL 是一个强大的安全套接层(SSL/TLS)和通用加密库,广泛应用于网络通信、数据保护以及安全相关的软件开发。它包含了多种加密算法、常用的哈希函数以及证书管理功能,使得开发者能够轻松实现数据的加密解密、...

    OpenAS2是EDIINT AS2标准的一个基于java的实现,它的目的是作为一个服务器使用,它是非常可配置的,并支.zip

    1. **安全传输**:OpenAS2支持使用SSL/TLS协议进行端到端的数据加密,保护信息在传输过程中的安全,防止被窃听或篡改。 2. **数字签名**:通过MD5或SHA-1等哈希算法生成的消息摘要与文件一起发送,接收方可以通过...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出...

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包2

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包3

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    java源码包4

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    摘要:Java源码,文件操作,数据压缩,文件传输 Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出...

    openssl之EVP系列

    **信息摘要算法**的`digest.c`文件和`m_*.c`文件组成了EVP系列的信息摘要功能,支持MD5、SHA1等多种摘要算法。 **信息编码算法**的`encode.c`文件提供了ASCII和二进制之间的转换,这对于网络传输中数据格式的标准化...

    MD5加密算法.zip

    因此,对于需要高度安全性的场合,如数字签名和SSL证书,MD5已被更安全的算法如SHA-256取代。 5. **替代方案** 为了克服MD5的局限,现在推荐使用更强的哈希函数,如SHA-2系列(SHA-256、SHA-512等)。这些算法提供...

    python实现ftp文件传输功能

    Python FTP文件传输功能涉及的主要知识点包括FTP协议、Python的socket编程、文件操作以及数据完整性校验。...- 安全性:使用更安全的SFTP(SSH文件传输协议)或FTPS(FTP over TLS/SSL)代替纯FTP,保护数据安全。

    HAMC.zip_HAMC_OPENSLL HMAC_hmac openssl vc6.0_openssl HMAC-SHA1_

    HMAC-SHA1是使用SHA1哈希函数的特定实现,SHA1是一种广泛使用的哈希函数,能对任意长度的信息产生160位的摘要值。 在OpenSSL库中,HMAC功能由`HMAC_CTX`结构体和相关API提供。在VC6.0环境下,我们需要先下载并安装...

    BouncyCastle依赖.zip

    - **OpenPGP支持**:BouncyCastle还支持OpenPGP标准,可以用于实现端到端加密和身份验证。 使用BouncyCastle时,需要注意兼容性和版本问题,因为不同版本的BouncyCastle可能对某些算法的支持程度不同。在Android中...

    requests-2.11.0

    10. **文件上传**:在POST请求中,可以使用`files`参数来上传文件,例如`requests.post(url, files={'file': open('filename', 'rb')})`。 11. **SSL/TLS安全**:requests库默认启用安全套接层(SSL/TLS),并支持...

    Windows版OpenSSL1.0工具与开发库

    2. **开发库**:`lib`目录中的库文件(.lib和.dll)是用于在Windows平台下开发支持SSL/TLS的应用程序的。开发者可以通过这些库链接到他们的C或C++项目中,实现网络通信的安全加密。例如,`libeay32.lib`和`ssleay32....

    openssl编程手册

    - **创建数据库**: `NDBM_open`。 - **插入数据**: `NDBM_insert`。 - **查找数据**: `NDBM_fetch`。 **10.4 编程示例** - **示例**: 创建数据库、插入数据、查找数据等。 #### 十一、大数 **11.1 介绍** - **...

    requests-1.2.0.tar.gz

    5. **文件上传**:通过提供file-like对象,可以方便地将文件上传到服务器,例如`files={'file': open('myfile.txt', 'rb')}`。 6. **自动处理重定向**:requests库会自动处理HTTP状态码为3xx的重定向,除非你手动...

    bcprov-jdk15on 合计

    Bouncy Castle是一个开放源代码的安全项目,提供了一整套安全服务,包括加密算法、证书和证书路径验证、SSL/TLS协议以及PKCS#7、PKCS#12、OpenPGP等格式的支持。它是Java社区中广泛使用的加密库,因为它的实现通常比...

Global site tag (gtag.js) - Google Analytics