2013-07-17 97 views
0

這是我剛纔的問題(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做了什麼不同?或者,這是甚至正確的路徑,找出爲什麼我的解密失敗? 謝謝你的任何信息或方向,你可以指向我一個。

布賴恩

回答

2

我假設你有

  1. 2不同的密鑰(128和256位)
  2. 2個不同的密文的源(1:AES128 2:AES256兩種:CBC/No Padding
  3. 可以解密密文128
  4. 故障無線256(一切都是亂碼,沒有任何明文解密)。

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

重要組成部分,是塊的大小始終是128和256 CBC AES 128位

兩個AES-128-CBCAES-256-CBC使用128位IV

所以我的胡亂猜測(沒看到你的AES256編碼)是,有可以在你的AES256代碼塊某處錯誤或IV大小。

如果你只是設置鍵128AES使用此功能,請檢查密鑰K的這種docs

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

長度l(以字節爲單位)必須與算法此設置的 所需的長度相匹配上下文或處於允許的範圍內,用於具有可變密鑰大小的算法。功能 會檢查此問題,並在出現問題時返回錯誤。呼叫者 應該總是檢查錯誤。

而且你通常不想在NoPadding中使用CBC(除非你的數據大小總是16字節的倍數),但填充問題只能在最後的16字節的明文塊中出現。

+0

我編輯了我原來的問題。 – TheBrian

+1

謝謝@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

相關問題