Зашифруйте JSON с помощью хэша SHA256, вернув 512 символов вместо 64 - PullRequest
0 голосов
/ 27 мая 2019

На основе документа Google и cryptography.io .

Я пытаюсь зашифровать запрашиваемый результат в формате JSON, который выглядит следующим образом: {"data": "abc"}.Как я знаю, при шифровании с помощью SHA256 зашифрованные данные будут иметь форму 64 символов, но после того, как я посмотрел и попробовал их с кодом в ссылке и некоторыми изменениями, я получил результат 512 символов вместо 64 символов.

Это мой код:

def encrypt_rsa(_rsa_pub, plaintext):
    key_txt = _rsa_pub.encode()
    public_key = serialization.load_pem_public_key(key_txt, default_backend())

    # encrypt plaintext
    pad = padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
                       algorithm=hashes.SHA256(),
                       label=None)
    return public_key.encrypt(plaintext, pad)

pk = ....#public key
message = .... #query result (JSON)
x = json.dumps(message).encode('utf-8')
enc = encrypt_rsa(pk , x)
enc = base64.b64encode(enc).decode()
dec = decrypt_rsa(enc)

Нет ошибки, но я получил длинные зашифрованные данные с 512 символами, что действительно странно.Я попытался расшифровать его с помощью кода из cryptography.io и получил ошибку:

AttributeError: 'str' object has no attribute 'decrypt'

, которая, по моему мнению, может возникнуть из-за неправильных зашифрованных данных, которые должны содержать 64 символа.но ввод 512 символов.Итак, исходя из моего случая, что я забыл или что нужно добавить в этот код, чтобы он превратился в зашифрованные данные с 64 символами, которые можно расшифровать?

Редактировать: функция дешифрования

def decrypt_rsa(ciphertext):
    private_key = .....
    pad = padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
                   algorithm=hashes.SHA256(),
                   label=None)
    return private_key.decrypt(ciphertext, pad)

Ошибка произошла в decrypt в строке, возвращающей результат.Я фактически передал зашифрованные данные в эту функцию.И я думаю, что это не из-за ключа, так как он не должен выдавать ошибку, как это

1 Ответ

3 голосов
/ 27 мая 2019

Вы шифруете данные с помощью RSA.(Не SHA256, это просто параметр шифрования RSA.) Обратите внимание, что RSA обычно используется только для шифрования / дешифрования очень небольших объемов данных.Обычно он используется для шифрования / дешифрования другого симметричного ключа, например, для AES, а затем массовое шифрование / дешифрование выполняется с помощью AES.

Размер текста шифра RSA определяется размером ключа RSA.В этом случае вы, вероятно, используете 4096-битные ключи RSA, что приводит к 4096/8 = 512-байтовым сообщениям.Сообщения меньшего размера в порядке, они дополняются.Сообщения большего размера не будут работать.

Наконец, вы пытаетесь вызвать decrypt для строки, что не является вещью.Вместо этого вам нужно передать данные в функцию decrypt_rsa, которая выполняет обратную функцию функции encrypt_rsa, которую вы показали.

редактировать после добавления функции decrypt_rsa к вопросу : сообщение об ошибке показывает, что private_key на самом деле не закрытый ключ, а строка.Почему мы не можем сказать, потому что код для инициализации private_key не показан.

...