PyCryptodome 的 RSA 加密问题

issue with RSA encryption with PyCryptodome

我需要修复一个基于 PyCryptodome 的 client/server 交互。

客户端生成其 RSA 密钥并将 public 密钥发送到服务器:

n_bin_size = 1024
e = 65537
key = RSA.generate(n_bin_size, None, e) # RsaKey object
public_key = key.publickey().exportKey('PEM')
print(str(len(public_key)))
conn.send(public_key)

服务器获取私钥并使用它来加密会话密钥:

data = conn.recv(271).decode()
pub_key = RSA.import_key(data)
session_key = b"key1key1key1key1"
cipher_rsa = PKCS1_OAEP.new(pub_key)
try:
  enc_session_key = cipher_rsa.encrypt(session_key)
except (AttributeError):
  print("Attribute error..")

session_key 实际上是正确加密的,但总是会引发 AttributeError 异常,并显示以下消息:

Traceback (most recent call last):
  File "Bob.py", line 33, in <module>
    enc_session_key = cipher_rsa.encrypt(session_key)
  File "/usr/local/lib/python3.7/site-packages/Cryptodome/Cipher/PKCS1_OAEP.py", line 107, in encrypt
    modBits = Cryptodome.Util.number.size(self._key.n)
AttributeError: 'int' object has no attribute 'n'

这个问题可以解决吗?

更新:有一个类似的问题,地址:

但是那个问题的答案并没有解决我的问题。 当然,如果我使用 "full" RsaKey 对象而不是 public-key RsaKey 对象,则不会引发异常,但我认为将 "full" RsaKey 对象发送到服务器,不是吗?

我阅读的所有内容都与您的代码一致,并且您很好地匹配了示例。
解决问题的下一步是验证发送的数据是否与接收的数据匹配。开始查看您发送至 import_key().

的数据

其实是通信协议出了问题:我没有注意到服务器收到了第二条消息,并试图用它来创建一个RsaKey。现在一切正常(使用我发布的代码)。感谢您提供有用的反馈。