【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进行监听

 

 2、启动客户端连接server

3、客户端向服务器发送消息

 发送hello后屏幕将打印加密后的消息

4、服务器端接收到消息,并将消息打印在屏幕上

  • 8
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值