Расшифровка CryptoStream AES с большими кусками не удалась

Вот метод расшифровки, который я использую внутри Unity3d. Он отлично работает, когда я вызываю его с порциями размером 128 байт, но не работает, когда он получает, скажем, 256 байт за раз. Должен ли я называть это только в блоках размера блока?

После дальнейшего анализа я подумал, что заполнение PKCS7 не удаляется с указанной ускоренной скоростью. Однако это не одни и те же байты, поэтому удаление-заполнение исключено. Однако я не знаю, откуда эти 24 дополнительных байта. Во-первых, вы можете видеть, что в расшифрованном тексте ничего не пропущено. Так откуда, черт возьми, они берутся? Представление отладки дешифрованного массива внизу имеет это содержимое, когда декодируется большой кусок:

1 ------ 3895 ------- / home / max / PycharmProjects / RealityShell / Backend \ r \ n \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ "\ xx2neL \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 {2 ------ 3895 ------- / home / max / PycharmProjects / RealityShell / Backend \ r \ n \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2 \ xx2tC; \ xx2VCY3 \ xx2Z? R \ xx2 \ x3 \ xx2 \ x3 \ xx2 \ x2 \ xx2 \ x2 \ xx2 \ x2 \ xx2 \ x2 \ xx2 \ x3 \ xx2 ----3895-------/home/max/PycharmProjects/RealityShell/Backend\r\n\xx2 \xx2\xx2\xx2\xx2\xx2\xx2\xx2\xx2\xx2\xx2\xx2\xx2\xx2\xx2\xx2neWc\xx2\xx2\xx2\xx2+ \xx2\xx2L;M4------3895-------/home/max/PycharmProjects/RealityShell/Backend\r\n\

Итак, мой тестовый контент - это строки "1------3895-------/home/max/PycharmProjects/RealityShell/Backend\r\n\" и т. Д., В то время как байты \ xx2 необъяснимы и составляют проблема.

public static string DecryptStringFromBytes_Aes(string serversays, string Key)
{

Debug.Log ("Decrypt incoming length:" + serversays.Length.ToString ());
byte[] cipherText = Convert.FromBase64String(serversays);
byte[] keystring = Encoding.UTF8.GetBytes(Key);

using (Aes aesAlg = Aes.Create())
{
    aesAlg.Key = keystring;
    aesAlg.Mode = CipherMode.CBC;
    aesAlg.BlockSize = 128;
    aesAlg.Padding = PaddingMode.PKCS7;

    byte[] cipherText_only = new byte[cipherText.Length - aesAlg.IV.Length];
    byte[] IV = new byte[aesAlg.IV.Length];

    Array.Copy(cipherText, 0, IV, 0, aesAlg.IV.Length);
    Array.Copy(cipherText, aesAlg.IV.Length, cipherText_only, 0, cipherText_only.Length);

    aesAlg.IV = IV;

    using (MemoryStream ms = new MemoryStream())
    {
        using (ICryptoTransform decryptor = aesAlg.CreateDecryptor())
        {
            using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
            {
                cs.Write(cipherText_only, 0, cipherText_only.Length);
                //cs.FlushFinalBlock();

                byte[] decrypted = ms.ToArray();
                string decr_serverSays = Encoding.UTF8.GetString (decrypted);
                Debug.Log (decr_serverSays + "..." + decr_serverSays.Length.ToString());
                return decr_serverSays;
            }
        }
    }
}
}

Вот метод шифрования Python:

def encrypt(self, key, raw):
    encoder = PKCS7Encoder()
    #mac = HMAC.new(raw, digestmod=SHA256)
    raw_pad = encoder.encode(raw)
    iv = Random.new().read(AES.block_size)
    cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv)
    encry_cipher = iv + cipher.encrypt(raw_pad)
    encry = base64.b64encode(encry_cipher)
    #print(len(encry), len(encry_cipher), len(raw_pad))
    return encry

1 ответ

Не совсем уверен, как интерпретировать этот отладочный вывод, но есть проблема с вашим кодом: вы читаете весь MemoryStream перед CryptoStream был покраснел Лучшее, что вы можете сделать, это двигаться ms.ToArray() вне внутреннего использования:

using (MemoryStream ms = new MemoryStream())
{
    using (ICryptoTransform decryptor = aesAlg.CreateDecryptor())
    using (CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
    {
        cs.Write(cipherText_only, 0, cipherText_only.Length);
    }

    byte[] decrypted = ms.ToArray();
    string decr_serverSays = Encoding.UTF8.GetString(decrypted);
    Debug.Log (decr_serverSays + "..." + decr_serverSays.Length.ToString());
    return decr_serverSays;
}
Другие вопросы по тегам