Расшифровать в Python зашифрованное сообщение на Java - PullRequest
2 голосов
/ 27 сентября 2011

Я пытаюсь расшифровать в Python (с помощью M2Crypto) зашифрованное сообщение, сгенерированное на Java с помощью этой библиотеки

Мой код (который я действительно нашел здесь) работает для расшифровки сообщений, зашифрованныхСам, но не из библиотеки Java, я получаю следующую ошибку:

EVPError: 'wrong final block length'

Я пробовал оба * aes_128_cbc * и * aes_128_ecb *, и я получаю ту же ошибку.

Я думаю,ошибка в том, что результат 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 Ответ

1 голос
/ 27 сентября 2011

Что означает «закодированный ascii»? Как вы знаете, мой код ожидал ввода base64 и вывода base64. Удаление вызовов b64decode и b64encode в функциях encrypt и decrypt позволит вам передавать необработанные данные, а затем вам придется декодировать ввод из Java в необработанные байты.

...