Не-Unicode символы при расшифровке строки AES через Python? - PullRequest
0 голосов
/ 07 июля 2019

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

Я объединил код в свой собственный скрипт, который принимает параметры для зашифрованного текста иключ, и должен выводить пароль в виде простого текста.Тем не менее, я возвращаюсь к бессмысленным персонажам и не знаю почему.

Функция шифрования:

def encrypt(plaintext, key):
    """
    Encrypt the plaintext with AES method.

    Parameters:
        plaintext -- String to be encrypted.
        key       -- Key for encryption.
    """

    iv = os.urandom(iv_size)
    cipher = Cipher(AES(pad(key)), CFB8(iv), default_backend())
    encryptor = cipher.encryptor()

    # If user has entered non ascii password (Python2)
    # we have to encode it first
    if isinstance(plaintext, six.text_type):
        plaintext = plaintext.encode()

    return base64.b64encode(iv + encryptor.update(plaintext) +
                            encryptor.finalize())

Мой код:

#!/usr/bin/env python
from __future__ import division
import sys
import os
import hashlib
import base64
import six
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher
from cryptography.hazmat.primitives.ciphers.algorithms import AES
from cryptography.hazmat.primitives.ciphers.modes import CFB8

padding_string = b'}'
iv_size = AES.block_size // 8
ciphertext = sys.argv[1]
key = sys.argv[2]

def decrypt(ciphertext, key):
    """
    Decrypt the AES encrypted string.

    Parameters:
        ciphertext -- Encrypted string with AES method.
        key        -- key to decrypt the encrypted string.
    """
    # ciphertext = unicode(ciphertext)
    print 'Initial crypt text: ' + ciphertext
    ciphertext = base64.b64decode(ciphertext)
    print 'After base64: ' + ciphertext
    iv = ciphertext[:iv_size]
    print 'After IV call: ' + iv
    print '--------------------------'
    cipher = Cipher(AES(pad(key)), CFB8(iv), default_backend())
    decryptor = cipher.decryptor()
    decrypted_hash = decryptor.update(ciphertext[iv_size:]) + decryptor.finalize()
    print decrypted_hash
    return decrypted_hash

def pad(key):
    """Add padding to the key."""

    if isinstance(key, six.text_type):
        key = key.encode()

    # Key must be maximum 32 bytes long, so take first 32 bytes
    key = key[:32]

    # If key size is 16, 24 or 32 bytes then padding is not required
    if len(key) in (16, 24, 32):
        return key

    # Add padding to make key 32 bytes long
    return key.ljust(32, padding_string)

if __name__ == '__main__':
    hash1 = decrypt(ciphertext, key)
    # final_hash = unicode(hash1, errors='replace')
    print 'Final Hash is: ' + hash1

Я отладил весь путь до первоначального вызова base64, как вы можете видеть изprint заявления.Даже после первоначального вызова base64 он по-прежнему печатает тарабарщину.

Указанные переменные:

зашифрованный текст: utUU0jkamCZDmqFLOrAuPjFxL0zp8zWzISe5MF0GY/l8Silrmu3caqrtjaVjLQlvFFEgESGz

ключ: R_EFY1hb236guS3jNq1aHyPcruXbjk7Ff-QwL6PMqJM=

Я что-то здесь упускаю?

...