C# Aes加密。。。遗漏了一个重要的部分

C# Aes加密。。。遗漏了一个重要的部分,c#,encryption,aescryptoserviceprovider,C#,Encryption,Aescryptoserviceprovider,我的静态加密类中有一个如下所示的方法: public static byte[] EncryptString(string toEncrypt, byte[] encryptionKey) { var toEncryptBytes = Encoding.UTF8.GetBytes(toEncrypt); using (var provider = new AesCryptoServiceProvider()) {

我的静态加密类中有一个如下所示的方法:

    public static byte[] EncryptString(string toEncrypt, byte[] encryptionKey)
    {
        var toEncryptBytes = Encoding.UTF8.GetBytes(toEncrypt);
        using (var provider = new AesCryptoServiceProvider())
        {
            provider.Key = encryptionKey;
            provider.Mode = CipherMode.ECB;
            provider.Padding = PaddingMode.ISO10126;
            using (var encryptor = provider.CreateEncryptor(provider.Key, provider.IV))
            {
                using (var ms = new MemoryStream())
                {
                    using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                    {
                        cs.Write(toEncryptBytes, 0, toEncryptBytes.Length);
                        cs.FlushFinalBlock();
                    }
                    return ms.ToArray();
                }
            }
        }
    }
    [TestMethod]
    public void EncryptStringEncryptsTest()
    {
        var toEncrypt = "My text to encrypt";
        var encryptionKey = Convert.FromBase64String("93mcgv9UBYpwgoUX0AXEaU1BqTCufPWPkFdOdoILLDA=");
        var encrypted = Encryption.EncryptString(toEncrypt, encryptionKey);

        var text = Convert.ToBase64String(encrypted);
        Assert.IsTrue(false);
    }
我有一个单元测试,如下所示:

    public static byte[] EncryptString(string toEncrypt, byte[] encryptionKey)
    {
        var toEncryptBytes = Encoding.UTF8.GetBytes(toEncrypt);
        using (var provider = new AesCryptoServiceProvider())
        {
            provider.Key = encryptionKey;
            provider.Mode = CipherMode.ECB;
            provider.Padding = PaddingMode.ISO10126;
            using (var encryptor = provider.CreateEncryptor(provider.Key, provider.IV))
            {
                using (var ms = new MemoryStream())
                {
                    using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                    {
                        cs.Write(toEncryptBytes, 0, toEncryptBytes.Length);
                        cs.FlushFinalBlock();
                    }
                    return ms.ToArray();
                }
            }
        }
    }
    [TestMethod]
    public void EncryptStringEncryptsTest()
    {
        var toEncrypt = "My text to encrypt";
        var encryptionKey = Convert.FromBase64String("93mcgv9UBYpwgoUX0AXEaU1BqTCufPWPkFdOdoILLDA=");
        var encrypted = Encryption.EncryptString(toEncrypt, encryptionKey);

        var text = Convert.ToBase64String(encrypted);
        Assert.IsTrue(false);
    }

每次我运行它时,
文本
值都会改变。如果输入相同,我希望它是常数。我的期望是错误的,还是我做错了什么?

你的假设是错误的


将附加随机数据以将消息填充到块大小的倍数。

根据ISO1026,您使用的是随机填充字节。因此,即使所有输入都相同,每次的结果也不会相同。

请在此上下文中定义“不安全”,如果我更改模式,是否必须更改代码?我几乎总是使用散列,所以对称可逆加密是我必须承认的一个弱点。为了确保一切都被理解,填充的最后一个字节不是随机的,但它编码填充字节数(链接示例中为07h)。其余的字节实际上没有指定,它们可以是随机的,但不必是随机的(因此链接的MS文章有点不正确)。最后,如果更改了填充中的任何位,则密文的最后一个完整块(DES/3DES为8字节,AES为16字节)将更改。哦,如果只有一个填充字节(最小值),那么即使使用随机字节进行更长的填充,结果也将始终相同。够有趣的是,它们可能与实现者可以使用PKCS#5填充来实现ISO1026相同。字节不必是随机的。换句话说,测试可能在创建它的平台上成功运行,而在另一个平台上失败。密码学不是很有趣吗?