C # длина массива байтов уступает питону - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь перенести некоторый код Python на C #, и в коде есть часть, где он шифрует строку с помощью AES со следующим ключом:

'\ xd7 \ XDF \ xca2 \ xd0Vhu \ xeb \ x06 \ xa0 \ Xba \ п \ xa2 \ x07O \ xc1 \ x8b \ XCF \ x8f2 & т \ xc0 \ x92 \ XC4 \ xa5 \ x0b> \ XB4 \ xe7 \ XBC '

Этот ключ составляет 32 байта в Python, но проблема в том, что в C # это 30 байтов, когда я преобразую эту строку (Encoding.Default.GetBytes), поэтому я не могу сгенерировать ключ AES.

Почему длина ключа 32 в Python и длина байтового массива равна 30 в C #?

Преобразование ключа в байтовый массив:

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();
        }
    }
}

1 Ответ

0 голосов
/ 29 августа 2018

Строка байтов, которую вы имеете, находится в некой смешанной кодировке, с кодовыми точками Юникода и представлениями символов ASCII рядом друг с другом. Вы можете увидеть это в нескольких местах,

'\ xd7 \ xdf \ xca 2 \ xd0 Вху \ xeb \ x06 \ xa0 \ xba \ n \ xa2 \ x07 O \ xc1 \ x8b \ xcf \ x8f 2 & t \ xc0 \ x92 \ xc4 \ xa5 \ 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 
...