【问题标题】:AttributeError: 'bytes' object has no attribute 'encrypt'AttributeError:“字节”对象没有属性“加密”
【发布时间】:2020-04-24 08:23:15
【问题描述】:

我想生成一个 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' object has no attribute 'encrypt'”。

我该如何解决这个问题?

【问题讨论】:

  • 如果你知道私钥(如果有任何必要的计算),公钥很容易计算出来,所以你所说的你试图实现的目标是没有意义的。您想要实现什么?如果您尝试生成签名,请阅读this。如果您想保密,请阅读this(找不到更具体的链接,但应该可以)
  • 当你得到像AttributeError 这样的异常时,你还会得到一个堆栈跟踪,其中包含重要信息,包括异常发生的行号和导致它的调用链。您必须在问题中包含这些信息,它几乎总是有用的,而且通常是绝对必要的。

标签: python encryption cryptography rsa


【解决方案1】:

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

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

【讨论】:

  • 你混淆了公共/私人来加密/解密。我添加了一个完整的加密示例。
猜你喜欢
  • 1970-01-01
  • 2017-12-29
  • 2020-03-11
  • 2021-09-26
  • 2019-02-02
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多