2013-12-11 3 views
9

개발할 코드의 사전 테스트로 CryptoJS를 사용하여 데이터를 인코딩/디코딩하려고합니다. 다음은 암호화에 사용하는 코드입니다.CryptoJS로 문자열의 암호를 해독 할 수 없습니다.

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> 
<script> 
var message = "Secret Message"; 
var key = CryptoJS.enc.Hex.parse('36ebe205bcdfc499a25e6923f4450fa8'); 
var iv = CryptoJS.enc.Hex.parse('be410fea41df7162a679875ec131cf2c'); 

// Encription. Works ok 
var encrypted = CryptoJS.AES.encrypt(
     message,key, 
     { 
      iv: iv, 
      mode: CryptoJS.mode.CBC, 
      padding: CryptoJS.pad.Pkcs7 
     } 
    ); 
console.log('encrypted:'+encrypted.ciphertext.toString()); 
<script> 

이것은 암호 해독에 사용하는 첫 번째 테스트입니다. 그것은 encrypted 매개 변수 CryptoJS.AES.encrypt에 대한 이전 호출의 결과입니다 3f0e590d2617dc7007b89350bd590409

// Decription. Works ok with "encrypted" parameter 
var decrypted = CryptoJS.AES.decrypt(
     encrypted,key, 
     { 
      iv: iv, 
      mode: CryptoJS.mode.CBC, 
      padding: CryptoJS.pad.Pkcs7 
     } 
    ); 
console.log('decrypted:'+decrypted.toString(CryptoJS.enc.Utf8)); 

하자 통지를 돌려 확인을 작동합니다. 그것은 하나의 대상입니다.

// Decription. It fails with manual data 
var manual_data = CryptoJS.enc.Hex.parse('3f0e590d2617dc7007b89350bd590409'); 
var decrypted = CryptoJS.AES.decrypt(
     manual_data,key, 
     { 
      iv: iv, 
      mode: CryptoJS.mode.CBC, 
      padding: CryptoJS.pad.Pkcs7 
     } 
    ); 
console.log('decrypted, by hand:'+decrypted.toString(CryptoJS.enc.Utf8)); 

그것은이 "빈"개체 (위의 예에서 빈 문자열)을 반환 : 내가 직접 문자열을 해독 할 때

내가 가진 문제입니다. CryptoJS.AES.decrypt가 첫 번째 예제의 암호화 된 개체에 저장되지만 두 번째 예제의 wordarray에서 누락 된 일부 데이터가있는 것처럼 보입니다.

왜 이런 일이 일어나는 지 아십니까?

답변

18

저는이 문제에 잠간 동안 고생했습니다. 나는 당신의 문제를 발견했다고 생각합니다. 주된 문제는이 라인 encrypted.ciphertext.toString()입니다. 원하는 것은 단지 encrypted.toString()입니다.

이 개체에 대해 toString 함수가 CryptoJS에 정의되어 있으며 안전하게 전송할 수있는 암호화 된 메시지를 반환합니다. Pw5ZDSYX3HAHuJNQvVkECQ== 대신 3f0e590d2617dc7007b89350bd590409

var encrypted = CryptoJS.AES.encrypt(
    message, 
    key, 
    { 
    iv: iv, 
    mode: CryptoJS.mode.CBC, 
    padding: CryptoJS.pad.Pkcs7 
    } 
); 
console.log('   encrypted: '+encrypted.toString()); 

이 출력됩니다 : 우리는 우리가 이런 식으로 뭔가있을 것이라는 점을 변경한다면. 두 번째 함수가 작동하는 이유는 encrypted.ciphertext.toString()을 사용하지 않기 때문입니다. 실제 객체를 사용하기 때문에 변경되지 않습니다. 마지막 위해 우리는 변화에게 당신이 ciphertext 부분없이 반환하지만, 우리는 또한 CryptoJS.enc.Hex.parse를 제거해야하는 새 텍스트에 사용 된 잘못된 텍스트가됩니다. 나는 네가 여기서 뭘하고 있었는지 정말로 모르지만 네가 그걸로 뭔가를 의미하는지 조사 할 수있다.

var manual_data = 'Pw5ZDSYX3HAHuJNQvVkECQ=='; 
var decrypted = CryptoJS.AES.decrypt(
    manual_data, 
    key, 
    { 
    iv: iv, 
    mode: CryptoJS.mode.CBC, 
    padding: CryptoJS.pad.Pkcs7 
    } 
); 
console.log(' decrypted, by hand: '+decrypted.toString(CryptoJS.enc.Utf8)); 

올바른 정보를 기록해야합니다.

나는 이것을 위해 JSBin을 만들었습니다. JSBin을 처음 사용하기 때문에 올바르게했으면합니다.

+2

덕분에, DutGRIFF, 이것은 까다로운 문제였습니다. :) –

+0

JSBin은 빠르게 작동했습니다 ... 그 일을했습니다. –

관련 문제