C#字节数组长度不如python

问题描述 投票:-2回答:1

我正在尝试将一些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();
        }
    }
}
c# python byte
1个回答
3
投票

您拥有的字节字符串是一种混合编码,其中包含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 
© www.soinside.com 2019 - 2024. All rights reserved.