Криптография Python Fernet AES Шифрование, новые строки, отступы, возврат каретки - PullRequest
0 голосов
/ 12 марта 2019

Я должен зашифровать строку с помощью ключа и сохранить зашифрованный объект как строку, он должен быть надежным, поэтому я решил использовать модуль, обеспечивающий шифрование "Криптография" https://pypi.org/project/cryptography/

Как вывидите, я сделал ряд функций, чтобы упростить использование шифрования Fernet, однако по какой-то причине он не может обрабатывать обратную косую черту, переводы строки, отступы и возврат каретки, результирующее дешифрование отличается от исходной строки, тестовая строка здесь "t\n\t"

from cryptography.fernet import Fernet
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import base64

def encrypt_string(string_, password, f = None):
    if f is None:
        f = get_fernet_(password)
    try:
        return str(f.encrypt(string_.encode()))[2:- 1]
    except:
        return None

def decrypt_string(string_, password, f = None):
    if f is None:
        f = get_fernet_(password)
    try:
        return str(f.decrypt(string_.encode()))[2:- 1]
    except:
        return None

def get_fernet_(password):
    if password and isinstance(password,str):
        kdf = PBKDF2HMAC(algorithm = hashes.SHA256(),
                         length = 32,
                         salt = password.encode(),
                         iterations = 100000,
                         backend = default_backend())
        key = base64.urlsafe_b64encode(kdf.derive(password.encode()))
        f = Fernet(key)
        return f

def test_encryption(s = "text", password = "key"):
    my_f = get_fernet_(password)
    s2 = encrypt_string(s, password)
    s3 = decrypt_string(s2, password)
    s4 = encrypt_string(s, password, my_f)
    s5 = decrypt_string(s4, password, my_f)
    if s == s3 and s == s5:
        return True
    return False

print (test_encryption("text"))
True

print (test_encryption("t\n\t"))
False

Если кто-нибудь может предоставить решение для этого конкретного кода или другой алгоритм шифрования, который может делать то, что мне нужно

1 Ответ

1 голос
/ 13 марта 2019

Проблема в том, что вы пытаетесь преобразовать объект bytes в string, используя литерал str вместо метода bytes.decode():

from cryptography.fernet import Fernet

# Im just using a random key for simplicity
key = Fernet.generate_key()
f = Fernet(key)

mystr = 'hi\tthere'

enc = f.encrypt(mystr.encode()) # str.encode() creates a bytes object
dec = f.decrypt(enc)

str(dec)
# "b'hi\\tthere'"
# This is NOT the same, use decode

mystr==str(dec[2:-1]) # returns False
mystr==dec.decode() # returns True

dec.decode()
# 'hi\tthere' 

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...