公钥未被识别

1 投票
1 回答
1712 浏览
提问于 2025-04-17 05:17

我正在尝试用Python从openssl导出一个公钥。我已经把实际的密钥信息从服务器传给了客户端,但PEM编码没有传过去,所以客户端的密钥没法用。我基本上是用Python的send all发送公钥,但不幸的是,这样并没有发送PEM编码。有没有人知道怎么传输这个编码?我之前不知道编码不会和密钥一起传输。

这是读取字符串的代码

 import socket

 import M2Crypto as m2c
 import os

 max_transfer_block = 1024
 server_addr = "10.1.1.2"
 dest_port = 3333
 listen_port = 8888
 client_addr =  "10.1.1.3"
 mysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 mysocket.connect((server_addr, dest_port))

 #receive the public key from the server
 keysocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 keysocket.bind((client_addr, listen_port))
 keysocket.listen(1)
 conn, client_addr = keysocket.accept()
 print 'connected by', client_addr
 data = conn.recv(max_transfer_block)
 #FILE = m2c.RSA.save_pub_key(data, "serverPubKey.pem")

 FILE = open("sPub.pem", "w")
 FILE.write(data)
 keysocket.close()     

 #transfer encrypted file
 key = m2c.RSA.load_pub_key('serverPubKey.pem')
 FILE = open("test.txt", "r")

 data = FILE.read()

 encrypted = key.public_encrypt(data, m2c.RSA.pkcs1_padding)

 mysocket.sendall(encrypted)
 mysocket.close()

当我使用这行代码key = m2c.RSA.load_pub_key('serverPubKey.pem')时,出现了一个错误,提示我没有起始点。

 raise RSAError, m2.err_reason_error_string(m2.err_get_error()) M2Crypto.RSA.RSAError: no start line

我发现这是因为它不是PEM格式的。不幸的是,我不知道怎么把它转换成那种格式。

1 个回答

2

错误在于公钥和私钥必须是从同一个工具生成的。我的意思是,并不是所有的密钥对都是一样的。我遇到的具体问题是,OpenSSL和M2Crypto生成的密钥对在底层格式上不一样。因此,我用OpenSSL生成密钥后,再用M2Crypto来使用这些密钥就是错误的。从这件事中得到的教训是,不要从其他工具导入密钥。如果你确实要这样做,一定要确保它们的底层格式是一样的,比如ASCII或Unicode,才能正常使用。

撰写回答