基本上,这是代码:
DES des = new DESCryptoServiceProvider();
PasswordDeriveBytes pdb = new PasswordDeriveBytes(new byte[]{123}, new byte[0]);
des.IV = new byte[8];
des.Key = pdb.CryptDeriveKey("DES", "MD5", 0, des.IV);
byte[] A = Enumerable.Range(1, 100).Select(i => (byte)i).Concat(new byte[4]).ToArray();
byte[] B = new byte[A.Length];
byte[] C = new byte[A.Length];
using (var encryptor = des.CreateEncryptor())
encryptor.TransformBlock(A, 0, A.Length, B, 0);
using (var decryptor = des.CreateDecryptor())
decryptor.TransformBlock(B, 0, B.Length, C, 0);
for (int i = 0; i < A.Length; i++)
if (A[i] != C[i])
Debugger.Break();
它在i == 96
处中断。为什么呢?
另一个小问题:省略.Concat(new byte[4])
会导致第一个TransformBlock抛出ArgumentException。为什么不能在最后没有4个零的情况下加密排序字节数组?
答案 0 :(得分:1)
DES是64位块的块密码,因此要编码的数据需要是64位块的倍数。 (见http://en.wikipedia.org/wiki/Data_Encryption_Standard)
观察96,我假设最后一个块是基于您将100(不是64位块)填充到104(64位块)但不将最后4个字节的值设置为0的事实。
希望这有帮助,
答案 1 :(得分:0)
实际的解决方案是使用ITransform.TransformFinalBlock。