嗨,我正在学习加密/解密部分。我已经创建了两种使用 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)
)