2014-11-22 589 views
0

我正在嘗試執行以下測試以返回應返回特定密碼的結果。它們提供Key,IV和Plaintext字符串,如下所示。AES C#加密解密FIPS

但我得到「指定的初始化向量(IV)不匹配此算法的塊大小。」

我被困在這一段時間,無法找到一個很好的簡單例子,並嘗試了一些組合。

以下是我的C#代碼。我試圖保持它非常簡單。

string AesPlainText = "1654001d3e1e9bbd036a2f26d9a77b7f"; 
     string AesKey = "3ccb6039c354c9de72adc9ffe9f719c2c8257446c1eb4b86f2a5b981713cf998"; 
     string AesIV = "ce7d4f9679dfc3930bc79aab81e11723"; 

     AesCryptoServiceProvider aes = new AesCryptoServiceProvider(); 
     aes.KeySize = 256; 
     aes.IV = HexToByteArray(AesIV); 
     aes.Key = HexToByteArray(AesKey); 
     aes.Mode = CipherMode.CBC; 

     // Convert string to byte array 
     byte[] src = Encoding.Unicode.GetBytes(AesPlainText); 

     // encryption 
     using (ICryptoTransform encrypt = aes.CreateEncryptor()) 
     { 
      byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length); 

      // Convert byte array to Base64 strings 
      Console.WriteLine(Convert.ToBase64String(dest)); 
     } 

每秒更新答案:

感謝,偉大的觀察。我在上面的例子中改變了Encoding.UTF8.GetBytes來使用HexToByteArray,它現在可以工作。

public static byte[] HexToByteArray(String hex) 
{ 
    int NumberChars = hex.Length; 
    byte[] bytes = new byte[NumberChars/2]; 
    for (int i = 0; i < NumberChars; i += 2) 
     bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
    return bytes; 
} 
+0

感謝下面是我添加的功能,似乎解決了我的問題,並允許加密運行。 – 2014-11-22 22:07:25

回答

3

你的明文,密鑰和IV似乎以十六進制被指定的,所以你需要解碼的十六進制數去底層字節而不是進行UTF8編碼。

你可以從十六進制的here得到一個字節數組。請注意,該方法的名稱應該有十六進制英寸的東西,不要稱之爲StringToByteArrayatoi或類似的東西愚蠢。