使用OpenSSL API实现Windows CryptoAPI CryptoderiveKey
我有一个使用AES-128加密/解密给定数据的加密API代码,以及一个使用SHA-256从密码派生的密钥 我如何编写一个OpenSSL等效实现,以便能够用它加密数据,然后用CryptoAPI解密数据,反之亦然 尝试将EVP_BytesToKey与EVP_aes_128_cbc()和EVP_sha256()一起使用“按原样”无法正常工作。 (我所说的“不起作用”的意思是-无法解密CryptoAPI生成的加密数据,反之亦然。这确实适用于解密OpenSSL的加密数据) 有什么想法或好的参考资料吗 先谢谢你 以下是Windows CryptoAPI代码:使用OpenSSL API实现Windows CryptoAPI CryptoderiveKey,c,encryption,cross-platform,openssl,cryptoapi,C,Encryption,Cross Platform,Openssl,Cryptoapi,我有一个使用AES-128加密/解密给定数据的加密API代码,以及一个使用SHA-256从密码派生的密钥 我如何编写一个OpenSSL等效实现,以便能够用它加密数据,然后用CryptoAPI解密数据,反之亦然 尝试将EVP_BytesToKey与EVP_aes_128_cbc()和EVP_sha256()一起使用“按原样”无法正常工作。 (我所说的“不起作用”的意思是-无法解密CryptoAPI生成的加密数据,反之亦然。这确实适用于解密OpenSSL的加密数据) 有什么想法或好的参考资料吗 先谢
// Get the handle to the default provider.
if(CryptAcquireContext(
&hCryptProv,
NULL,
MS_ENH_RSA_AES_PROV,
PROV_RSA_AES,
CRYPT_VERIFYCONTEXT))
{
_tprintf(
TEXT("A cryptographic provider has been acquired. \n"));
}
else
{
goto Exit_PrepareCAPI;
}
// Create a hash object.
if(!CryptCreateHash(
hCryptProv,
HASH_ALGORITHM,
0,
0,
&hHash))
{
goto Exit_PrepareCAPI;
}
// Hash in the password data.
if(!CryptHashData(
hHash,
(BYTE*) strPassword.c_str(),
strPassword.length(),
(DWORD)0))
{
goto Exit_PrepareCAPI;
}
// Derive a session key from the hash object.
if(!CryptDeriveKey(
hCryptProv,
ENCRYPT_ALGORITHM,
hHash,
0x00800000 /*128 bit*/,
&hKey))
{
goto Exit_PrepareCAPI;
}
DWORD cryptMode = CRYPT_MODE_CBC;
if(!CryptSetKeyParam(
hKey,
KP_MODE,
(BYTE*)&cryptMode,
0))
{
goto Exit_PrepareCAPI;
}
if(!CryptGetHashParam(
hHash,
HP_HASHSIZE,
(BYTE *)&dwHashLen,
&dwHashLenSize,
0))
{
goto Exit_PrepareCAPI;
}
pbHash = new BYTE[dwHashLen];
if(!CryptGetHashParam(
hHash,
HP_HASHVAL,
pbHash,
&dwHashLen,
0))
{
goto Exit_PrepareCAPI;
}
SecureZeroMemory( ivBuff, sizeof(ivBuff) );
for(DWORD i = 16, j = 0 ; i < dwHashLen ; i++, j++)
{
ivBuff[j] = pbHash[i];
}
if(!CryptSetKeyParam(
hKey,
KP_IV,
ivBuff,
0))
{
goto Exit_PrepareCAPI;
}
//
// Read the data into pre-allocated pbBuffer
//
// Encrypt data. if(!CryptEncrypt(
hKey,
NULL,
fEOF,
0,
pbBuffer,
&dwCount,
dwBufferLen))
{
goto Exit_MyEncryptFile;
}
Exit_MyEncryptFile:
// Cleanup allocated objects
//获取默认提供程序的句柄。
如果(加密)上下文(
&hCryptProv,
无效的
吴恩华女士,
证明,
CRYPT_VERIFYCONTEXT)
{
_tprintf(
文本(“已获取加密提供程序。\n”);
}
其他的
{
转到出口(准备出口);;
}
//创建一个散列对象。
if(!CryptCreateHash)(
hCryptProv,
哈希算法,
0,
0,
&hHash))
{
转到出口(准备出口);;
}
//密码数据中的散列。
if(!CryptHashData)(
哈什,
(字节*)strPassword.c_str(),
strPassword.length(),
(德沃德)0)
{
转到出口(准备出口);;
}
//从哈希对象派生会话密钥。
if(!CryptDeriveKey)(
hCryptProv,
加密算法,
哈什,
0x00800000/*128位*/,,
&(港币)
{
转到出口(准备出口);;
}
DWORD cryptMode=CRYPT_MODE_CBC;
如果(!CryptSetKeyParam)(
香港大学,
KP_模式,
(字节*)&密码模式,
0))
{
转到出口(准备出口);;
}
如果(!CryptGetHashParam)(
哈什,
HP_HASHSIZE,
(字节*)和dwHashLen,
&dwHashLenSize,
0))
{
转到出口(准备出口);;
}
pbHash=新字节[dwHashLen];
如果(!CryptGetHashParam)(
哈什,
HP_HASHVAL,
pbHash,
&德瓦哈斯伦,
0))
{
转到出口(准备出口);;
}
SecureZeroMemory(ivBuff,sizeof(ivBuff));
对于(DWORD i=16,j=0;i
毕竟,这个代码起作用了:
int generateKey(const string& strSecter)
{
SHA256_CTX sha256Ctx;
unsigned char hash[SHA256_DIGEST_LENGTH];
SecureZeroMemory(hash, sizeof hash);
SHA256_Init(&sha256Ctx);
SHA256_Update(&sha256Ctx, strSecter.c_str(), strSecter.length());
SHA256_Final(hash, &sha256Ctx);
memcpy(Key, hash, AES_BLOCK_SIZE);
memcpy(IV, hash + AES_BLOCK_SIZE, AES_BLOCK_SIZE);
return 0;
}
希望这会对某人有所帮助。据我所知,对于32字节的SHA256,前16个字节将是键,其余16个字节将是IV。使用20字节的SHA1如何?