4
AES-128을 사용하여 주어진 데이터를 암호화하고 SHA-256을 사용하여 암호에서 파생 된 키를 암호화하는 CryptoAPI 코드가 있습니다.OpenSSL API를 사용하여 Windows CryptoAPI CryptDeriveKey 구현
OpenSSL 등가 구현을 작성하여 데이터를 암호화 한 다음 CryptoAPI로 해독 할 수 있고 그 반대의 경우도 마찬가지입니다.
EVP_aes_128_cbc() 및 EVP_sha256()을 사용하여 EVP_BytesToKey를 사용하려는 시도가 "있는 그대로"작동하지 않았습니다. ("작동하지 않음"은 CryptoAPI의 생성 된 암호화 된 데이터를 해독 할 수 없으며 그 반대의 경우도 있음) 이는 OpenSSL의 암호화 된 데이터를 해독하는 데 유용합니다.
어떤 아이디어 또는 좋은 참조?
미리 감사드립니다. 여기
는 Windows CryptoAPI를 코드 : 결국// 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
32 바이트 SHA256의 결과와 함께 처음 16 바이트는 Key가되고 나머지 16 바이트는 IV가됩니다. 20 바이트의 SHA1은 어떻습니까? – yelliver