2014-11-22 325 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或类似的东西愚蠢。