You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python:如何将密钥字符串转回pycrypto密钥对象?

解决PyCrypto公钥字符串转回密钥对象的问题

嘿,这个问题我之前做加密通信的时候也踩过坑!你遇到的AttributeError是因为客户端收到的只是普通字符串,根本不是PyCrypto的RSA公钥对象——自然没有encrypt方法。要解决这个问题,得用PyCrypto自带的公钥序列化/反序列化方法,而不是直接转字符串。

第一步:服务端正确序列化公钥(发送前)

你不能直接把公钥对象转成字符串发送,得用exportKey()方法把它序列化成标准格式(比如PEM)的字节串(或字符串):

from Crypto.PublicKey import RSA

# 假设你已经生成了RSA密钥对
private_key = RSA.generate(2048)
public_key = private_key.publickey()

# 序列化公钥为PEM格式的字节串(推荐,因为套接字直接发字节)
public_key_bytes = public_key.exportKey(format='PEM')
# 如果非要转成字符串发送,记得用utf-8编码
public_key_str = public_key_bytes.decode('utf-8')

# 然后通过套接字发送,比如:
# sock.send(public_key_bytes)  # 直接发字节
# 或者发字符串:sock.send(public_key_str.encode('utf-8'))

第二步:客户端反序列化字符串为密钥对象

客户端收到字符串后,需要先转成字节串(如果发送的是字符串的话),再用RSA.importKey()方法导入成公钥对象:

from Crypto.PublicKey import RSA
import socket

# 假设你已经通过套接字建立连接
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 12345))

# 接收公钥字符串(注意实际场景要处理粘包等问题)
received_str = client_socket.recv(4096).decode('utf-8')
# 转成字节串
received_bytes = received_str.encode('utf-8')

# 导入成公钥对象
public_key = RSA.importKey(received_bytes)

# 现在就可以正常调用encrypt了!
secret_piece = b"your_secret_data"
enc_data = public_key.encrypt(secret_piece, 12)

为什么之前的方法不行?

直接把公钥对象转成字符串(比如str(public_key))得到的是PyCrypto对象的字符串表示,不是标准的公钥格式,PyCrypto根本无法识别这种格式来重建密钥对象,所以才会报错说字符串没有encrypt方法。

额外注意事项

  • 优先直接发送字节串,避免编码/解码带来的问题;
  • 实际生产环境中要处理套接字的粘包问题(比如先发送数据长度,再发送实际内容);
  • PyCrypto已经停止维护了,推荐考虑改用pycryptodome(是PyCrypto的分支,API完全兼容)。

内容的提问来源于stack exchange,提问作者user4068802

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:23:15