Одинаков ли AES в библиотеках PyCrypto и Node.JS Crypto

Я начинаю задаваться вопросом, отличается ли реализация AES в разных библиотеках.

В настоящее время у меня есть открытый текст, зашифрованный с помощью PyCrypto.
Я пытаюсь расшифровать зашифрованный текст с помощью криптографической библиотеки Node.js ..

В основном с PyCrypto .. Я использую AES-128-CBC со случайным сгенерированным IV. (который отлично расшифровывается в PyCrypto)

Однако ..
На Node.js я это делаю

var buf = new Buffer(ciphertext)
var decipher = crypto.createDecipher('aes-128-cbc',aeskey)
buf = decipher.update(buf,'binary', 'binary')
buf += decipher.final('binary')

Что выплевывает кучу мусора .... (изменение двоичного файла на шестнадцатеричный / utf8 не помогает)

Поскольку я использую CBC (Cipher Block Chaining) ...
я добавляю IV в начало зашифрованного текста (16 блоков) .. В PyCrypto это работает отлично, аналогично спецификации использования PGP, CFB ..

Кто-нибудь знает по какой причине это не работает ???

Ожидаю ли я слишком многого от стандартных библиотек Node.js?


person Arenstar    schedule 17.03.2011    source источник
comment
Кто-нибудь знает другие модули, которые могут справиться с этой задачей ??   -  person Arenstar    schedule 18.03.2011


Ответы (5)


В документации это не упоминается, но aeskey, который вы передаете crypto.createDecipher, - это не ключ, а пароль, обрабатываемый для OpenSSL _ 3_.

Для передачи фактических необработанных данных ключа следует использовать (в настоящее время недокументированную) функцию crypto.createDecipheriv(cipher, key, iv). Это относится и к режиму ECB, хотя в ECB нет IV.

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

Я столкнулся с подобной проблемой здесь: https://github.com/joyent/node/issues/1318

person drdaeman    schedule 13.07.2011

AES - это стандарт риндаля. Не должно быть иначе. Вам следует изучить скрытые типы данных и настройки по умолчанию. Между ними должно быть что-то другое. Размеры ключей могут отличаться, так как 128-битное «hello» дополняется нулями, я думаю, а меньший ключ должен начинаться с «hello», но иметь меньшее заполнение, следовательно, другое.

person Will03uk    schedule 17.03.2011
comment
Что ж ... Кажется, есть ошибка .... groups.google.com/group/nodejs-dev/browse_thread/thread/ - person Arenstar; 18.03.2011

Краткий ответ на ваш вопрос: да, AES одинаков в модуле crypto PyCrypto и Node.js. crypto узла - это просто оболочка для openssl в вашей системе, а PyCrypto совместим с OpenSSL (см. http://lists.dlitz.net/pipermail/pycrypto/2010q4/000301.html).

Сказав это, определенно есть ошибки в модуле Node crypto (хотя я сам испытывал проблемы только с кодировкой base64). Итак, является ли это ошибкой или нет, проблемы, с которыми вы сталкиваетесь, почти наверняка возникают на этапах кодирования / декодирования данных.

Как выглядит ваш ciphertext? Это шестнадцатеричная строка? Если да, то нужно сделать

buf = decipher.update(buf, 'hex', 'binary')
person Trevor Burnham    schedule 18.03.2011
comment
Для ясности ... прочтите это .. groups.google.com/group/nodejs / browse_thread / thread / Ура! - person Arenstar; 18.03.2011
comment
Я только что создал новую библиотеку для шифрования / дешифрования в Node, потому что меня тоже беспокоят криптографические проблемы: github.com / TrevorBurnham / cipherpipe Это просто тонкая обертка вокруг openssl. Попробуйте и дайте мне знать, что вы думаете. - person Trevor Burnham; 18.03.2011
comment
npm ERR! 404 Похоже, что «cipherpip» отсутствует в реестре npm. npm ERR! 404 Вы должны ошибиться с автором, чтобы опубликовать его. :( ... Я бы хотел попробовать это - person Arenstar; 18.03.2011
comment
Упс, забыл npm publish. Прости за это. Попробуйте снова. - person Trevor Burnham; 19.03.2011
comment
/usr/local/lib/node/.npm/cipherpipe/0.1.0/package/lib/cipherpipe.js:6 return '' + str.replace (/ \\ / g, '\\\\'). replace (// g, '\\') + ''; ^ TypeError: Невозможно вызвать метод replace of undefined ... я не могу использовать ваш метод frombase64 ... Использование base64, как в моем примере, и попытка декодирования Aes .. приводит к возвращению .. undefined :( - person Arenstar; 19.03.2011
comment
Не могли бы вы поднять вопрос на Github, чтобы мы могли решить его там? Спасибо. - person Trevor Burnham; 19.03.2011
comment
Думаю, теперь проблемы исправлены. Поверните его еще раз (с версией 0.1.1) и поднимите вопрос на Github, если он все еще огорчает вас. - person Trevor Burnham; 19.03.2011

Это не то, как IV работает в Node, вместо этого вам нужно использовать crypto.createDecipheriv (cipher, key, iv), иначе вы получите встроенный по умолчанию. Даже в PyCrypto вы должны использовать третий аргумент AES.new как IV, а не вставлять его в байтовый поток.

person SilverbackNet    schedule 19.03.2011
comment
В Node 0.4.2 нет упоминания об использовании IV ??? Если вы посмотрите на дизайн CBC, вы поймете, добавив его в начало и используя нули, поскольку IV будет правильно запускать цепочку ... оставляя мусорный блок в начале ... Это похоже на то, как работает pgp .. - person Arenstar; 19.03.2011
comment
Хм, я нашел в коде crypto.createDecipheriv (cipher, key, iv) .. Однако он все еще не работает :( - person Arenstar; 19.03.2011

Убедитесь, что вы используете один и тот же ключ и IV в pycrypto и node.js !! Не только это, но убедитесь, что у вас одинаковая кодировка на обоих концах:

cipher = AES.new(key.decode('hex'), AES.MODE_CBC, iv.decode('hex'))
text = json.dumps(payload)  
pad = lambda s: s + (16 - len(s) % 16) * '\x07'     
encryptedText = base64.b64encode(cipher.encrypt(pad(text)))

Затем в node.js (извините, сейчас нет легкого доступа к этому коду) также убедитесь, что вы декодируете свой ключ и iv в шестнадцатеричный

person Ricardo Villamil    schedule 01.02.2012