AttributeError: у объекта 'bytes' нет атрибута 'encrypt' - PullRequest
0 голосов
/ 06 января 2020

Я хотел бы сгенерировать пару ключей RSA, а затем написать функции для дешифрования с помощью ключа c publi и шифрования с использованием личного ключа.

В настоящий момент я генерирую свои ключи следующим образом

from cryptography.hazmat.primitives import serialization as crypto_serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.backends import default_backend as crypto_default_backend


key = rsa.generate_private_key(
        backend=crypto_default_backend(),
        public_exponent=65537,
        key_size=2048
    )
private_key = key.private_bytes(
    crypto_serialization.Encoding.PEM,
    crypto_serialization.PrivateFormat.PKCS8,
    crypto_serialization.NoEncryption())
public_key = key.public_key().public_bytes(
    crypto_serialization.Encoding.OpenSSH,
    crypto_serialization.PublicFormat.OpenSSH
)

Затем я следовал документации по криптографии для шифрования с помощью RSA, там говорится:

message = b"encrypted data"
ciphertext = private_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

Я заменил public_key на private_key.

И расшифровал

plaintext = public_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

Здесь я заменил private_key на public_key.

Однако, выполнение зашифрованной части выдает мне сообщение об ошибке «AttributeError: объект bytes» не имеет атрибута «encrypt» ».

Как можно Я это исправлю?

1 Ответ

0 голосов
/ 07 января 2020

Чтобы исправить вашу проблему, используйте:

public_key = key.public_key()

Вы не должны использовать public_key = key.public_key().public_bytes(...), поскольку вы получите байты. Вы смешиваете байты и ключ.

Также используйте ключ publi c для шифрования (не частного):

from cryptography.hazmat.primitives import serialization as crypto_serialization
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.backends import default_backend as crypto_default_backend
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes


key = rsa.generate_private_key(
        backend=crypto_default_backend(),
        public_exponent=65537,
        key_size=2048
    )
private_key = key.private_bytes(
    crypto_serialization.Encoding.PEM,
    crypto_serialization.PrivateFormat.PKCS8,
    crypto_serialization.NoEncryption())
public_key = key.public_key()
message = b"encrypted data"
ciphertext = public_key.encrypt(
    message,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)
...