2014-01-07 1 views
3

JS의 CryptoJS를 사용하여 파이썬 crypto.CipherAES의 cryptojs에서 암호화 및 파이썬에서 해독 Crypto.Cipher

를 사용하여이 JS 내 구현, 암호화 된 메시지 APPEND의 IV이라고 해독하고 64 기수로 인코딩 암호화와 함께 문제를 얻기

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> 
<script> 
    var message='Secreat Message to Encrypt'; 
    var key = CryptoJS.enc.Hex.parse('824601be6c2941fabe7fe256d4d5a2b7'); 
    var iv = CryptoJS.enc.Hex.parse('1011121314151617'); 

    var encrypted = CryptoJS.AES.encrypt(message, key, { iv: iv, mode: CryptoJS.mode.CBC }); 
    encrypted =encrypted.toString(); 


    encrypted = iv+encrypted; 
    encrypted = btoa(encrypted); 
    console.log('encrypted',encrypted);  
    alert(encrypted); 

    // var decrypted = CryptoJS.AES.decrypt(encrypted, key, { iv: iv, mode: CryptoJS.mode.CBC }); 
    // console.log('decrypted', decrypted); 
    //alert(decrypted.toString(CryptoJS.enc.Utf8)); 
</script> 

및 AES 암호화 및 암호 해독 파이썬 스크립트 제가

#!/usr/bin/python 

import os, random, struct 
from Crypto.Cipher import AES 
from Crypto import Random 
import base64 
class AESCipher: 
    def __init__(self, key): 
     BS = 16 
     self.pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) 
     self.unpad = lambda s : s[0:-ord(s[-1])] 
     self.key = self.pad(key[0:16]) 

    def encrypt(self, raw): 
     raw = self.pad(raw) 
     iv = "1011121314151617" 
     cipher = AES.new(self.key, AES.MODE_CBC, iv) 
     return base64.b64encode(iv + cipher.encrypt(raw)) 

    def decrypt(self, enc): 
     enc = enc.replace(' ', '+') 
     enc = base64.b64decode(enc) 
     iv = enc[:16] 
     cipher = AES.new(self.key, AES.MODE_CBC, iv) 
     return self.unpad(cipher.decrypt(enc[16:])) 


def main():  

    cipher = AESCipher('824601be6c2941fabe7fe256d4d5a2b7') 
    encrypteddata =cipher.encrypt(''Secreat Message to Encrypt'') 
    print encrypteddata   

    decryptdata =cipher.decrypt(encrypteddata) 
    print decryptdata 

main() 

하지만 동일한 IV 메시지 및 K를 사용 ey 파이썬 및 js에서 다른 암호화 된 메시지를 생성합니다.

파이썬 암호 해독과 호환되는 JavaScript에는 어떤 문제가 있습니까?

둘 다 AES.MODE_CBC를 사용하고 둘 다 Pkcs7 패딩을 사용한다고 가정합니다. 하드 코딩 된 코드는 지금 무작위로 생성됩니다.

+0

CryptoJS.AES.encrypt() base64도 출력을 인코딩합니까? 당신의 js 코드에서 base64로 인코딩 된 AES를 반환하기 때문에. –

+0

CryptoJS.AES.encrypt()에 iv를 추가하여 암호화 된 메시지를 iv + 암호화 한 다음 python 암호화와 일치하도록 base64 인코딩을 수행 "base64.b64encode (iv + cipher.encrypt (raw))" – UdayaLakmal

+0

죄송합니다. btoa() 호출. 흠 .. –

답변

0

실제로 AES의 블록 크기 인 16 바이트와 같은 크기를 가진 IV를 시도하십시오. 현재 16 진수로 8 바이트를 지정하고 있습니다. CBC 모드는 블록 크기와 동일한 크기의 IV가 필요하며 Python API는 다음을 지정합니다 (최종 오타 포함).

다른 모든 모드의 경우 block_size 바이트 길이 여야합니다.

위와 같은 방법 또는 (미리 정의 된) 상수를 사용하는 것이 가장 좋습니다.

+0

은 '101112131415161718191a1b1c1d1e1f'로 iv를 사용하지만 파이썬에서 해독하려고하면 "입력 문자열은 길이가 16의 배수 여야합니다"같은 결과가 나타납니다. iv = CryptoJS.enc.Utf8.parse ('7061737323313233'); – UdayaLakmal

+0

파이썬은 IV에 대해 16 진수를 기대합니까? 아니면 바이트를 예상합니까? IV (및 키?)를 16 진수로 디코드해야 할 수도 있습니다. –