これは私の前の質問 ( RSA Decryption)の続きです。
編集:以下の答えは明確で簡潔でした。以下にサンプル コードをいくつか追加しました。今日テストして、また投稿します。クライアント アプリケーションは 256 ビット キーを作成していますが、gcry_cipher_setkey を呼び出すと、アルゴリズムから返されたキーの長さが使用されます。したがって、setkey が 256 ビット キーを 128 ビットに切り捨てていると推測しています。テストするのに十分簡単です。
aes128 / cbc / パディングなしで libgcrypt を使用して暗号化されたファイルを復号化しようとしています。暗号化を行っている 2 つの異なるアプリケーションがあり、どちらも私には制御できません。1 つは 128 ビットの AES キーを使用し、もう 1 つは 256 ビットのキーを使用しています。それ以外の場合、すべての内部呼び出しは同じです。
編集: 疑似暗号化コードは次のとおりです:編集 2:順序を修正し、将来のユーザーのためにコメントを追加しました:
#define AES_KEY_SIZE 32
char AESKey[AES_KEY_SIZE+1];
GenerateAESKey(AESKey);
Error = gcry_cipher_open(AesHandle, GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CBC, 0);
// this is always 128bits (16 bytes)
BlockLength = gcry_cipher_get_algo_blklen(GCRY_CIPHER_AES128);
// this should return 128bits (16 bytes)
KeyLength = gcry_cipher_get_algo_keylen(GCRY_CIPHER_AES128);
Error = gcry_cipher_setiv(AesHandle, NULL, 0);
// AESKey is a 32byte (256bit) char array & KeyLength is 128bits (16bytes)
// so gcry_cipher_setkey only uses the first 'KeLength' bytes of 'AESKey'
// which in this case is the first 16 bytes of 'AESKey'
Error = gcry_cipher_setkey(*AesHandle, AESKey, KeyLength);
Error = gcry_cipher_encrypt(AesHandle, Encrypted, BlockLength, ToEncrypt, BlockLenth);
void GenerateAESKey( char * AESKey ) {
int i;
srand(time(NULL));
for ( i = 0; i < AES_KEY_SIZE; i++ ) {
AESKey[i] = (rand() % 93)+33;
}
AESKey[AES_KEY_SIZE] = '\0';
}
したがって、私の C# コードでは、復号化を開始する前にこれを行います。
var aesKey = DecryptAesKey(s);
if (aesKey.Length == 32)
{
var tempKey = new byte[16];
Buffer.BlockCopy(aesKey,0,tempKey,0,16);
aesKey = tempKey;
}
ファイルを復号化するために C# と bouncycastle を使用しています。128bit キーで暗号化されたファイルの復号に成功しました。ただし、キーが 256bit の場合は失敗します。失敗は、出力が文字化けしていることを意味します。
両方のソースで AES キーが正しく復号化されていることを確認しました。
私の質問は、キーが 256 ビットの場合、Libgrypt の違いは何ですか? それとも、復号化が失敗する理由を見つけるための正しい方法ですか? あなたが私を指すことができる情報や指示をありがとう.
ブライアン