Является ли AES одинаковым в библиотеках PyCrypto & Node.JS Crypto - PullRequest
3 голосов
/ 18 марта 2011

Я начинаю задаваться вопросом, отличается ли реализация 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')

Который выплевывает кучу мусора .... (изменение 'двоичного' на hex / utf8 не помогает)

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

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

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

Ответы [ 5 ]

1 голос
/ 13 июля 2011

Документация не упоминает об этом, но aeskey, который вы передаете crypto.createDecipher, это не ключ , а пароль, обработанный для функции EVP_BytesToKey OpenSSL.

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

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

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

0 голосов
/ 02 февраля 2012

Убедитесь, что вы используете один и тот же ключ и 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 в гекс

0 голосов
/ 18 марта 2011

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

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

Что означает ваш ciphertext похоже? Это шестнадцатеричная строка? Если это так, то вам нужно сделать

buf = decipher.update(buf, 'hex', 'binary')
0 голосов
/ 19 марта 2011

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

0 голосов
/ 18 марта 2011

AES является стандартом rijndael.Это не должно быть иначе.Вы должны посмотреть на типы данных и настройки по умолчанию, которые скрыты.Что-то должно быть установлено по-другому между этими двумя.Размеры клавиш могут отличаться, так как 128-битный "привет" дополнен нулями, я думаю, и меньший ключ будет начинаться с "привет", но будет иметь меньший отступ, поэтому отличается.

...