2011-10-30 169 views
1

我想從openssl使用python導出公鑰。我將實際的密鑰信息從服務器傳輸到客戶端,但PEM編碼未傳輸,因此客戶端上的密鑰無用。我基本上使用發送全部使用python發送公鑰,但不幸的是這不會發送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格式。不幸的是,我不知道如何把它放在這種格式中。

回答

2

錯誤在於公鑰/私鑰對需要使用相同的包裝器創建。我的意思是,並非所有的密鑰對都是一樣的。我的具體問題是Openssl和密鑰對的M2Crypto實例不是相同的基礎格式。因此,用Openssl創建密鑰,然後嘗試使用M2Crypto來使用密鑰是錯誤的。所有這一切的教訓是不要從其他包裝器導入密鑰。如果你這樣做,在嘗試使用它們之前,確保它們使用相同的底層格式,如ASCII或Unicode。