2013-07-02 140 views
-1

我有一些解密代碼需要在Python中移植到節點。我似乎無法獲得解密權,而且我瘋了。Node.js AES解密

我的Python代碼:

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(); 

從我的文檔的理解另一個更新

請幫助我越來越絕望。

非常感謝

強尼

+0

你意識到你的(原始,python)代碼是不安全的,對吧?看看維基百科關鍵詞的密碼模式,ecb。 –

+0

加密在微控制器上執行。我們沒有足夠的內存來更好地使用任何東西。加密的數據非常小,最終成爲一個塊 –

+0

不要只說「它不工作」。給我們一些樣本數據和你期望的輸出結果,描述你得到的錯誤或者不正確的結果等等。 – abarnert

回答

3

沒有人會只端口Python代碼爲JavaScript。特別是你的奇怪的非pythonic Python代碼(爲什麼你會做foo = lambda blah而不是僅僅def foo(blah)?)。

但這裏是如何開始:

的Node.js自帶了一個叫做crypto模塊是,不要太奇怪,類似的功能,您使用的PyCrypto模塊。

與Python不同,Node模塊具有用於加密和解密的單獨對象。創建密碼的功能稱爲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) 

你可能會注意到它兩個東西到傳入的十六進制數據。但是你嘗試的等效節點代碼只能做這兩件事中的一件。這不太可能。


在新的節點代碼的版本,你這樣做:

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

你從哪裏得到這個新緩衝區(密文,'二進制')?這並沒有解除你的十六進制數據的限制,我不明白你爲什麼會這麼想。如果你進行過任何類型的調試(例如,Node中只有'console.log(BinCipher)',Python中有'print repr(bindata)'),那麼很明顯他們不會做同樣的事情。你不能通過從任意你不明白的地方複製和粘貼線來編寫代碼。 – abarnert