文档说“如果您使用以下值,那么您将获得此结果”。
块大小: 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
注意:我需要在推进时更新问题并找到更好的解决方案,但现在出现了新问题。
答案 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年。如果您修复此问题并正确关闭流,那么您最终将获得与示例中完全相同的输出。