簡體   English   中英

當使用256位密鑰調用aes128密碼時,libgcrypt做什么不同?

[英]What is libgcrypt doing different when calling the aes128 cipher with a 256bit key?

這是我之前的問題( RSA Decryption)的延續。

編輯:下面的答案清晰簡潔。 我在下面添加了一些示例代碼,幫助我驗證了我的想法。 我今天將測試並發回。 客戶端應用程序正在創建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密鑰正在為兩個源正確解密。

我的問題是當關鍵是256位時,Libgrypt的做法有何不同? 或者這是找到解密失敗原因的正確途徑? 感謝您指點我的任何信息或方向。

布賴恩

我猜你有

  1. 2個不同的鍵(128和256位)
  2. 2種不同的密文源(1: AES128 2: AES256兩者: CBC/No Padding
  3. 可以解密128個密文
  4. 失敗256(一切都是亂碼,沒有明文解密)。

主要區別是密鑰長度128256位 它指定轉換輸入的轉換輪次的重復次數。 您可能永遠不需要內部實現細節。 AES使用更多的密鑰和更大的密鑰。 10位用於128位密鑰,14位用於256位密鑰。

重要的是,128和256 CBC AES的塊大小始終為128位

AES-128-CBCAES-256-CBC都使用128位IV

因此,我的猜測(沒有看到您的AES256代碼)是您的AES256代碼中的塊或IV大小的某處可能存在錯誤。

如果您只是使用此功能設置128AES的密鑰,請查看此文檔

 gcry_error_t gcry_cipher_setkey (gcry_cipher_hd_t h, const void *k, size_t l)

密鑰k的長度l(以字節為單位)必須與該上下文的算法集的所需長度匹配,或者在具有可變密鑰大小的算法的允許范圍內。 該函數檢查此項並在出現問題時返回錯誤。 呼叫者應始終檢查錯誤。

而且您通常不希望將CBC與NoPadding一起使用(除非您的數據大小始終是16字節的倍數),但填充問題只會導致最后16字節的明文塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM