這是我剛纔的問題(RSA Decryption)的延續當使用256bit密鑰調用aes128密碼時,libgcrypt會有什麼不同?
編輯:。以下的回答是簡潔明瞭的我添加了下面的一些示例代碼,幫助我確認我認爲正在發生的事情我會的。今天測試並回發,客戶端應用程序正在創建一個256位密鑰,但是當它調用gcry_cipher_setkey時,它使用算法返回的密鑰長度,所以我猜測setkey會將256位密鑰截斷爲128位,很容易進行測試。
我試圖解密使用libgcrypt和aes128/cbc/no padding加密的文件。有兩種不同的應用程序正在執行加密這兩者我都無法控制。一個使用128位AES密鑰,另一個使用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來解密文件。我成功解密了使用128位密鑰加密的文件。但是當密鑰是256位時失敗。失敗意味着輸出出現亂碼。
我已驗證AES密鑰正在爲兩個來源正確解密。
我的問題是當密鑰是256bits時,Libgrypt做了什麼不同?或者,這是甚至正確的路徑,找出爲什麼我的解密失敗? 謝謝你的任何信息或方向,你可以指向我一個。
布賴恩
我編輯了我原來的問題。 – TheBrian
謝謝@varren您的迴應! 'gcry_error_t gcry_cipher_setkey(gcry_cipher_hd_t h,const void * k,size_t l)'被調用,其中l = 16,k是一個32字節的數組。所以setkey將只使用'k'的第一個'l'字節。在我的C#代碼中進行了驗證,僅使用32byte密鑰的前16個字節進行解密,並取得了巨大成功。再次感謝你! – TheBrian