gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:33:15 25 4
gpt4 key购买 nike

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

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

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 输出乱码。如果加密数据和 key 格式中存在“隐藏”信息,是否有某种方法可以将它们写入“纯”文本格式?

最佳答案

关于哪一行是问题的根源,您是对的。

connexion.send(str(enc_data))

enc_data 这里是一个元组,第一个(事实上也是唯一的)元素是包含实际密文的字符串。当您对其调用 str 时,Python 会尝试将元组转换为字符串,这不是您想要的。如果将其更改为:

connexion.send(enc_data[0])

然后它应该做你想做的。

关于Python - Pycrypto - 通过网络发送加密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6886240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com