Проблема с шифрованием в C # с использованием Bouncy Castle и расшифровкой в ​​Python с использованием AES (режим EAX) - PullRequest
2 голосов
/ 16 апреля 2019

Я пытаюсь зашифровать текст в C # и расшифровать его на python, используя режим EAX в AES.Я использую Bouncy Castle для EAX в C # и AES для Python.

Я могу успешно шифровать и дешифровать как в C #, так и в Python, однако я заметил, что когда C # шифрует текст,вывод значительно дольше, чем когда Python шифрует его.

Не уверен, что это уместно, но я отправляю его из C # в Python через сервер, и я подтвердил, что все отправлено в порядке.Клиент запускает эмулятор Android, а сервер работает под управлением Windows 10.

Метод, который я использую для проверки кода C #:

const int MAC_LEN = 16
//The Key and Nonce are randomly generated
AeadParameters parameters = new AeadParameters(key, MAC_LEN * 8, nonce);

string EaxTest(string text, byte[] key, AeadParameters parameters)
{
    KeyParameter sessKey = new KeyParameter(key);
    EaxBlockCipher encCipher = new EAXBlockCipher(new AesEngine());
    EaxBlockCipher decCipher = new EAXBlockCipher(new AesEngine());

    encCipher.Init(true, parameters);
    byte[] input = Encoding.Default.GetBytes(text);
    byte[] encData = new byte[encCipher.GetOutputSize(input.Length)];
    int outOff = encCipher.ProcessBytes(input, 0, input.Length, encData, 0);
    outOff += encCipher.DoFinal(encData, outOff);

    decCipher.Init(false, parameters);
    byte[] decData = new byte[decCipher.GetOutputSize(outOff)];
    int resultLen = decCipher.ProcessBytes(encData, 0, outOff, decData, 0);
    resultLen += decCipher.DoFinal(decData, resultLen);
    return Encoding.Default.GetString(decData);
}

Метод, который я использую для тестированиякод python:

def encrypt_text(data, key):
    cipher = AES.new(key, AES.MODE_EAX)
    nonce = cipher.nonce
    cipher_text, mac_tag = cipher.encrypt_and_digest(data)
    return [cipher_text, mac_tag, nonce]


def decrypt_text(data, key, mac_tag, nonce):
    decrypt = AES.new(key, AES.MODE_EAX, nonce=nonce, mac_len=16)
    plaintext = decrypt.decrypt_and_verify(data, mac_tag)
    return plaintext

Для проверки строки "a" в C # я последовательно получаю зашифрованный текст из 17 байтов, а с помощью python я последовательно получаю зашифрованный текст из 1 байта.Когда я пытаюсь расшифровать в python, я получаю эту ошибку [ValueError: Ошибка проверки MAC].И Mac, и одноразовый номер последовательно составляют 16 байтов.

Пример C # Вывод: 34 2D 0A E9 8A 37 AC 67 0E 95 DB 91 D7 8C E5 4E 9F

Пример вывода Python: DD

1 Ответ

1 голос
/ 16 апреля 2019

Кодировка по умолчанию в C # - UTF-16LE, которая должна дать вам два байта открытого текста и, следовательно, два байта зашифрованного текста.Однако в коде C # / Bouncy Castle возвращаемый зашифрованный текст содержит тег аутентификации 16 байтов в конце.Очевидно, вам не хватает одного байта, 17 байтов - это один байт.Таким образом, передача зашифрованного текста где-то не удалась.Конечно, в этом случае проверка тега аутентификации также завершится неудачей.

В Python зашифрованный текст составляет один байт, а тег аутентификации - 16 байтов.Это верно для одного байта ввода.Ваша кодировка находится не в данных фрагментах кода, но я предполагаю, что это один байт в UTF-8.

Убедитесь, что вы используете UTF-8 также для своего кода C #, и убедитесь, что зашифрованный текст правильно переносится.Убедитесь, что вы используете base 64, где требуется передача через текстовый интерфейс, и не пропускайте байты с нулевым значением.Наконец, если вы используете случайный одноразовый номер, убедитесь, что вы переносите его с зашифрованным текстом (обычно это префикс).После всего этого у тебя должно быть все в порядке.

...