4
私は、AES-128を使用して特定のデータを暗号化するためのCryptoAPIコードと、SHA-256を使用するパスワードから得られたキーを持っています。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バイトはキーになり、残りの16バイトはIVになります。 20バイトのSHA1はどうですか? – yelliver