2013-07-02 2 views
-1

노드에 이식해야하는 파이썬에서 암호 해독 코드가 있습니다. 나는 암호 해독 권리를 얻는 것을 보일 수없고 나는 미쳤다.Node.js AES 암호 해독

내 파이썬 코드는 다음과 같습니다

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이다.

나는 노드와 자바 스크립트에 매우 익숙하지 않아서 미안하다.

어떻게 든 똑같은 내가 지금까지 노드에 대해 다음과 같은 한 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

당신은 (원본, 파이썬) 코드가 안전하지 않다는 것을 알고 있습니까? 암호 모드에 대한 위키 백과 사전을보세요, ecb. –

+0

암호화는 마이크로 컨트롤러에서 수행됩니다. 우리는 더 나은 것을 사용하기에 충분한 기억이 없었습니다. 암호화 된 데이터는 작아서 하나의 블록이됩니다. –

+0

"작동하지 않습니다"라고 말하지 마십시오. 샘플 데이터와 예상되는 결과를 알려주고, 에러 나 잘못된 결과를 설명하십시오. – abarnert

답변

3

아무도는 자바 스크립트 단지 포트 파이썬 코드를 것입니다. 특히 비정상적으로 파이썬이 아닌 Python 코드 (대신에 foo = lambda blah을 쓰는 이유는 무엇입니까?). 여기

그러나이 시작하는 방법은 다음과 같습니다

Node.js를 너무 놀라 울 정도로 유사한 사용중인 PyCrypto 모듈 기능에없는 crypto라는 모듈이 제공됩니다.

노드 모듈에는 파이썬과 달리 암호화 및 해독을위한 별도의 객체가 있습니다. 암호를 생성하는 함수는 crypto.createCipher이며 암호 해독 암호는 crypto.createDecipher입니다.

설명서에서 말한 것처럼 해당 함수에서 가져온 객체는 읽기 - 쓰기 스트림입니다. 암호화 된 데이터를 Decipher 스트림에 쓰고 암호 해독 된 데이터를 읽습니다. 한편


, 파이썬 코드의이 터무니없이 어리석은 라인 :

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

당신이, 실행하는 것을 알 수 있습니다

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

은 ... 당신이 이런 식으로 쓰면 읽는 것이 더 쉬울 것입니다 들어오는 16 진수 데이터에 두 가지. 그러나 시도한 동등한 노드 코드는 두 가지 중 하나만 수행합니다. 그것은 작동하지 않을 것입니다.노드 코드의 새 버전에서


, 당신은이 작업을 수행 :

bindata = hexdata.decode("hex") 

그것은 분명히 아무튼 '분명히 파이썬과 같은 일을하기로했다

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

왜냐하면 당신은 어디에도 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 당신은 아무것도 unhexlified하지 않은 자리 5 등이다. 파이썬 버전에 비교 :

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

을 여기에서 첫 번째 문자는 다음이 \x81입니다 \xe5이다. 그것이 당신이 원하는 것입니다.

그리고 내가 왜 Buffer이 필요하다고 생각하는지 확신 할 수 없습니다. 위에 링크 된 문서를 읽으면 "'binary', 'base64' 또는 'hex'"입력 및 출력 인코딩을 Decipher 방법으로 직접 전달할 수 있음을 분명히 보여줍니다.

+0

저는 지금 몇 시간 동안 그 노력을 해왔습니다. 항상 해독 오류가 발생합니다. 나는 원래 파이썬 코드를 작성하지 않았다. 노드에 대해 내가 지금까지 사용하고있는 것이지만 뭔가를 놓치고 있어야합니다. –

+0

나는 당신의 제안에 파이썬을 변경하고 새로운 코드로 질문을 편집 한 노드에 몇 가지 변경을 시도했다. 여전히 잘못된 암호 해독 오류가 발생했습니다 –

+0

어디에서 새 암호 (암호문, '바이너리')를 가져 왔습니까? 그건 당신의 16 진수 데이터를 unhexlify하지 않으며, 왜 그렇게 생각할 지 이해하지 못합니다. 그리고 만약 여러분이 어떤 종류의 디버깅 (예를 들어, Node에서'console.log (BinCipher)'와 파이썬에서'print repr (bindata)')을 수행했다면 똑같은 일을하지 않았을 것입니다. 이해하지 못하는 임의의 위치에서 선을 복사하여 붙여 넣기 만하면 코드를 작성할 수 없습니다. – abarnert