2014-02-09 1 views
4

I했습니다 가지고 내가 Node.js를 포트에 원하는 다음 Java 코드 :포팅 AES 자바 코드는 Node.js를 위해 해독

// Java 

byte[] rawKey = "deadbeefdeadbeef".getBytes("us-ascii"); 
SecretKeySpec skeySpec = new SecretKeySpec(rawKey, "AES"); 
Cipher cip = Cipher.getInstance("AES/ECB/NoPadding"); 
cip.init(Cipher.DECRYPT_MODE, skeySpec); 
byte[] plaintext = cip.doFinal(ciphertext, 0, ciphertext.length); 

여기 스트림

를 사용하여, Node.js를 내 시도이다
// JS, using the crypto streams API 

var decipher = crypto.createDecipher('aes-128-ecb', 'deadbeefdeadbeef'); 
decipher.setAutoPadding(false); 
decipher.pipe(concat(function(plaintext) { console.log(plaintext); }); 
decipher.end(ciphertext); 

그리고, 사용 또한 Node.js를 시도 .update() 나이 .final() API :

// JS, using the `.update()` and `.final()` API 

var decipher = crypto.createDecipher('aes-128-ecb', 'deadbeefdeadbeef'); 
decipher.setAutoPadding(false); 
var pieces = []; 
pieces.push(new Buffer(decipher.update(ciphertext))); 
pieces.push(new Buffer(decipher.final())); 
var plaintext = Buffer.concat(pieces); 

이 두 버전은 정확한 길이 (입력과 동일한 길이)의 동일한 출력을 생성하지만이 출력은 동일한 입력 버퍼에서 작동하는 해독기의 Java 버전에서 생성 된 것과 동일한 일반 텍스트가 아닙니다. 어떻게 위에서 구성된 Java 해독기와 같은 Node.js 해독기를 설정할 수 있습니까?

감사합니다.

+0

JS 코드에서 AES-256을 지정하는 동안 Java 코드에서 AES-128을 사용하는 것처럼 보입니다. JS API가 256 비트 암호 용 128 비트 키를 받아 들일 수있는 방법을 잘 모르겠습니다. 아마도 어떤 종류의 핵심 파생을 수행하고 있습니까? – ntoskrnl

+0

내 코드가 오래된 코드에서 복사/붙여 넣기를했다. 지적 해 주셔서 감사합니다. 나는이 질문을 게시 할 즈음에 많은 것을 알아 냈다. 나는이 문제를 해결 한 이래로 곧 답변을 올릴 것입니다. 하지만 암호에 익숙하지 않고 대답의 의미를 이해하지 못합니다. 'crypto.createDecipheriv ('aes-128-ecb ','deadbeefdeadbeef ',' ');가 트릭을 실행했습니다. –

+0

@ntoskrnl : 예, 잠시 동안 128 비트 키를 사용하여'aes-256-ecb'를 사용하고 있었는데 그렇지 않으면 에러를 표시하거나 표시하지 않았습니다. 원하지 않는 해독 출력을 생성합니다. –

답변

4

createDecipher은 실제로 Java에서와 같이 키를 사용하지 않습니다. 암호를 사용하여 암호 기반 키 유도 함수 (PBKDF)를 으로 변환하여 키를 생성합니다. 따라서 다른 키와 키의 정확성을 검사하는 방법이 없으면 임의의 일반 텍스트가 생성됩니다.

Node.js API의 이름이 적절하지 않은 경우, createDeciphercreateDecipheriv 함수는 후자가 앞의 것과 똑같을 것을 제안하고 IV가 추가됩니다. 대신 createDecipher은 믹스에 전체 키 유도 함수를 추가합니다.

+0

@ dimadima 왜 이렇게 큰 차이가 나는지 알기 때문에 답변 해주었습니다.이 작업을 수행하기 위해 코드를 추가로 변경했는지 알려주십시오. –

+0

고맙습니다. 예, IV 함수로의 변경이 필요했습니다. 구체적으로 말하면 다음과 같습니다 : crypto.createDecip ('aes-128-ecb', 'deadbeefdeadbeef')'->'crypto.createDecipheriv ('aes-128-ecb' , 'deadbeefdeadbeef', '') –

+0

v0.10.35 노드를 사용하면 제안 된 솔루션을 사용할 경우 항상 "node-crypto : Invalid IV length"오류가 발생합니다 (해결 방법은 무엇입니까?) – Skomski