我正在尝试将一些Python代码移植到C#,并且在代码中有一部分用AES加密带有以下密钥的字符串:
'\ xd7 \ xdf \ xca2 \ xd0Vhu \ xeb \ x06 \ x04 xbx \ x8b \ xcf \ x8f2&t \ xc0 \ x92 \ xc4 \ x6 \ x0b> \ xb4 \ xe7 \ xbc'
这个密钥在Python中是32个字节,但问题是在C#中,当我转换该字符串(Encoding.Default.GetBytes
)时它是30个字节,因此我无法生成AES密钥。
为什么Python中的键32的长度和C#中的字节数组长度是30?
将密钥转换为bytes数组:
byte[] key = Encoding.Default.GetBytes("\xd7\xdf\xca2\xd0Vhu\xeb\x06\xa0\xba\n\xa2\x07O\xc1\x8b\xcf\x8f2&t\xc0\x92\xc4\xa5\x0b>\xb4\xe7\xbc");
获取算法异常的无效密钥大小(因为它是30个字节而不是32个):
byte[] encrypted;
byte[] iv;
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = key;
aesAlg.GenerateIV();
iv = aesAlg.IV;
aesAlg.Mode = CipherMode.CBC;
var encryptor = aesAlg.CreateEncryptor(aesAlg.Key, iv);
using (var msEncrypt = new MemoryStream())
{
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (var swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write("test");
}
encrypted = msEncrypt.ToArray();
}
}
}
您拥有的字节字符串是一种混合编码,其中包含unicode代码点和字符的ASCII表示。你可以在几个地方看到这个,
'\ xd7 \ xdf \ xca2 \ xd0Vhu \ xeb \ x06 \ x04 xbx \ x8b \ xcf \ x8f2&t \ xc0 \ x92 \ xc4 \ x6 \ x0b> \ xb4 \ xe7 \ xbc'
如果将这些转换为代码点,最终会得到"\xd7\xdf\xca\x32\xd0\x56\x68\x75\xeb\x06\xa0\xba\x0a\xa2\x07\x4f\xc1\x8b\xcf\x8f\x32\x26\x74\xc0\x92\xc4\xa5\x0b\x3e\xb4\xe7\xbc"
,并且应该为您的密钥设置正确的字节。
var val = "\xd7\xdf\xca\x32\xd0\x56\x68\x75\xeb\x06\xa0\xba\x0a\xa2\x07\x4f\xc1\x8b\xcf\x8f\x32\x26\x74\xc0\x92\xc4\xa5\x0b\x3e\xb4\xe7\xbc";
var count = Encoding.Default.GetByteCount(val);
Console.WriteLine(count); // 32