процедуры цифрового конверта: EVP_DecryptFinal_ex: плохая расшифровка - PullRequest
0 голосов
/ 26 мая 2019

Я пытаюсь создать программу на Python, которая запускает команды OpenSSL для шифрования и дешифрования файлов.

В командной строке я сделал:

vagrant@vagrant:~$ openssl enc -aes256 -base64 -k $(base64 alice_shared_secret.bin) -e -in plain.txt -out cipher.txt
vagrant@vagrant:~$ openssl enc -aes256 -base64 -k $(base64 bob_shared_secret.bin) -d -in cipher.txt -out plain_again.txt

И это работает. Однако, если я зашифрую текст с помощью программы на Python, я не смогу расшифровать.

vagrant@vagrant:~$ openssl enc -aes256 -base64 -k $(base64 bob_shared_secret.bin) -d -in cipher.txt -out plain_again.txt
bad decrypt
140321401345688:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:529:

В чем разница между моей программой и шифром командной строки?

Код:

#!/System/Library/Frameworks/Python.framework/Versions/2.6/bin/python
openssl         = '/usr/bin/openssl'
from subprocess import Popen, PIPE, STDOUT

def encrypt():
  arguments = [
    openssl,
    'enc',
    '-aes256',
    '-base64',
    '-k',
    '$(base64 alice_shared_secret.bin)',
    '-e', 
    '-in',
    'plain.txt',
    '-out',
    'cipher.txt',
  ]

  execute = Popen(arguments, stdout=PIPE)
  out, err = execute.communicate()

encrypt()

Любая помощь?

1 Ответ

1 голос
/ 26 мая 2019

AFAIK, вы не можете использовать интерполяцию строк оболочки из параметров Popen (ваше выражение "$ (...)"). Попробуйте напрямую закодировать данные base64, и все будет работать нормально:

import base64

with open('secret.bin') as x: secret = x.read()

def encrypt():
  arguments = [
    openssl,
    'enc',
    '-aes256',
    '-base64',
    '-k',
    base64.b64encode(secret),
    '-e', 
    '-in',
    'plain.txt',
    '-out',
    'cipher.txt',
  ]
...