c# - 具有 ECB 密码模式算法的 AES 128 位使用无效 key 正确解密?

标签 c# encryption cryptography

您好,我正在学习加密/解密部分。我已经使用 AES 128 位和 ECB 密码模式和 PKCS7 填充创建了两种加密/解密方法。

下面是代码。

public class EncClass
    {
        public string Encrypt(string text)
        {

            byte[] src = Encoding.UTF8.GetBytes(text);
            byte[] key = Encoding.ASCII.GetBytes("contactcentre");
            RijndaelManaged aes = new RijndaelManaged();
            aes.Mode = CipherMode.ECB;
            aes.Padding = PaddingMode.PKCS7;
            aes.KeySize = 128;

            using (ICryptoTransform encrypt = aes.CreateEncryptor(key, null))
            {
                byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length);
                encrypt.Dispose();
                return Convert.ToBase64String(dest);
            }
        }

        public string Decrypt(string text)
        {

            byte[] src = Convert.FromBase64String(text);
            RijndaelManaged aes = new RijndaelManaged();
            byte[] key = Encoding.ASCII.GetBytes("contactcentrT");
            aes.KeySize = 128;
            aes.Padding = PaddingMode.PKCS7;
            aes.Mode = CipherMode.ECB;
            using (ICryptoTransform decrypt = aes.CreateDecryptor(key, null))
            {
                byte[] dest = decrypt.TransformFinalBlock(src, 0, src.Length);
                decrypt.Dispose();
                return Encoding.UTF8.GetString(dest);
            }
        }
    }

请注意,在加密中我传递了 contactcentre key ,在解密中我传递了 contactcentrT。在这种情况下,它会进行适当的加密和解密。

    var encString = encClass.Encrypt(@"manoj");
    var decString = encClass.Decrypt(encString);

虽然我的两个键都不匹配,但它仍然可以正常工作。只是想知道这怎么会发生?

最佳答案

您正在将无效 key 传递给 aes.CreateEncryptor(和 CreateDecryptor)。 AES 的有效 key 大小为 128、192 和 256,您的 key 为 13*8=104 位。如果您尝试将其分配给 aes.Key - 将引发异常。但是,aes.CreateEncryptor 有一个错误,如果 key 大小小于 block 大小(小于 128 位),它不能正确验证 key 大小,尽管在文档中明确指出“ key 大小必须是128、192 或 256 位”。这个错误在 .NET Core 中被修复了(至少在版本 2 中)它正确地为您的代码抛出异常。

因此,由于您传递了无效 key 并且 CreateEncryptor 错误地允许了它 - 您并不是真正使用 AES 加密,任何事情都可能发生。例如,如果您传递 1 个字节(或 2 个或 7 个)的键 - 将抛出索引超出范围异常。我的假设(通过查看源代码)是算法实现假设以字节为单位的 key 大小可被 4 整除,并使用这些 4 字节 block 。 key 的前 12 个字符相同,其余(1、2 或 3 个字符)未使用,因为 4 字节 block 的数量计算为 keySize/4(和 13/4 = 3).

无论如何,关于为什么会发生这种情况的任何假设都无关紧要,因为算法是在无效输入的情况下执行的,并且由此产生的任何结果都是无关紧要的。

考虑到该信息 - 永远不要将 key 直接传递给 aes.CreateEncryptor,而是先将其分配给 aes.Key,然后再传递 (aes.CreateEncryptor(aes .Key, iv))

关于c# - 具有 ECB 密码模式算法的 AES 128 位使用无效 key 正确解密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47441725/

相关文章:

go - 如何检查随机性?

c# - 如何使用 MACTripleDES 加密解密字符串?

c# - 使用 C# .NET Core 1.1 进行 Xml 数字签名

c# - 如何连续3次重复C#中的Insert命令到SQL Server数据库

c# - .NET 线程同步

c# - 如何暂停控件及其子项的绘制?

algorithm - 双向 key 加密/哈希算法

C#:将 CSS 注入(inject) MSHTML 实例的最佳方式?

android - 不应使用具有 ECB 模式的密码

c - 我的加密是否像 openPGP/SMIME 一样安全?