C# の AES 復号を C++で実装しなおす その3

BYTE array[32] = salt; 
Rfc2898DeriveBytes aesDeriveBytes = new Rfc2898DeriveBytes(password, array, 1000);
aes.KeySize = 256;
aes.BlockSize = 128;
aes.Key = aesDeriveBytes.GetBytes(aesKeySize / 8);
aes.IV = aesDeriveBytes.GetBytes(aes.BlockSize / 8);

aes.Padding = PaddingMode.PKCS7;
aes.Mode = CipherMode.CFB;
CryptoStream cryptoStream = new CryptoStream(fileStream, aesManaged.CreateDecryptor(), CryptoStreamMode.Read);

C#赤字部分の実装。

#include <openssl>
#include <openssl>
#pragma comment (lib, "libeay32.lib")

 :
char arrays[32] = salt;
BYTE aesManaged[48] = {0};
PKCS5_PBKDF2_HMAC_SHA1 (password, strlen (password), arrays, 32, 1000, 48, aesManaged);
aes.KeySize = 256;
aes.BlockSize = 128;
memcpy(aes.IV, aesManaged+32,16);
memcpy(aes.KEY, aesManaged,32);

DWORD len;
EVP_CIPHER_CTX *cipherContext;

cipherContext = EVP_CIPHER_CTX_new();
EVP_CIPHER_CTX_init(cipherContext);
EVP_DecryptInit_ex(cipherContext, EVP_aes_256_cfb(), NULL, aes.KEY, aes.IV);
EVP_DecryptUpdate(cipherContext, res, (int*)&pdwDataLen, buf, fLen);
EVP_DecryptFinal_ex(cipherContext, res + pdwDataLen, (int*)&len);


int x,y;
if(len == 0) {
  x = buf[pdwDataLen-1];
  for (y = 0; y < x;y++){
    if(buf[pdwDataLen - y -1] != x){
      x = 0;
      printf("Padding may be zero.\n",x);
      break;
    }
  }
if(x > 0) len = -x;
}
printf("Padding size = %d\n",x);
EVP_CIPHER_CTX_cleanup(cipherContext);

どうも前回のコードだとEVP_DecryptFinal_exがパディング長を返してくれないようなので、追加コードを注入。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です