一、背景
现如今窃取隐私信息太简单了,为了让自己脑海里形成一种保密意识,今天花了大概半个小时的时间写了一个用SOCKET实现的DES加密全双工聊天程序,程序的内容也比较简单,并且DES算法的实现也使用了pydes这个库,具体的工作量大概是体现在全双工的聊天程序里了。
我的程序和别人不一样的地方主要是在运行程序时只有一个文件需要运行,不像其他博主的那样分成一个client.py,一个server.py,当然我的这个程序内部也同样是借助了client和server的概念,并不是所谓P2P的(话说P2P好像也是有server和client的概念的)
我把下面的源码放到此处:https://download.youkuaiyun.com/download/liyihao17/10837812,有需要的人可以从这里下载
二、安装依赖包
我这个程序需要安装pydes这个库,可以直接调用里面的DES加密算法,由于是python所以理所应当地用pip安装了
sudo pip3 install pydes
这里我用的是python3.6版本,所以安装时用pip3,如果还没有安装pip3的请运行以下命令安装pip3
sudo apt-get install pip3
三、程序结构
接下来就直接先将代码贴上来:
import pyDes
import socket
import threading
Des_Key = b'qwerasdf'
Des_IV = b"\x00\x00\x00\x00\x00\x00\x00\x00"
PORT = 4396
BUFF = 1024
def DesEncrypt(str):
k = pyDes.des(Des_Key, pyDes.CBC, Des_IV, pad = None, padmode = pyDes.PAD_PKCS5)
Encrypt_Str = k.encrypt(str)
return Encrypt_Str
def DesDecrypt(str):
k = pyDes.des(Des_Key, pyDes.CBC, Des_IV, pad = None, padmode = pyDes.PAD_PKCS5)
Decrypt_Str = k.decrypt(str)
return Decrypt_Str
def SendMessage(Sock, test):
while True:
SendData = input()
encryptdata = DesEncrypt(SendData)
print('encrypted data is ' + str(encryptdata))
if len(SendData) > 0:
Sock.send(encryptdata)
def RecvMessage(Sock, test):
while True:
Message = Sock.recv(BUFF)
decryptdata = DesDecrypt(Message)
if len(Message)>0:
print("receive message:" + decryptdata.decode('utf8'))
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()
下面开始解释代码
1、DesEncrypt()函数和DesDecrypt()函数分别用于对其传入的字符串参数进行DES加密和解密,密钥就是代码中的Des_Key,当然进行DES加密解密的时候还要用到一个DES向量(Des_IV)
2、接下来就是设置端口和数据缓存区了
3、编写发送报文的函数SendMessage(Sock, test),和接收报文的函数RecvMessage(Sock, test)
4、接下来就是定义主函数了,首先要看这个开启的是服务器还是客户机,所以开头需要判断一下。如果是服务器端的话,则默认在本地监听;如果是客户机的话还需要输入服务器的IP地址进行连接(在这里我是在同一台机器上做的实验,所以IP地址设置为了127.0.0.1)
5、接下来利用多线程开始循环收发消息,发消息前先将信息加密,然后把加密后的信息打印在屏幕上,然后再发送出去(这样我们可以用wireshark抓包来证明我发送的到底是原始信息还是加密后的信息),另一端收到信息后,先将信息解密,然后再打印到屏幕上
四、具体操作流程
1、首先使用命令python3.6 des_chat.py运行程序,然后输入server,说明此时服务器程序开启,然后看到服务器程序正在监听
2、在另一个终端上使用命令python3.6 des_chat.py运行程序,然后输入client,说明此时客户端开启,并且输入目标ip地址127.0.0.1,连接服务器
3、此时服务器端检测到连接,呈现出等待报文的状态
4、此时服务器如果向客户端发送报文,屏幕会打印加密后的字段
5、同时客户端会收到发来的信息,解密后在屏幕上打印出来
6、然后客户端向服务器发送信息,屏幕打印加密后的字段,服务器将信息解密并且在屏幕上打印出来
7、我们发现两次的加密后的信息分别为 ‘\xf9\xa2\x13\x0f@_\\\xc8’和'\x9f\xe8M\xb6\x15<\r\x02',正好我用wireshark抓了包,现在看看包里面的内容:
发现虽然打印出来有些乱码,但是大体上和我使用wireshark抓包的内容是一致的,这里我就证明了我传输的报文是加密后的报文,而不是简简单单的明文传输。