2015-12-08 5 views
2

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

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

Cipher алгоритм: AES-256-CFB

ключ: 32 байт 1

IV: 16 байт 0

CryptoSwift: разработать ветвп 0.1.1

Node.js: LTS 4.2.3

Data encrypted by CryptoSwift

Data encrypted by 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> 

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

+0

Не используйте CryptoSwift, если вы заботитесь о производительности или безопасности. CryptoSwift в 500-1000 раз медленнее, чем Common Crypto, и не проверен или сертифицирован. – zaph

+0

Почему вы используете режим CFB, общий случай - использовать режим CBC. – zaph

+0

Только тестовый код, не против :) – Neko

ответ

0

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

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

См. SO Answer на примере использования Common Crypto.

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

+0

Спасибо, я постараюсь исправить это. :) – Neko

+0

Вот новый вопрос: https://github.com/krzyzanowskim/CryptoSwift/issues/175, не могли бы вы рассказать мне, почему данные не одинаковы? – Neko

+0

Я использую RNCryptor и, кажется, получаю ужасно медленные скорости дешифрования, например 5-10 секунд, чтобы дешифровать, как 400 простых строк. –

1

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

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

+0

@Neko Вау, я не очень хорошо смотрел на код. Вы не можете просто конкатенировать зашифрованные байты из отдельных шифров. Возможно, полные блоки в ЕЦБ, но даже это сломленное мышление. Марцин: +1 – zaph

 Смежные вопросы

  • Нет связанных вопросов^_^