Разные шифры AES дают разные результаты ... почему? - PullRequest
0 голосов
/ 24 августа 2018

Я пытался использовать три разные библиотеки для AES-шифрования строки.

Когда я использую инструмент , найденный здесь , я получаю следующие результаты:

Input: "Test" 
key: "MyEncryptionKey1MyEncryptionKey1" (256 Bit)
ECB mode.

это дает мне вывод Cidor8Ph7pZqPw0x2AwIKw==

Но когда я использую библиотеки в Swift, я получаю разные результаты.

Использование RNCryptor

Когда я использую RNcryptorЯ использую следующий код:

class func encryptMessage(message: String) throws -> String {
    guard let messageData = message.data(using: .utf8) else { return message }
    let cipherData = RNCryptor.encrypt(data: messageData, withPassword: key)
    return cipherData.base64EncodedString()
}

вывод: AwF8a+HziYkO4iHdcI3jY8p9QAY461DVgkjkYUFMkuh4A2a8FCfa4RgS9Z37QhJGxIL0Q20RE3BL4nmLQVFOfZmBpj8l0wj9YZgqZmrkxRFYQQ==

Использование AESCrypt

Когда я использую RNcryptor i 'используя следующий код:

class func encryptMessageAES(message: String) -> String{
    guard let encryptedData = AESCrypt.encrypt(message, password: key) else { return  message }
    return encryptedData
}

Вывод: T5/mR8UT/EXeUobPTLhcFA==

Также, если я использую CryptoSwift, я получаю третий результат.Мой коллега, работающий с Android, всегда получает один и тот же результат - соответствует веб-инструменту.

Я совершенно новичок в шифровании и вижу, что делаю что-то не так.Но я не могу понять, что.Я должен также упомянуть, что это шифрование используется только для того, чтобы не иметь сообщений чата в необработанных строках, отображаемых в Firebase, для тех, кто имеет доступ к базе данных.

Ответы [ 2 ]

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

Определение AES является довольно точным, и когда между разными реализациями что-то не работает, это часто происходит из-за того, что поверх AES строятся разные вещи.Сам алгоритм AES всегда работает с двоичными данными.Зашифрованные данные должны быть двоичными.Ключ, который вы используете для шифрования, должен быть двоичным, и если IV находится в игре, он также должен быть двоичным.

Во всех реализациях, где вы предоставляете данные для реализации, которые не являются двоичными, выборбыли сделаны о том, как эти данные преобразуются в формат, который может использоваться с AES .Иногда эти преобразования являются просто простыми преобразованиями данных, такими как декодирование в шестнадцатеричном или base64-формате, но в других случаях в игру вступают совершенно новые концепции, такие как получение ключей шифрования из паролей.

Все три примера используют текст в качестве ввода для ключа,и каждая реализация сделала некоторый выбор о том, как поддержать это.

Первая страница , на которую вы ссылаетесь, решила просто интерпретировать строку ASCII как двоичный ключ.Это ужасный выбор , поскольку он (помимо несовместимости со всем остальным) эффективно устраняет 1-2 бита на байты ключа, значительно снижая прочность.

В примере RNCryptor ключ указывается с помощью withPassword: key.Здесь команда RNCryptor решила использовать функцию получения ключа PBKDF2 для создания фактического ключа AES .Это решает другой вариант использования, где у вас есть потенциальный недельный пароль, для которого требуется растяжение , чтобы быть защищенным для шифрования.Если у вас есть фактический ключ, это не тот путь.

В случае AESCrypt вы также, похоже, вводите пароль в качестве ввода.Не ясно, как это будет преобразовано в фактический ключ.

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

Есть еще одно значение, которое вам нужно установить в AES, это iv.Поэтому постарайтесь найти это iv во всех трех библиотеках.А также попробуйте установить то же значение для iv.И тогда вы сможете получить одинаковые результаты из всех библиотек.

...