Расшифровка 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;
}