Почему алгоритм AES делает ошибки - PullRequest
0 голосов
/ 17 июня 2019

Я запрограммировал метод шифрования и дешифрования AES, но когда я шифрую и дешифрую текст, алгоритм допускает ошибки. Что я сделал не так?

public class VSVerschluesselung : MonoBehaviour {

    [SerializeField]
    private TMP_InputField input;
    [SerializeField]
    private TMP_InputField output;

    private byte[] schluessel = { 196, 67, 23, 195, 176, 89, 198, 17, 7, 248, 47, 232, 246, 107, 249, 252, 138, 21, 133, 226, 186, 82, 255, 199, 152, 0, 1, 173, 239, 18, 181, 238 };
    private byte[] iv = { 137, 224, 26, 121, 180, 59, 150, 95, 164, 216, 57, 161, 247, 251, 68, 182 };
    private Aes crypt;

    public void verschluesseln () {
        string text = input.text;
        if (text == "" || text == null) return;
        Debug.Log ("Verschlüsselung");

        using (Aes crypt = Aes.Create ()) {
            this.crypt = crypt;
            //Maximale Keygröße auswählen
            crypt.KeySize = 256;
            crypt.Key = schluessel;
            crypt.IV = iv;
            crypt.BlockSize = 128;
            crypt.Mode = CipherMode.ECB;

            // Create an encryptor to perform the stream transform.
            ICryptoTransform encryptor = crypt.CreateEncryptor (crypt.Key, crypt.IV);

            // Create the streams used for encryption.
            using (MemoryStream msEncrypt = new MemoryStream ()) {
                using (CryptoStream csEncrypt = new CryptoStream (msEncrypt, encryptor, CryptoStreamMode.Write)) {
                    using (BinaryWriter swEncrypt = new BinaryWriter (csEncrypt)) {
                        //Write all data to the stream.
                        swEncrypt.Write (text);
                    }
                    output.text = Encoding.Unicode.GetString (msEncrypt.ToArray ());
                }
            }
        }
        crypt.Clear ();
    }

    public void entschluesseln () {
        string inputText = input.text;
        if (inputText == "" || inputText == null) return;
        Debug.Log ("Entschlüsselung");

        using (Aes crypt = Aes.Create ()) {
            this.crypt = crypt;
            //Maximale Keygröße auswählen
            crypt.KeySize = 256;
            crypt.Key = schluessel;
            crypt.IV = iv;
            crypt.BlockSize = 128;
            crypt.Mode = CipherMode.ECB;

            byte[] verschlText = Encoding.Unicode.GetBytes (inputText);
            // Create a decryptor to perform the stream transform.
            ICryptoTransform decryptor = crypt.CreateDecryptor (crypt.Key, crypt.IV);

            // Create the streams used for decryption.
            using (MemoryStream msDecrypt = new MemoryStream (verschlText)) {
                using (CryptoStream csDecrypt = new CryptoStream (msDecrypt, decryptor, CryptoStreamMode.Read)) {
                    using (StreamReader srDecrypt = new StreamReader (csDecrypt)) {

                        // Read the decrypted bytes from the decrypting stream
                        // and place them in a string.
                        output.text = srDecrypt.ReadToEnd ();
                    }
                }
            }
        }
        crypt.Clear ();
    }
}

Введите:

1 Am Anfang schuf Gott Himmel und Erde.

2 Война Эрде со всеми силами, и Финский лагерь; und der Geist Gottes schwebte über dem Wasser.

3 Und Gott sprach: Es werde Licht! Унд эс Уорд Лихт.

4 Und Gott Sah, Dass Das Licht Gut War. Да, Готт дас Лихт фон дер Финстернис

5 и более поздние даты и даты Finsternis Nacht. Да оберегает Абенд и Морген дер Эрст Тэг.

Выход:

Am1 Am Anfang sc h y K lund Erde.

2 Война Эрде со всеми силами и Финский лагерь; und der Geist Gottes schwebte über dem Wasser.

3 Und Gott sprach: Es werde = 1 Ŀ ƺard Licht.

4 Und Gott sah, daI2> Q d % war. Да, Готт дас Лихт фон дер Финстернис

5 und nannte das Licht Tag | _q is Nacht. Да под присмотром Абенд и Морген дер Эрст Тэг.

1 Ответ

3 голосов
/ 17 июня 2019

Основной ошибкой здесь является output.text = Encoding.Unicode.GetString (msEncrypt.ToArray()); в функции шифрования и метод Unicode.GetBytes в функции дешифрования.Современный зашифрованный текст состоит из байтов, а не фактического текста.Таким образом, если вы рассматриваете это как строку, вы, скорее всего, потеряете информацию, так как не все байты представляют допустимый символ.Или, в этом случае, 16-битные кодовые единицы UTF-16LE, как это ложно представляет Unicode.

Если изменить только один бит ввода для функции дешифрования, он будет некорректно дешифровать весь блок.Потеря единиц кода или байтов еще хуже.

Примечания:

  • Никогда не храните объект шифрования Aes, это легкие объекты.Вместо этого просто сохраните ключ;
  • Используйте UTF-8, он более эффективен и используется намного больше, чем UTF-16, и даже больше, чем UTF-16 в форме Little Endian;
  • ECB не берет IV, вместо этого используйте CBC, по крайней мере, он защищен CPA (если нет открытых оракулов).
  • Используйте base64 to или base64url для преобразования зашифрованного текста (то есть рандомизированных байтов) в фактические печатаемые символы.
  • Префикс IV к зашифрованному тексту (прямое использование MemoryStream - хороший способ перевести IV с зашифрованным текстом из функции шифрования в функцию дешифрования.

Viel Erfolg!

...