1

java 코드를 nodej로 변환하려고합니다. 여기javax.crypto.Cipher Nodejs의 동일한 코드 Crypto Javascript

public static String encrypt(String accessToken) throws Exception { 
     Cipher cipher = Cipher.getInstance("AES"); 
     String merchantKey = "11111111111111111111"; 
     String st = StringUtils.substring(merchantKey, 0, 16); 
     System.out.println(st); 
     Key secretKey = new SecretKeySpec(st.getBytes(), "AES"); 
     cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
     byte[] encryptedByte = cipher.doFinal(accessToken.getBytes()); 

     // convert the byte to hex format 
     StringBuffer sb = new StringBuffer(); 
     for (int i = 0; i < encryptedByte.length; i++) { 
      sb.append(Integer.toString((encryptedByte[i] & 0xff) + 0x100, 16).substring(1)); 
     } 
     return sb.toString(); 
    } 

내가

function freeChargeEncryptAES(token){ 
    var fcKey = "11111111111111111111".substring(0, 16); 
    var cipher = crypto.createCipher('aes-128-ecb', fcKey, ""); 
    var encrypted = cipher.update(token,'ascii','hex'); 
    encrypted += cipher.final('hex'); 
    return encrypted; 
} 

내가 같은 출력을 얻을 수 아니에요 OUT- 알 수 있었던 것입니다. 예를 들어

토큰 = "ABCDEFGH"

자바 코드 출력하는 경우 - bc02de7c1270a352a98faa686f155df3

Nodejs 코드 출력 - eae7ec6943953aca94594641523c3c6d

나는 기본적으로 암호화 알고리즘이라고 this answer에서 읽었습니다 aes-ecb IV가 필요하지 않습니다. 키 길이가 16이므로, aes-128-ecb (16 * 8 = 128)은 사용해야하는 알고리즘입니다.

누군가가 문제를 파악하는 데 도움을 줄 수 있습니까 ??

crypto.createCipher('aes-128-ecb', fcKey, "");

이유는 간단하다

crypto.createCipheriv('aes-128-ecb', fcKey, "");

- 투 -

+0

** 절대로 [ECB 모드] (http://crypto.stackexchange.com/q/14487/13022) **를 사용하지 마십시오. 결정 론적이며 따라서 의미 론적으로 안전하지 않습니다. 적어도 CBC (http://crypto.stackexchange.com/q/22260/13022) 또는 [CTR] (http://crypto.stackexchange.com/a/2378/)와 같은 무작위 모드를 사용해야합니다. 13022). [패딩 오라클 공격] (http://crypto.stackexchange.com/q/18185/13022)과 같은 공격이 불가능하도록 암호문을 인증하는 것이 좋습니다. GCM 또는 EAX와 같은 인증 된 모드 나 [암호화 후 MAC] (http://crypto.stackexchange.com/q/202/13022) 구성표를 사용하여이 작업을 수행 할 수 있습니다. –

+0

IV는 예측 불가능해야합니다 (읽기 : 임의). 고정 IV를 사용하지 마십시오. 이는 암호화를 결정 론적으로 만들고 따라서 의미 론적으로 안전하지 않기 때문입니다. 암호문을 관찰하는 침입자는 동일한 메시지 접두어가 언제 전에 전송되었는지를 결정할 수 있습니다. IV는 비밀이 아니므로 암호문과 함께 보낼 수 있습니다. 대개 암호문 앞에 붙이고 해독하기 전에 잘라낸 것입니다. –

+0

@ArtjomB. , 정보 주셔서 감사하지만 내 유스 케이스가 다릅니다. 위의 자바 코드를 nodej로 변환하고 싶습니다. java 구현은 알고리즘을 지정하지 않지만 기본적으로 Oracle Java JCE 공급자는 ECB를 사용합니다. –

답변

0

그냥 변경할 필요 createCipher 방법은 두 번째 매개 변수 A를 취급 s Encryption Password 인 반면 Encryption Key입니다.

악의적인데, this answer을 읽은 후에도 잘못된 방법 (crypto.createCipheriv 대신 crypto.createCipher)을 사용했습니다. 아래는 nodejs에서 올바른 작업 코드입니다. 그것은 모두 필요했습니다.

function freeChargeEncryptAES(token){ 
    var fcKey = "11111111111111111111".substring(0, 16); 
    var cipher = crypto.createCipheriv('aes-128-ecb', fcKey, ""); 
    var encrypted = cipher.update(token,'ascii','hex'); 
    encrypted += cipher.final('hex'); 
    return encrypted; 
}