Python pyCrypto 如何加密其他用户的 public 密钥

Python pyCyrpto how to encrypt other user public key

我有问题。我正在使用 pycrypto 和 rsa。 我想生成我的 rsa 密钥。 然后我想发送我的 public 密钥(二进制或 base64 或类似格式)但首先我想用服务器 public 加密它。因为我想确保没有人在嗅探我的 public 需要不为人所知。

然后问题就来了。因为当我加密我的 public 密钥时,解密后,解密后的数据是不可读的。

我不知道为什么。当我交换 publics 并发送正常数据(不是 public 密钥)时,加密有效。我找不到如何发送我的 public 加密的解决方案。

有人可以帮助我吗?每一条评论都会有用

我的代码:

  random_generator = Random.new().read
  self.private_key = RSA.generate(1024, random_generator)
  self.public_key = self.private_key.publickey()
  keytoexport =self.public_key.exportKey(format='PEM', passphrase=None)

  #client encrypting to server
  def _encrypt(self, content):
    return self.server_public_key.encrypt(content, 32)

  #server decrypting content
  def _decrypt(self, content):
     return self.parent.private_key.decrypt(content)

我就是这样通过客户端发送数据报的。

def send_datagram(self, datagram):
    datagram = pickle.dumps(datagram)
    self.socket.sendall(datagram)
    response_server = self.socket.recv(2048)
    return pickle.loads(response_server)

然后像那样将其重新发送到服务器。

receive_socket = self.request
ask = receive_socket.recv(2048).strip()

根据定义,密钥对的 public 密钥比模数长,因为它 包含 模数。模数将是 128 字节,因为它定义了 RSA 的密钥大小。因此根据定义,您不能使用相同大小的密钥来加密 RSA 密钥。

所以你可以做的事情:

  1. 要求服务器密钥比客户端的 public 密钥大(很多);
  2. 或者您可以使用混合加密,其中您使用随机 AES 会话密钥加密 public 密钥,该密钥又使用服务器的 public 密钥加密。

如果您选择实施此方案,则需要考虑对 RSA 加密和 AES 进行填充 oracle 攻击。因此,请使用 OAEP/AES-GCM 或 OAEP/AES-CBC/HMAC 作为加密方案,或者您也可以在此处 post 您的 public 密钥。