2

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

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

密钥: BTikvHBatPdAtgT3317QIQqGFY25WpIz

四: a5Sg4U9m11Mw2tIZ

要加密的值: 2008-06-02 13:28:45,Statements,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

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

4

2 回答 2

2

您拥有的这个密钥和 IV 看起来像 base64 编码......

rij.Key = Convert.FromBase64String("BTikvHBatPdAtgT3317QIQqGFY25WpIz");
rij.IV = Convert.FromBase64String("a5Sg4U9m11Mw2tIZ");
于 2012-05-19T00:38:09.763 回答
2

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

编辑:

我现在想通了。您需要另外添加Close()流或写入器 - 在 CBC 模式下,需要完成最后一个块的填充,如果省略,则不会输出最后一个块。下一个问题是,如果您这样做,那么您最终仍会得到与示例中预期的输出略有不同的输出。原因如下:如果您解密示例密文,您将获得:

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

它与您的纯文本不同之处在于,在您拥有 2008 的末尾有一个 2007。如果您修复此问题并正确关闭流,那么您最终将收到与示例中完全相同的输出。

于 2012-05-19T00:42:27.527 回答