2017-11-09 1 views
0

자바 스크립트로 암호화하는 데 SJCL (Stanford Javascript Crypto Library)을 사용하고 있으며 자바에서 암호 해독을 구현해야합니다.자바 스크립트에서 AES-GCM 암호화, Java에서 해독

는 암호화 코드는 다음과 같습니다

<script src='https://cdnjs.cloudflare.com/ajax/libs/sjcl/1.0.7/sjcl.js'></script> 

<script> 
var keyString = '2d73c1dd2f6a3c981afc7c0d49d7b58f'; 
var key = sjcl.codec.base64.toBits(keyString); 
var cipher = new sjcl.cipher.aes(key) 
var data = sjcl.codec.utf8String.toBits('Hello Crypto!'); 
var salt = sjcl.codec.base64url.toBits('kLME6vN-WdU_W9XVN9a1Z3E_p8HQ5C7X1La-3ZjEml1ytVRMfvtEXzeapbce2LjFI1dHEGtWv9bZ_U6K2CG1-K4lQPunFXWxXmsTQIXlGfwmpveg2AFeLFiqGmALnfbP'); 
var encrypted = sjcl.encrypt(keyString,'Hello Crypto!',{mode:'gcm',salt:salt}); 

console.log(encrypted) 
</script> 

결과 암호화의 모습을 다음과

{ 
    "iv":"+xmg3yZF/LSWNFpXf03wUw==", 
    "v":1, 
    "iter":10000, 
    "ks":128, 
    "ts":64, 
    "mode":"gcm", 
    "adata":"", 
    "cipher":"aes", 
    "salt":"kLME6vN+WdU/W9XVN9a1Z3E/p8HQ5C7X1La+3ZjEml1ytVRMfvtEXzeapbce2LjFI1dHEGtWv9bZ/U6K2CG1+K4lQPunFXWxXmsTQIXlGfwmpveg2AFeLFiqGmALnfbP", 
    "ct":"Nq+9tXfc0zs0/m3OfDp0MmTXc9qD" 
} 
우리는 코드를 해독하는 샘플 자바 코드와 함께 제공되었지만이 코드가 있다고 가정

IV 소금도 똑같습니다. 그래서 JS lib (IV와 salt를 별도의 값으로 사용하는 JSON)에서 작동하지 않습니다 :

final byte[] symKeyData = DatatypeConverter.parseHexBinary(keyHex); 
final byte[] ivData = ivSalt.getBytes(Charset.forName("UTF-8")); 
final byte[] encryptedMessage = DatatypeConverter.parseBase64Binary(encryptedMessageString); 
final Cipher cipher = javax.crypto.Cipher.getInstance("AES/GCM/NoPadding", "BC"); 
final SecretKeySpec symKey = new SecretKeySpec(symKeyData, "AES"); 
final IvParameterSpec iv = new IvParameterSpec(ivData); 
cipher.init(Cipher.DECRYPT_MODE, symKey, iv); 
final byte[] encodedMessage = cipher.doFinal(encryptedMessage); 
final String message = new String(encodedMessage, Charset.forName("UTF-8")); 

JavaScript 라이브러리의 결과 JSON을 Java에서 올바르게 해독 할 수있는 방법을 설명 할 수 있습니까?

+1

이 코드 줄은 무엇을합니까? 'var cipher = new sjcl.cipher.aes (key)' –

답변

3

SJCL 편의 라이브러리는 1000 회 반복 된 PBKDF2를 사용하여 키를 파생시킵니다. 설명서 및 코드는 here입니다. 이 할당의 경우

그러나 :

  • IV가 잘못된 크기이고, 이는 12 바이트가 아니라 16이어야한다;
  • 소금 크기가 너무 큽니다.
  • cipher JavaScript의 변수는 완전히 무시됩니다.
  • 반복 횟수는 기본값으로 유지되며 일반적으로 너무 낮습니다.

그래서 누가 작성했는지는 알 수 없지만 그러한 코드를 공개해서는 안됩니다.

소금은 PBKDF2에 사용되며 IV는 대칭 암호 용이므로 동일한 것은 아닙니다.

+1

나는 Maarten에 동의한다. 이것은 좋은 코드가 아니므로 누군가 그것을 사용하기 위해 두려워서 사용하거나 공유하지 말아야한다. 클라이언트 쪽에서 SJCL을 사용하면 프로덕션 응용 프로그램에서 사용해서는 안되며, 오늘날 클라이언트 쪽에서는 WebCrypto를 사용합니다. – rmhrisk

+0

태그 길이 64 비트는 비표준이며 Oracle 공급자가 지원하지 않습니다. 그것은 Bouncycastle에 의해 지원되는 것으로 보이지만 상관없이 나는 암호문을 해독 할 수 없었다. –

+0

@JamesKPolk 태그 크기가 확실합니까? 64 비트가 명시 적으로 언급 됨 [here] (https://docs.oracle.com/javase/7/docs/api/javax/crypto/spec/GCMParameterSpec.html) –

관련 문제