2011-09-27 7 views
2
내가 (M2Crypto와) 파이썬 (I ​​실제로 여기)이 library

해독 자바

내 코드와 함께 자바에서 생성 된 암호화 된 메시지의 암호를 해독하기 위해 노력하고있어

을에서 암호화 된 메시지는 암호화 해독 메시지를 작동 그 자체가 아니라 자바의 라이브러리에서, 나는 다음과 같은 오류 얻을 : 나는 두 * aes_128_cbc *와 * aes_128_ecb * 시도

EVPError: 'wrong final block length' 

와 나는 같은 오류가 발생합니다.

Java의 결과는 Ascii의 코드이며 Python의 코드는 다른 인코딩 (base64와 작동 함)을 기대하지만 Python의 코드에서 변경을 수행 할 위치를 알 수 없다고 생각합니다. 다른 Python 암호화 라이브러리를 사용할 수 있습니다.

감사

import M2Crypto 
from base64 import b64encode, b64decode 

ENC=1 
DEC=0 

def AES_build_cipher(key, iv, op=ENC): 
    """""""" 
    return M2Crypto.EVP.Cipher(alg='aes_128_cbc', key=key, iv=iv, op=op) 

def AES_encryptor(key,msg, iv=None): 
    """""" 
    #Decode the key and iv 
    key = b64decode(key) 
    if iv is None: 
     iv = '\0' * 16 
    else: 
     iv = b64decode(iv) 

    # Return the encryption function 
    def encrypt(data): 
     cipher = AES_build_cipher(key, iv, ENC) 
     v = cipher.update(data) 
     v = v + cipher.final() 
     del cipher 
     v = b64encode(v) 
     return v 
    print "AES encryption successful\n" 
    return encrypt(msg) 

def AES_decryptor(key,msg, iv=None): 
    """""" 
    #Decode the key and iv 
    key = b64decode(key) 
    print key 
    print 
    if iv is None: 
     iv = '\0' * 16 
    else: 
     iv = b64decode(iv) 

    # Return the decryption function 
    def decrypt(data): 
     data = b64decode(data) 
     cipher = AES_build_cipher(key, iv, DEC) 
     v = cipher.update(data) 
     v = v + cipher.final() 
     del cipher 
     return v 
    print "AES dencryption successful\n" 
    return decrypt(msg) 

if __name__ == "__main__": 
    result = AES_decryptor(b64encode(SECRET_KEY), msg=encrypted_message) 

답변

1

"코드 ASCII"는 무엇을 의미합니까? 아시다시피, 내 코드는 base64 입력을 예상하고 base64 출력을 생성했습니다. b64decodeb64encode에 대한 호출을 encryptdecrypt 함수로 제거하면 원시 데이터를 전달할 수있게되며 Java에서 입력을 원시 바이트로 디코딩 할 수 있습니다.

+1

맞습니다. 모든 b64encode/decode 호출을 삭제했지만 코드가 사용하는 CBC가 아닌 ECB 모드에서 Java JCE 암호화 결과와 일치하도록 일부 변경했습니다. 또한 * key.decode ("hex") *와 * v = v.encode ("hex") *에 대해 * v = b64encode (v) *를 암호화 방법으로 대체했습니다. . – Imanol