首页 > 解决方案 > AttributeError:“字节”对象没有属性“加密”

问题描述

我想生成一个 RSA 密钥对,然后编写函数使用公钥解密并使用私钥加密。

目前我正在生成我的密钥,如下所示

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
    )
)

我用 private_key 替换了 public_key。

并解密

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

这里我用 public_key 替换了 private_key。

但是,运行加密部分会给我错误“AttributeError:'bytes'对象没有属性'encrypt'”。

我怎样才能解决这个问题?

标签: pythonencryptioncryptographyrsa

解决方案


要解决您的问题,请使用:

public_key = key.public_key()

你不应该使用public_key = key.public_key().public_bytes(...),因为你会得到字节。您正在混合字节和密钥。

还使用公钥加密(非私有):

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
    )
)

推荐阅读