Я работаю над вызовом 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=
Я что-то здесь упускаю?