Python pyCrypto如何加密其他用户公钥

时间:2015-01-12 12:23:18

标签: python sockets encryption cryptography pycrypto

我遇到了问题。我正在使用pycrypto和rsa。 我想生成我的rsa密钥。 然后我想发送我的公钥(二进制或base64或类似)但首先我想用server 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()

1 个答案:

答案 0 :(得分:1)

根据定义,密钥对的公钥长于模数,因为包含模数。模数将为128字节,因为它定义了RSA的密钥大小。因此,根据定义,您无法使用相同大小的密钥加密RSA密钥。

所以你可以做的事情:

  1. 要求服务器密钥(远大于)客户端的公钥;
  2. 或者您可以使用混合加密,使用随机AES会话密钥加密公钥,然后使用服务器的公钥加密。
  3. 如果您选择实施此方案,则需要考虑对RSA加密和AES进行填充oracle攻击。因此,使用OAEP / AES-GCM或OAEP / AES-CBC / HMAC作为加密方案,或者您也可以在此处发布您的公钥。