如何将字符串键和IV转换为Rijndael的字节数组

时间:2012-05-19 00:34:18

标签: c# .net rijndael

文档说“如果您使用以下值,那么您将获得此结果”。

  

块大小: 128   密码模式: CBC   填充模式:

关键: BTikvHBatPdAtgT3317QIQqGFY25WpIz

IV: a5Sg4U9m11Mw2tIZ

值得加冕: 2008-06-02 13:28:45,声明,1234567 ,, 06/01 / 2008,06 / 01 / 2008,0

根据开发人员指南使用所有这些值之后加密结果应如何。

  

b97f3985245be1065604c5808cebaa2e15813bf938cfaa3c198fd464565c13ced7c91ac6   b68326ce5ed5e81cb7de81acb9fcd1b1636127efbac3203da5bdccea

但是,由于某种原因,我无法得到这个结果,这是我用来填充此结果的代码,但它首先给出了相同的字符,然后在字符更改后给出了相同的字符,因为您可能会在结果的最底部看到问题

这是代码,下面是新输出:

public static void Main(string[] args)
{
  RijndaelManaged rij = new RijndaelManaged();
  rij.Mode = CipherMode.CBC;
  rij.Padding = PaddingMode.Zeros;
  rij.Key = ASCIIEncoding.UTF8.GetBytes("BTikvHBatPdAtgT3317QIQqGFY25WpIz");
  rij.IV = ASCIIEncoding.UTF8.GetBytes("a5Sg4U9m11Mw2tIZ");
  ICryptoTransform transform = rij.CreateEncryptor();

  byte[] data = Encoding.ASCII.GetBytes("2008-06-02 13:28:45,Statements,1234567,,06/01/2008,06/01/2008,0");
  byte[] result = transform.TransformFinalBlock(data, 0, data.Length);
  Console.WriteLine(ByteArrayToString(result));
}

public static string ByteArrayToString(byte[] ba)
{
  StringBuilder hex = new StringBuilder(ba.Length * 2);
  foreach (byte b in ba)
    hex.AppendFormat("{0:x2}", b);
  return hex.ToString();
}

我的输出:

  

b97f3985245be1065604c5808cebaa2e15813bf938cfaa3c198fd464565c13ced7c91ac6b68326ce5ed5e81cb7de81ac

注意:我需要在推进时更新问题并找到更好的解决方案,但现在出现了新问题。

2 个答案:

答案 0 :(得分:2)

这个键和IV你看起来像base64编码......

rij.Key = Convert.FromBase64String("BTikvHBatPdAtgT3317QIQqGFY25WpIz");
rij.IV = Convert.FromBase64String("a5Sg4U9m11Mw2tIZ");

答案 1 :(得分:2)

你在谈论输出中的奇怪字符 - 实际上,你发布的输出是十六进制编码,所以你应该尝试将你的编码编码为十六进制,如here所述。

编辑:

我现在明白了。您需要额外Close()流或写入器 - 在CBC模式下,这需要最终确定最后一个块上的填充,如果省略,则不会输出最后一个块。接下来的问题是,如果你这样做,那么你仍然会得到一个与你的例子中预期的输出略有不同的输出。原因如下:如果你解密你的示例密文,你会得到:

2008-06-02 13:28:45,Statements,1234567,,06/01/2007,06/01/2007,0

它与您的明文的不同之处在于,2007年您将拥有2008年。如果您修复此问题并正确关闭流,那么您最终将获得与示例中完全相同的输出。