OpenSSL から MS CryptoAPI に移行する必要があります。
OpenSSLを使用すると、データのNバイト(すでに整列されています-たとえば、データ長= 32バイトとしましょう)を取得し、あるバッファから別のバッファにエンコード/デコードします。すべて正常に動作します。
今度は「CryptoAPI を使用する必要があります!」。だから私は次のようなものを書きます:
// Import AES key
if(!CryptImportKey(m_hProvider, (CONST BYTE*)&aeskey, structsize, NULL, 0, &m_hAesKey ) ) {
throw WinAESException("SetKey: Import key failed");
}
// Set Mode
DWORD dwMode = CRYPT_MODE_ECB; //I can also use CRYPT_MODE_CBC with set of IV but let simple the code;
if(!CryptSetKeyParam(m_hAesKey, KP_MODE, (BYTE*)&dwMode, 0)) {
throw WinAESException("SetKey: Set ECB mode failed");
}
問題なく動作し、データをエンコードしようとしています
DWORD d = (DWORD)psize;
result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, buffer, &d, (DWORD)bsize );
そして、私は何を見ますか?データのエンコードされた部分がソースよりも大きくなっています。CryptEncrypt 関数が何らかの方法で既にパディング データをパディングしたことを理解していますか?
とにかく、暗号化された結果をプレーンデータと同じサイズにすることは可能ですか?
32 バイトを暗号化するときに、48 バイトではなく正確に 32 バイトを取得するために、整列されていないブロックを使用しません...
予想されるサイズをテストすると
DWORD d = 16;
result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, 0, &d, (DWORD)bsize ); //need 32
d = 32;
result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, 0, &d, (DWORD)bsize ); //need 48
d = 48;
result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, 0, &d, (DWORD)bsize ); //need 64
d = 64;
result = CryptEncrypt( m_hAesKey, NULL, TRUE, 0, 0, &d, (DWORD)bsize ); //need 80
WTHF私は間違っていますか?PS 暗号化された結果を目的のサイズに切り捨ててから復号化しようとすると、予期されるエラー コードが返されて復号化が行われますが、データは正しく復号化されます。しかし、このハックは私のためではありません...