Данные, зашифрованные CryptoSwift, не совпадают с Node.js

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

Я не знаю, где я допустил ошибку. Вот фотографии того, как я использовал CryptoSwift и Node.js:

Алгоритм шифрования: aes-256-cfb

ключ: 32 байта 1

iv: 16 байт 0

CryptoSwift: разработка-ветка 0.1.1

Node.js: LTS 4.2.3

Данные, зашифрованные CryptoSwift

Данные зашифрованы Node.js 4.2.3

Вот быстрый код:

    func testAES() {
    let key = [UInt8](count: 32, repeatedValue: 1)
    let iv = [UInt8](count: 16, repeatedValue: 0)
    print(key)
    print(iv)

    let aes256cfb = try! AES(key: key, iv: iv, blockMode: .CFB)

    let en1 = try! aes256cfb.encrypt([0x5, 0x77], padding: nil)
    print(en1.map({ i in String(format: "%2x", i)}))

    let en2 = try! aes256cfb.encrypt([0x5, 0x0, 0x3, 0x89, 0x20], padding: nil)
    print(en2.map({ i in String(format: "%2x", i)}))
}

CryptoSwift: 
["77", "ef"]
["77", "98", "c9", "2c", "45"]

Node.js: 
<Buffer 77 ef>
<Buffer cf a5 66 8a 3e>

Как видите, первые два байта одинаковы, а остальные нет. Зачем? Мой код пишет неправильно? Я не знаю много о крипто, пожалуйста, объясните мне причину. Огромное спасибо.

2 ответа

Решение

Если только данные не кратны размеру блока (16 байтов), а размер данных известен априори априори, чтобы соответствовать требованию заполнения. Обычно используется заполнение PKCS#7 (PKCS#5, по сути, то же самое).

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

Посмотрите Ответ SO для примера использования Common Crypto.

Но лучше всего использовать RNCryptor для шифрования, он доступен для нескольких языков и платформ. Он также обрабатывает все биты, которые делают шифрование безопасным. Это хорошо проверено и активно развивается.

Чтобы ответить на этот вопрос.

Ваш код NodeJS шифруется [0x5, 0x77, 0x5, 0x0, 0x3, 0x89, 0x20], но ваш код CryptoSwift шифрует [0x5, 0x77], затем [0x5, 0x0, 0x3, 0x89, 0x20]. Вот почему вы получаете разные результаты.

Другие вопросы по тегам