2014-12-04 113 views
3

我做了一個簡單的服務器程序,它能夠一次從4個不同的客戶端接收數據。現在我想用AES-128加密發送一些數據,但應該在服務器端進行解碼。 這裏是我的服務器代碼:在Python中使用套接字發送加密的字符串

from socket import * 
from threading import Thread 

def clientHandler(): 
    conn, addr = s.accept() 
    print addr, "is connected" 
    while 1: 
     data = conn.recv(1024) 
     if not data: 
      break 
     print "Received Message", repr(data) 


HOST = "" #localhost 
PORT = 15000 


s = socket(AF_INET, SOCK_STREAM) 
s.bind((HOST, PORT)) 
s.listen(4) 

print "Server is runnig" 
#Thread(target=clientHandler).start() 
#Thread(target=clientHandler).start() 
#Thread(target=clientHandler).start() 

for i in range(4): 
    Thread(target=clientHandler).start() 

s.close() 

而且我從我的客戶端

from socket import * 
s = socket() 
s.connect(("localhost",15000)) 
s.send() 

發送這樣的數據,我應該如何修改我的客戶端代碼和服務器代碼,包括AES-128加密內它..在這方面請幫助我。

回答

7

使用支持AES的Python的Crypto模塊。您需要一個對稱密鑰(用於加密和解密的相同密鑰)。如果使用相同的密碼和初始化向量(IV),則可以在服務器和客戶端中生成相同的密鑰。

總結: 1.相同的密鑰被用於加密和解密 2.使用Crypto.Cipher.AES

AES具有的方法生成密鑰,加密和解密數據。以下鏈接有實際的代碼。 pycryptostackoverflow

客戶端 - 調用此方法對數據進行加密併發送加密數據

from Crypto.Cipher import AES 

def do_encrypt(message): 
    obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456') 
    ciphertext = obj.encrypt(message) 
    return ciphertext 

服務器 - 接收數據,並調用此方法對數據進行解密

from Crypto.Cipher import AES 

def do_decrypt(ciphertext): 
    obj2 = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456') 
    message = obj2.decrypt(ciphertext) 
    return message 

這是一個示例代碼,確保你選擇了強大的密碼和IV。

+0

我真的很陌生,在Python這個加密業務。我曾嘗試用於加密該代碼,但它提供了一些關鍵尺寸誤差 'DEF加密(privateInfo):'
'BLOCK_SIZE = 16'
'PADDING = '{''
'墊=拉姆達S:S + (BLOCK_SIZE-LEN(S)%BLOCK_SIZE)* PADDING' 'EncodeAES =拉姆達C,S:base64.b64encode(c.encrypt(襯墊(S)))'
'祕密= 「SECRET_KEY」'
'打印「加密密鑰」,secret'
'密碼= AES.new(祕密)'
'編碼= EncodeAES(密碼,privateInfo)'
'打印 「加密的字符串:」,encoded'
2014-12-04 06:56:42

+0

我真的很抱歉,我很簡單,不能合成它 – 2014-12-04 07:00:33

+0

@AsadIrfan我已更新示例代碼 – helloV 2014-12-04 07:11:47

相關問題