#include <wincrypt.h>
void MSCrptAPIGenFileSignatue_byFileHash(CONST PBYTE pbyFileHashData,
CONST DWORD dwHashDataSize,)
{
//Signature method1: Sign Hash Data
DWORD dwProvType = PROV_RSA_AES;
//#define CALG_SHA_256 (ALG_CLASS_HASH | ALG_TYPE_ANY | ALG_SID_SHA_256)
//#define ALG_SID_SHA_256 12
ALG_ID hashAlgo = ALG_CLASS_HASH | ALG_TYPE_ANY | 12;//CALG_SHA_256 compile error ??????????
if (AlgorithmType_SHA1 == emAlgorithmType)
{
dwProvType = PROV_RSA_FULL;
hashAlgo = CALG_SHA1;
}
if( !CryptAcquireContextA( &hProv, "SAIO_CERT", NULL, dwProvType, 0) )
{
if( !CryptAcquireContextA( &hProv, "SAIO_CERT", NULL,dwProvType, CRYPT_NEWKEYSET))
{
dwRet = ERR_HSM_SIGN_DATA;
goto END;
}
}
WriteBufferToFile("HashData.bin", pbyFileHashData, dwHashDataSize);
//ReverseBuffer(pbyFileHashData, dwHashDataSize);
//WriteBufferToFile("HashData2.bin", pbyFileHashData, dwHashDataSize);
if (!CryptCreateHash(hProv, hashAlgo, 0, 0, &hHash))
{
dwRet = ERR_HSM_SIGN_DATA;
goto END;
}
if (!CryptSetHashParam(hHash, HP_HASHVAL, pbyFileHashData, 0))
{
dwRet = ERR_HSM_SIGN_DATA;
goto END;
}
BYTE byTempPrivateKeyBuffer[PRIVATE_KEY_4096_SIZE] = {0};
DWORD dwPrivteSize = sizeof(byTempPrivateKeyBuffer);
string strPrvKeyFileName = "..\\Data\\Sign\\Input\\";
strPrvKeyFileName += lpHSMKeyName;
//Read private key buffer from file
ReadBufferFromFile(strPrvKeyFileName.c_str(), byTempPrivateKeyBuffer, &dwPrivteSize);
if (!CryptImportKey(hProv, byTempPrivateKeyBuffer, dwPrivteSize, 0, 0, &hKey))
{
dwRet = ERR_HSM_SIGN_DATA;
goto END;
}
if (!CryptSignHash(hHash, AT_SIGNATURE, NULL, NULL, NULL, pdwSignatureDataSize))
{
dwRet = ERR_HSM_SIGN_DATA;
goto END;
}
if (!CryptSignHash(hHash, AT_SIGNATURE, NULL, NULL, pbySignatureData, pdwSignatureDataSize))
{
dwRet = ERR_HSM_SIGN_DATA;
goto END;
}
ReverseBuffer(pbySignatureData, *pdwSignatureDataSize);
WriteBufferToFile("File_Data.sign", pbySignatureData, *pdwSignatureDataSize);
}
void MSCrptAPIGenFileSignatue_byFile()
{
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);
}
//----------------------------------------------------------------
// 4. Import Private Key to CSP.
// The return hKey is not used here.
dwRet = ImportCryptKey(hProv, m_cPrivateKeyBuffer.GetBuffer(), m_cPrivateKeyBuffer.GetLength(), &hKey);
if (dwRet != ERR_OK)
{
goto END;
}
//----------------------------------------------------------------
// 5. Sign hash and then write the signed hash (digital signature)
// to Certificate buffer (Cert)
//
// Here we sign hash instead of data (cTempBuf).
// Because all signature algorithms are asymmetric and thus slow,
// the CryptoAPI does not allow data to be signed directly.
// Instead, data is first hashed and CryptSignHash is used to sign the hash.
dwBufferLen = 0;
if (!CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, NULL, &dwBufferLen))
{
dwRet = ERR_SIGN_HASH;
goto HashExit;
}
if (!CryptSignHash(hHash, AT_SIGNATURE,NULL, 0, m_cSaioCert.sign, &dwBufferLen))
{
dwRet = ERR_SIGN_HASH;
goto HashExit;
}
if (dwBufferLen > MAX_SIGN_LEN)
{
dwRet = ERR_SIGN_HASH;
goto HashExit;
}
HashExit:
if (hKey != NULL)
{
CryptDestroyKey(hKey);
}
if (hHash != NULL)
{
CryptDestroyHash(hHash);
}
if (hProv != NULL)
{
CryptReleaseContext(hProv, 0);
}
return bRet;
}
分享到:
相关推荐
VC++中调用微软Crypt API 加密
在Delphi编程中,我们可以直接调用这个API来实现对文件签名的验证。 要使用`WinVerifyTrust`,首先需要包含相关的Windows头文件,如`wintrust.h`。但在Delphi中,通常我们会依赖第三方库,例如本例中提到的`JEDI ...
// 文件签名有效 } return 0; } ``` 以上代码展示了如何使用`WinVerifyTrust`函数来验证文件的微软数字签名。注意,实际开发中,你需要处理各种错误情况,例如证书无效、签名不正确等,并可能需要添加用户界面...
在给PE文件添加数字签名的过程中,通常需要编写特定的代码来调用Windows API函数,如` Crypt32.dll`库中的函数,如`CryptSignMessage`和`CryptVerifyMessageSignature`等。 在提供的压缩包文件名列表中,我们可以...
在C++中获取PE(Portable Executable)文件签名是一个涉及Windows API调用和二进制文件解析的过程。PE文件格式是Windows操作系统中的可执行文件和动态链接库(DLL)的标准格式。PE文件签名用于验证软件的来源和完整...
在易语言中,处理PE(Portable Executable)文件签名验证是一个重要的任务,这涉及到软件的安全性和可信度。PE文件是Windows操作系统下的可执行文件格式,包括.exe和.dll等类型。验证PE文件签名可以确保文件未被篡改...
3. **获取文件哈希**:在验证签名之前,先计算待验证文件的哈希值。哈希函数(如SHA-1或SHA-256)会将文件内容转换为固定长度的摘要,用于比较签名中的哈希值。 4. **解密签名**:使用证书的公钥解密数字签名。解密...
在这个DEMO中,开发者使用C语言编写了代码来调用SQLite的API,实现了对数据库文件的加密和解密功能。 首先,我们需要理解SQLite的加密机制。SQLite提供了一种称为SQLite Encryption Extension (SEE) 的加密方案,它...
AR Crypt是一款数据加密工具,主要用于保护用户的文件和数据安全。这款软件的核心功能是对文件进行加密,确保只有拥有正确密钥的人才能访问这些内容。在"AR Crypt.rar"这个压缩包中,包含的主要文件是"AR Crypt.exe...
Linux加密文件系统(Crypt-FS)是针对物理安全问题而设计的一种技术,旨在保护存储在计算机中的敏感数据免受未经授权的访问。当操作系统允许通过软盘或其他启动媒介引导时,物理接触计算机的攻击者可以绕过正常的...
CRYPT32提供了API,使得开发者可以利用它来实现对字符串的安全操作,包括但不限于RSA、DES、AES等加密算法。 "不可视构件"和"控件"通常是指在图形用户界面(GUI)开发中,那些不直接显示在屏幕上的组件。虽然CRYPT...
除了基本的加密功能,CryptCD 5.0 还可能包含其他高级安全特性,如数字签名、访问权限控制、防止屏幕捕获等,以满足企业用户对于不同安全等级的需求。这些特性为企业提供了全面的数据保护策略,防止敏感信息泄露。 ...
#pragma comment( lib, "Dnsapi.lib" ) #pragma comment( lib, "Secur32.lib" ) #pragma comment( lib, "Crypt32.lib" ) #pragma comment( lib, "ws2_32.lib" )
它提供了丰富的API,允许开发者选择不同的加密算法,如AES(高级加密标准)、RSA(公钥加密技术)等,以满足不同场景的安全需求。 Lib Sodium,另一方面,是一个现代的、易于使用的密码学库,旨在简化安全编码。它...
SQLite Crypt的工作原理是在数据写入数据库时对其进行加密,并在读取时解密,确保即使数据库文件被窃取,其中的内容也无法被轻易解读。 在使用SQLite Crypt时,首先要了解它的加密算法。通常,它会采用先进的加密...
Windows API提供了一套名为“Crypt32.dll”的动态链接库,其中包含了一些用于加密和解密的函数,如` CryptCreateHash`, `CryptHashData`, `CryptGetHashParam`等,这些可以用来实现MD5哈希计算。 以下是使用VB6.0...
CryptoAPI是微软Windows操作系统中用于加密、解密和数字签名的核心组件,它为开发者提供了丰富的接口,以便在应用程序中实现安全功能。在这个项目中,我们主要关注的是如何使用CryptoAPI来处理证书操作,包括创建根...
4. **代码签名API**:在Windows中,如`WinVerifyTrust`或`Crypt32.dll`库中的函数,用于实现数字签名的验证。这些API会处理所有的细节,包括证书验证、哈希计算和密钥操作。 5. **事件查看器日志**:在验证过程中,...
在实际应用中,Cl_crypt32.pas模块可能被用于保护用户数据、网络通信的保密性、数字签名验证等方面。例如,在网络传输中,敏感信息如用户名、密码等可以使用该模块加密后再发送,以防止数据在传输过程中被窃取。此外...
在Linux系统中,`/etc/shadow`文件包含了用户的加密密码,`crypt-md5`生成的hash值就保存在这个文件中。当用户尝试登录时,系统会使用`crypt`函数和用户输入的密码尝试解密`/etc/shadow`中的hash值,如果匹配成功,...