序列式.NET DESCryptoServiceProvider加密和解密在第96次之后产生错误的字节

时间:2010-12-02 19:28:59

标签: c# encryption cryptography

基本上,这是代码:

        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个零的情况下加密排序字节数组?

2 个答案:

答案 0 :(得分:1)

DES是64位块的块密码,因此要编码的数据需要是64位块的倍数。 (见http://en.wikipedia.org/wiki/Data_Encryption_Standard

观察96,我假设最后一个块是基于您将100(不是64位块)填充到104(64位块)但不将最后4个字节的值设置为0的事实。

希望这有帮助,

答案 1 :(得分:0)

实际的解决方案是使用ITransform.TransformFinalBlock。