`

[MS Crypt API][原]计算文件hashParam

 
阅读更多
#define    SAIO_CSP                              "SAIO SignCSP"

typedef enum  Em_Algorithm_TYPE
{
    AlgorithmType_SHA1    = 1,
    AlgorithmType_SHA256  = 2
}ALGORITHM_TYPE, *PALGORITHM_TYPE;


BOOL GetFileHashParam(LPCSTR lpszCataFileName, PBYTE pbyHash, PDWORD pdwHashLen, ALGORITHM_TYPE emAlAlgorithmType)
{
    BOOL bRet = FALSE;
    HCRYPTPROV hProv = 0;
    HCRYPTHASH hHash = 0;
    HCRYPTKEY hKey = 0;
    HANDLE hFile = NULL;
    DWORD dwFileSize = 0, len;
    BYTE byTempBuf[2049] = {0};

    hFile = CreateFile(lpszCataFileName, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (INVALID_HANDLE_VALUE == hFile)
    {
        return FALSE;
    }

    DWORD  dwProvType = PROV_RSA_AES;
    ALG_ID hashAlgo = CALG_SHA_256;
    if (AlgorithmType_SHA1 == emAlAlgorithmType)
    {
        dwProvType = PROV_RSA_FULL;
        hashAlgo = CALG_SHA1;
    }

    if (!CryptAcquireContext(&hProv, SAIO_CSP, NULL, dwProvType, 0)) 
    {
        if (GetLastError() == NTE_BAD_KEYSET)
        {
            if(!CryptAcquireContext(&hProv,SAIO_CSP,NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET)) 
            {
                goto HashExit;
            }
        }
    }

    // 
    //     Create a hash object.
    //     
    DWORD dwError = 0;
    if ( !CryptCreateHash(hProv, hashAlgo ,0 ,0 ,&hHash))
    {
        dwError = GetLastError();
        goto HashExit;
    }

    dwFileSize = GetFileSize(hFile, NULL);
    while(dwFileSize != 0)
    {
        bRet = ReadFile(hFile, byTempBuf, 2048, &len, NULL);
        // 
        //     Check for end of file. 
        //     
        if (bRet && len==0)
        {
            break;
        }

        CryptHashData(hHash, byTempBuf, len, 0);
        dwFileSize -= len;
    }

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

    len = 0;
    DWORD dwCount = sizeof(DWORD);
    if(!CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)pdwHashLen, &dwCount, 0))
    {
        *pdwHashLen = 0;
    }
    else
    {
        if (!CryptGetHashParam(hHash, HP_HASHVAL, pbyHash, pdwHashLen, 0))
        {
            *pdwHashLen = 0;
        }
    }

    if (*pdwHashLen != 20
        && *pdwHashLen != 32)
    {
        bRet = FALSE;
    }

HashExit:  
    if (hKey != NULL)
    {
        CryptDestroyKey(hKey);
    }

    if (hHash != NULL)
    {
        CryptDestroyHash(hHash);
    }

    if (hProv != NULL)
    {
        CryptReleaseContext(hProv, 0);
    }

    return bRet;
}
分享到:
评论

相关推荐

    Crypt API例子代码

    VC++中调用微软Crypt API 加密

    SQLite crypt

    在这个DEMO中,开发者使用C语言编写了代码来调用SQLite的API,实现了对数据库文件的加密和解密功能。 首先,我们需要理解SQLite的加密机制。SQLite提供了一种称为SQLite Encryption Extension (SEE) 的加密方案,它...

    AR Crypt转换

    AR Crypt是一款数据加密工具,主要用于保护用户的文件和数据安全。这款软件的核心功能是对文件进行加密,确保只有拥有正确密钥的人才能访问这些内容。在"AR Crypt.rar"这个压缩包中,包含的主要文件是"AR Crypt.exe...

    Linux加密文件系统_Crypt_FS_丁成1

    Linux加密文件系统(Crypt-FS)是针对物理安全问题而设计的一种技术,旨在保护存储在计算机中的敏感数据免受未经授权的访问。当操作系统允许通过软盘或其他启动媒介引导时,物理接触计算机的攻击者可以绕过正常的...

    vc6编译gloox需要的Dnsapi.lib、Secur32.lib、Crypt32.lib、ws2_32.lib

    #pragma comment( lib, "Dnsapi.lib" ) #pragma comment( lib, "Secur32.lib" ) #pragma comment( lib, "Crypt32.lib" ) #pragma comment( lib, "ws2_32.lib" )

    CryptCD 5.0 企业零售版

    CryptCD 5.0 的一大亮点是它能将加密后的文件伪装成.exe文件。这种伪装技术使得非授权用户即使获取到文件,也难以识别其真实性质,大大提升了数据的安全性。同时,这种伪装方式也降低了被恶意软件或病毒攻击的风险...

    CRYPT32

    CRYPT32提供了API,使得开发者可以利用它来实现对字符串的安全操作,包括但不限于RSA、DES、AES等加密算法。 "不可视构件"和"控件"通常是指在图形用户界面(GUI)开发中,那些不直接显示在屏幕上的组件。虽然CRYPT...

    crypt-md5源代码,这是linux里面最常用密码校验算法,利用salt和password和crypt函数生成hash值

    在Linux系统中,`/etc/shadow`文件包含了用户的加密密码,`crypt-md5`生成的hash值就保存在这个文件中。当用户尝试登录时,系统会使用`crypt`函数和用户输入的密码尝试解密`/etc/shadow`中的hash值,如果匹配成功,...

    VB6.0 MD5加密算法 支持中文(调用Window API计算)

    Windows API提供了一套名为“Crypt32.dll”的动态链接库,其中包含了一些用于加密和解密的函数,如` CryptCreateHash`, `CryptHashData`, `CryptGetHashParam`等,这些可以用来实现MD5哈希计算。 以下是使用VB6.0...

    sqlite crypt支持加密数据库

    SQLite Crypt的工作原理是在数据写入数据库时对其进行加密,并在读取时解密,确保即使数据库文件被窃取,其中的内容也无法被轻易解读。 在使用SQLite Crypt时,首先要了解它的加密算法。通常,它会采用先进的加密...

    crypt_file.rar_文件驱动加密

    本文将深入探讨“crypt_file.rar_文件驱动加密”这一主题,包括其工作原理、应用以及如何进行学习和测试。 首先,我们要理解什么是文件驱动加密。在Windows操作系统中,文件系统过滤驱动(File System Filter ...

    C++使用hookapi操作源代码windows环境

    `filter.ini`, `crypt.ini`, `compress.ini`, `filterfile.ini`, `filtermsg.ini`, 和 `filterhp.ini`这些文件是配置文件,很可能用于定义Hook的规则或者过滤条件。例如,`filterfile.ini`可能包含了文件操作的Hook...

    Cl_crypt32.pas(delphi)加密解密

    《Cl_crypt32.pas Delphi 加密解密模块详解》 在计算机科学领域,数据的安全性至关重要,加密和解密技术就是保障信息安全的重要手段。本文将详细讲解Delphi编程语言中的Cl_crypt32.pas模块,该模块主要用于32位的...

    Crypt-RC4-2.02.tar.gz

    标题 "Crypt-RC4-2.02.tar.gz" 提供了有关文件的基本信息,它是一个使用GNU Tape Archive (GZIP) 压缩格式的文件,其中包含了一个名为 "Crypt-RC4-2.02" 的软件或库。这个版本号(2.02)暗示了这是一个软件的更新...

    Algorithm-windwalker-crypt.zip

    它提供了丰富的API,允许开发者选择不同的加密算法,如AES(高级加密标准)、RSA(公钥加密技术)等,以满足不同场景的安全需求。 Lib Sodium,另一方面,是一个现代的、易于使用的密码学库,旨在简化安全编码。它...

    Linux加密文件系统:Crypt-FS.pdf

    Linux加密文件系统,如Crypt-FS,是一种针对操作系统内核级别的数据保护机制,旨在确保敏感信息在物理层面的安全。在Linux环境下,加密文件系统提供了一种透明的方式,使得用户在正常使用文件系统的同时,数据能够在...

    crypt C++ 库

    由于只给出了一个文件名 "crypt-C++-library",我们可以假设这是库的主文件或者包含库源代码的压缩文件。通常,这样的文件会包含库的所有源代码文件、头文件、编译脚本、示例代码、README文档以及可能的构建系统配置...

    rdp python加密 win32crypt

    rdp python加密脚本 远程桌面通过RDP文件自动登录 此脚本把密码明文加密成密文 用于直接远程连接

    crypt-md5源代码

    crypt-md5源代码,这是linux里面最常用密码校验算法,这里拿出来和大家一起分享

    Git-Crypt-源码.rar

    Git-Crypt是一款强大的工具,它允许在Git仓库中对敏感数据进行加密,同时保持其他文件的版本控制功能不受影响。这个源码压缩包"Git-Crypt-源码.rar"(实际上应该是Git-Crypt-源码.zip)包含了Git-Crypt的源代码,...

Global site tag (gtag.js) - Google Analytics