2013-07-02 3 views
-1

У меня есть код дешифрования в python, который мне нужно портировать на узел. Кажется, я не могу получить право на дешифрование, и я схожу с ума.Node.js AES decryption

Мой питон код:

from Crypto.Cipher import AES 

mode = AES.MODE_ECB 
secret = "9kL8yb/3Tu2czOr5qfiGPgJmx25s+T15" 
cipher = AES.new(secret, mode) 

DecodeAES = lambda c, e: c.decrypt(e.decode("hex")) 
incoming = '813411aa65dcb66802a6e4d5995d8302' 

pre_add = DecodeAES(cipher, incoming) 
print pre_add 

Результат Входящий 0004a38bc14e7533, который является правильным.

Прошу прощения, я очень новичок в узле и javascript.

мне нужно каким-то образом получить точно такую ​​же вещь работает с Node.js

У меня есть следующий за узел до сих пор:

var crypto = require('crypto'); 


var ciphertext = '813411aa65dcb66802a6e4d5995d8302'; 
var key = '9kL8yb/3Tu2czOr5qfiGPgJmx25s+T15'; 
var binkey = new Buffer(key, 'binary'); 


var decipher = crypto.createDecipher('aes-256-ecb', binkey, ''); 
decipher.setAutoPadding(auto_padding=true); 

var dec = decipher.update(ciphertext, 'hex'); 
dec += decipher.final(); 

Очередное обновление от моего понимания документации

Пожалуйста, помогите мне отчаяться.

Большое спасибо

Jonny

+0

Вы понимаете, что ваш (оригинальный, python) код небезопасен, не так ли? посмотрите на wikipedia articule для режимов шифрования, экв. –

+0

Шифрование выполняется на микроконтроллере. Нам не хватало памяти, чтобы использовать что-то лучше. Зашифрованные данные крошечные и заканчиваются тем, что они являются одним блоком. –

+0

Не говорите «не работает». Дайте нам некоторые примеры данных и то, что вы ожидаете от вывода, описываете ошибки или неверные результаты, которые вы получаете, и т. Д. – abarnert

ответ

3

Nobody будет только порт код Python в JavaScript. Особенно ваш странный не-Python код Python (зачем бы вы делали foo = lambda blah вместо def foo(blah)?).

Но вот как начать:

Node.js поставляется с модулем под названием crypto, который, не удивительно, что аналогичный по функциональности модуля PyCrypto вы используете.

Модуль узла имеет отдельные объекты для шифрования и расшифровки, в отличие от Python. Функция создания шифрования называется crypto.createCipher, а для создания расшифровки - crypto.createDecipher.

Как указано в документации, объекты, которые вы возвращаете из этих функций, являются потоками чтения и записи. Вы записываете зашифрованные данные в поток Decipher и читаете дешифрованные данные.


Между тем, это до смешного глупо строка кода Python:

DecodeAES = lambda c, e: c.decrypt(e.decode("hex")) 

..., вероятно, легче читать, если вы пишете так:

def DecodeAES(cipher, hexdata): 
    bindata = hexdata.decode("hex") 
    return cipher.decrypt(bindata) 

Вы можете заметить, что он делает две вещи к входящим шестнадцатеричным данным. Но ваш эквивалентный код Node кода только делает одну из этих двух вещей. Это вряд ли сработает.


В вашей новой версии кода узла, вы делаете это:

var BinCipher = new Buffer(ciphertext, 'binary'); 

Вот по-видимому, должен сделать то же самое, что и Python:

bindata = hexdata.decode("hex") 

Это, очевидно, Безразлично» т, потому что вы не поставили hex в любом месте. Попробуйте распечатать его, чтобы увидеть, что вы получите:

> console.log(BinCipher) 
<Buffer 65 35 38 31 61 63 62 38 33 30 30 64 64 38 34 31 38 33 33 30 30 39 64 65 36 37 33 36 37 35 39 33> 

Очевидно, что 65 это буква e, то 35 это цифра 5 и т.д. Вы не unhexlified ничего. По сравнению с версией Python:

>>> print repr(bindata) 
'\xe5\x81\xac\xb80\r\xd8A\x830\t\xdeg6u\x93' 

Здесь первый символ \xe5, следующий \x81. Это то, что ты хочешь.

И я даже не уверен, почему вы считаете, что вам нужен Buffer. Если вы прочитали документы, которые я связал с ними выше, они ясно показывают, что вы можете передавать «'binary', 'base64' или 'hex'» входные и выходные кодировки прямо к методам Decipher.

+0

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

+0

Я изменил python на ваше предложение и попытался внести некоторые изменения в узел, который я редактировал, задавая новый код. По-прежнему получается ошибка с плохим расшифровкой. –

+0

Где вы получили этот «новый буфер» (ciphertext, 'binary') 'from? Это не отменяет хеш-данные, и я не понимаю, почему вы думаете, что это так. И если вы сделали какую-либо отладку (например, просто «console.log (BinCipher)» в Node и «print repr (bindata)» в Python), было бы довольно очевидно, что они не делали то же самое. Вы не можете писать код, просто копируя и вставляя строки из случайных мест, которые вы не понимаете. – abarnert

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