天天看點

【python】SOCKET實作RSA加密的全雙工聊天程式

一、背景

RSA加密解密是利用的非對稱密鑰解決的傳輸過程中機密性的問題,将之用在聊天程式上,其中使用了rsa子產品,發送方生成公鑰和私鑰,然後使用公鑰将資訊加密後,利用pickle子產品封裝加密後的消息和私鑰,然後發送給接收方,接收方同樣通過pickle子產品将消息進行解封,使用發送過來的私鑰将消息解密,并将内容列印在螢幕上。

二、程式結構

這裡的程式結構可以參考我之前寫的【python】SOCKET實作DES加密的全雙工聊天程式這個文章,下面我将rsa加密聊天程式的代碼貼上來,當然也可以從這裡下載下傳:https://download.csdn.net/download/liyihao17/10841906

import rsa
import socket
import threading
import pickle

PORT = 4396
BUFF = 1024


def RsaEncrypt(str):
    (PubKey, PrivateKey) = rsa.newkeys(512)
    content = str.encode('utf8')
    Encrypt_Str = rsa.encrypt(content, PubKey)
    return (Encrypt_Str, PrivateKey)


def RsaDecrypt(str, pk):
    Decrypt_Str = rsa.decrypt(str, pk)
    Decrypt_Str_1 = Decrypt_Str.decode('utf8')
    return Decrypt_Str_1


def SendMessage(Sock, test):
    while True:
        SendData = input()
        (encryptdata, PrivateKey) = RsaEncrypt(SendData)
        print('encrypted data is ' + str(encryptdata))
        Message = pickle.dumps([encryptdata, PrivateKey])
        if len(SendData) > 0:
            Sock.send(Message)


def RecvMessage(Sock, test):
    while True:
        Message = Sock.recv(BUFF)
        (recvdata, PrivateKey) = pickle.loads(Message)
        decryptdata = RsaDecrypt(recvdata, PrivateKey)
        if len(Message)>0:
            print("receive message:" + decryptdata)


def main():
    type = input('please input server or client:')
    if type == 'server':
        ServerSock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
        ServerSock.bind(('127.0.0.1',PORT))
        ServerSock.listen(5)
        print("listening......")
        while True:
            ConSock,addr = ServerSock.accept()
            print('connection succeed' + '\n' + 'you can chat online')
            thread_1 = threading.Thread(target = SendMessage, args = (ConSock, None))
            thread_2 = threading.Thread(target = RecvMessage, args = (ConSock, None))
            thread_1.start()
            thread_2.start()
    elif type == 'client':
        ClientSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        ServerAddr = input("please input the server's ip address:")
        ClientSock.connect((ServerAddr, PORT))
        print('connection succeed, chat start!')
        thread_3 = threading.Thread(target = SendMessage, args = (ClientSock, None))
        thread_4 = threading.Thread(target = RecvMessage, args = (ClientSock, None))
        thread_3.start()
        thread_4.start()


if __name__ == '__main__':
    main()
           

下面開始程式分析。main()函數就不再分析了,具體也可以參考我之前的那篇關于des加密的聊天程式,詳細分析的是加解密函數和收發資料函數。

1、加密RsaEncrypt()函數先生成公鑰和私鑰,然後使用公鑰将需要發送的資訊進行加密

2、發送函數SendMessage()将加密後的資訊以及私鑰使用pickle子產品進行封裝,然後通過socket.send()函數發送出去

3、接收函數RecvMessage()将接受到的消息使用pickle子產品進行解封裝,得到私鑰和加密消息,然後通過rsa子產品解密

4、得到解密消息後将其列印在螢幕上

三、結果示範

1、先啟動server進行監聽

【python】SOCKET實作RSA加密的全雙工聊天程式

 2、啟動用戶端連接配接server

【python】SOCKET實作RSA加密的全雙工聊天程式

3、用戶端向伺服器發送消息

【python】SOCKET實作RSA加密的全雙工聊天程式

 發送hello後螢幕将列印加密後的消息

4、伺服器端接收到消息,并将消息列印在螢幕上

【python】SOCKET實作RSA加密的全雙工聊天程式