Python - Pycrypto - 通过网络发送加密数据

时间:2011-07-30 22:01:58

标签: python file networking public-key-encryption pycrypto

我正在尝试使用公钥通过网络共享2个程序来共享加密数据,但我遇到了一个难题:共享的信息(密钥和/或加密数据)似乎被修改了。我希望尽可能简单地保持加密数据格式和密钥格式,以便与其他语言兼容。 为了解决这个问题,我创建了两个程序:Keyreceive和Keysend。 它们按此顺序执行:

  1. Keyreceive启动并等待接收加密数据
  2. Keysend启动并生成RSA密钥,将导出的私钥保存到文件
  3. Keysend对一段数据进行加密,并通过网络将其发送给Keyreceive
  4. Keyreceive从同一文件导入私钥,并使用它来解密加密数据
  5. Keysend还会解密加密数据以验证结果
  6. Keysend.py

    import socket
    import os
    from Crypto.PublicKey import RSA
    from Crypto import Random
    
    rng = Random.new().read
    RSAkey = RSA.generate(1024, rng) 
    
    privatekey = RSAkey
    publickey = RSAkey.publickey()
    print(privatekey.exportKey()) #export under the 'PEM' format (I think)
    print(publickey.exportKey())
    
    file = open("Keys.txt", "w")
    file.write(privatekey.exportKey()) #save exported private key
    file.close()
    
    data = "hello world"
    enc_data = publickey.encrypt(data, 16) #encrypt message with public key
    print(str(enc_data))
    
    host = "localhost"
    port = 12800
    connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connexion.connect((host, port))
    connexion.send(str(enc_data)) # send encrypted data, this appears to be the source of the problem
    
    dec_data = RSAkey.decrypt(enc_data) # test decryption
    print(dec_data)
    
    os.system("pause")
    

    Keyreceive.py

    import socket
    import os
    from Crypto.PublicKey import RSA
    from Crypto import Random
    
    host = ''
    port = 12800
    
    connexion = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    connexion.bind((host, port))
    connexion.listen(5)
    clientconnexion, connexioninfo = connexion.accept()
    enc_data = clientconnexion.recv(1024) # receive encrypted data
    print(enc_data)
    
    file = open("Keys.txt", "r")
    privatestr = file.read() # retrieve exported private key from file
    file.close()
    print(privatestr)
    
    privatekey = RSA.importKey(privatestr) # import private key
    data = privatekey.decrypt(enc_data) # decrypt sent encrypted data
    print(data)
    
    os.system("pause")
    

    两个文件解密完加密数据后,Keysender输出原始消息:“hello world”,而Keyreceiver输出乱码。 如果加密数据和密钥格式中存在“隐藏”信息,是否有某种方式以“纯”文本格式编写它们?

1 个答案:

答案 0 :(得分:5)

你认为哪一行是问题的根源是正确的。

connexion.send(str(enc_data))

enc_data这里是元组,第一个(实际上只有)元素是包含实际密文的字符串。当你在它上面调用str时,你会得到Python尝试将元组转换为字符串,这不是你想要的。如果你改成它:

connexion.send(enc_data[0])

那么它应该做你想做的事。