AES 128位具有欧洲央行密码算法使用无效键正确解密



嗨,我正在学习加密/解密部分。我已经创建了两种使用 AES 128 ECB CIPHER模式和 PKCS7 PADDING的方法,用于加密/解密。

以下是代码。

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 键,在解密中,我已通过 ContactCentrt 。在这种情况下,它正在做适当的加密和解密。

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

尽管我的两个密钥都不匹配,但仍可以正常工作。只是想知道这可能是怎么发生的?

您将无效的键传递给aes.CreateEncryptor(和CreateDecryptor)。AES的有效密钥尺寸为128、192和256,您的密钥是13*8 = 104位。如果您尝试将其分配给aes.Key,则会引发异常。但是,aes.CreateEncryptor有一个错误,如果密钥大小小于块大小(小于128位),则无法正确验证密钥大小,尽管在文档中明确说明"密钥大小必须为128、192或256位"。此错误是在.NET核心(至少在版本2中)固定的,其中正确抛出了您的代码例外。

因此,由于您正在通过无效的密钥和 CreateEncryptor误以为 - 您并没有真正使用AES加密,并且任何事情都可能发生。例如,如果您通过1个字节的键(或2或7) - 将抛出范围内异常的索引。我的假设(通过查看源代码)是算法实现,假设字节中的密钥大小可以由4分开,并且使用这些4字节块。密钥的前12个字符是相同的,其余的(不使用1,2或3个字符),因为将4字节块的数量计算为keySize / 4(和13/4 = 3)。

无论如何,关于为什么发生这种情况的任何假设都不重要,因为算法是用无效的输入执行的,而执行的任何结果是无关紧要的。

给定该信息 - 切勿将密钥直接传递给aes.CreateEncryptor,而是首先将其分配给aes.Key,然后将其传递(aes.CreateEncryptor(aes.Key, iv)

最新更新