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

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

password_provided = 'examplepassword'
kpassword = password_provided.encode()

salt = b'H&\xb6\n\xe6@\xdf\x13\x88\x98 Z\xf0\xea,\xca\x05\xd7\x99\x105\xa8\xa2{\xa9F\xe0\x91\x89c)\xf8%@]"u<\xe03|\xe2\re]\'\xb7\x89O2\xf9\x0bY\xf5\xb6<\x80z\\bM\x8dDx'
kdf = PBKDF2HMAC(
    algorithm = hashes.SHA256,
    length = 32,
    salt = salt,
    iterations = 100000,
    backend = default_backend()
)
key = base64.urlsafe_b64encode(kdf.derive(kpassword))


k = Fernet(key)
example = k.encrypt(b'ABC')
print(example)

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

На случай, если вы предложите, нет, я на 90% уверен, что проблема не в соли, так как я пробовал более длинные и короткие соли, используя os.urandom(), я также пытался изменить пароль.

РЕДАКТИРОВАТЬ: я пытаюсь зашифровать ввод, который дает человек, затем кто-то другой дает тот же ввод, и я хочу сравнить шифрование

2
Cosmic 29 Мар 2019 в 14:54

1 ответ

Лучший ответ

Здесь нет ничего плохого. Fernet encrypt использует AES-128 с CBC режим работы с заполнением PKCS7.

Режим CBC требует IV, и этот IV генерируется os.urandom (). Таким образом, при каждом запуске у вас будет другой IV, и это изменит шифрование, см. вероятностное шифрование .

Примечание. Используемая вами соль используется при генерации ключей (PBKDF2HMAC), а не для IV режима CBC.

0
kelalaka 29 Мар 2019 в 12:12