3DES 加密问题 - 每次都有不同的密文

本文关键字:密文 加密 问题 3DES | 更新日期: 2023-09-27 18:35:29

我尝试在 c# 的 ECB 模式下实现 3DES。

问题是下面的代码每次运行它时都会给我不同的密文,即使我传递的参数与您看到的相同 - 并且我使用 ECB 模式。

有人可以帮助出了什么问题吗?每次运行下面的程序时,输出必须相同,不是吗?

        public static byte[] SingleBlock3DES_ECB_Encrypt(byte [] plain, byte [] key)
        {
            if(plain.Length != 8)
                throw new Exception("Plain text length for single block should be 8 bytes");
            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            // set the secret key for the tripleDES algorithm
            tdes.Key = key;
            // mode of operation. there are other 4 modes.
            // We choose ECB(Electronic code Book)
            tdes.Mode = CipherMode.ECB;
            // padding mode(if any extra byte added)
            tdes.Padding = PaddingMode.None;
            // Set key size
            tdes.KeySize = 192;
            ICryptoTransform cTransform = tdes.CreateEncryptor();
            // transform the specified region of bytes array to resultArray
            byte[] resultArray =  cTransform.TransformFinalBlock(plain, 0, plain.Length);
            // Release resources held by TripleDes Encryptor
            tdes.Clear();
            return resultArray;
        }
        static void Main(string[] args)
        {
            byte[] plain = new byte[8];
            byte[] key = new byte[24];
            for (int i = 0; i < 8; i++)
                plain[i] = 1;
            for (int i = 0; i < 24; i++)
                key[i] = (byte) i;
            byte[] res = SingleBlock3DES_ECB_Encrypt(plain, key);
            string hex = BitConverter.ToString(res);
            Console.WriteLine(hex);
        }

所以简单来说,如果我多次运行这个程序,每次都会得到不同的输出。显然,某处一定有什么问题?

3DES 加密问题 - 每次都有不同的密文

正如您所写,如果您删除tdes.KeySize = 192代码就可以了。但事实上发生的事情是,当你

tdes.KeySize = 192;

key重置为随机值。

所以你可以移动

tdes.KeySize = 192;

tdes.Key = key;

或者干脆删除它,因为对于 3DES,KeySize固定为 192。

我解决了这个问题。奇迹般地,当我删除它时

  tdes.KeySize = 192;

从代码来看,它有效。