socket中使用Python DES加密解密方法 pyDes库(中英文)
本人也只是个小白,最近应老师要求学了学pyDes加解密。
我的编译环境是python3.7
先安装
pip install pyDes
import pyDes
import socket
import threading
Des_Key = b'hiansdnk'
Des_IV = b"\x00\x00\x00\x00\x00\x00\x00\x00"
PORT = 8080
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 #返回加密后的密文
#解密函数DesDecrypt
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
-
pyDes.des(key, [mode], [IV], [pad], [padmode]) pyDes.triple_des(key,
[mode], [IV], [pad], [padmode]) key -> 含有加密密钥的字节。
DES为8字节,16或24字节用于三重DES mode ->
加密类型的可选参数可以是pyDes.ECB(电子密码本)或pyDes.CBC(密文分组链接) IV ->
使用CBC模式,必须提供可选的初始值字节。长度必须是8个字节。 pad ->
可选参数,完成的所有加密/解密操作期间使用的填充字符(PAD NORMAL)。 padmode ->
可选参数,设置填充模式(PAD_NORMAL或PAD_PKCS5)在使用此实例完成的所有encrypt / decrpt操作期间使用。
建议使用PAD_PKCS5填充,因为不需要担心填充出现问题,填充可以在解密时明确地删除使用PAD_PKCS5 padmode加密的数据。
收发模块
#消息发送函数
def SendMessage(Sock, test):
while True:
SendData = input()
SendData = SendData.encode() #中文必须先转成字节才能加密
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'))
注意
:
中文是没法直接用 DesEncrypt加密的因为它只接受字节,不接受str
加上SendData = SendData.encode()这一句就搞定。
最后是socket和多线程
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()
运行结果
到这就大功告成了!
最后贴上完整代码
import pyDes
import socket
import threading
Des_Key = b'hiansdnk'
Des_IV = b"\x00\x00\x00\x00\x00\x00\x00\x00"
PORT = 8080
BUFF = 1024
#加密函数DesEncrypt
pyDes.des(key, [mode], [IV], [pad], [padmode])
pyDes.triple_des(key, [mode], [IV], [pad], [padmode])
key -> 含有加密密钥的字节。 DES为8字节,16或24字节用于三重DES
mode -> 加密类型的可选参数可以是pyDes.ECB(电子密码本)或pyDes.CBC(密文分组链接)
IV -> 使用CBC模式,必须提供可选的初始值字节。长度必须是8个字节。
pad -> 可选参数,完成的所有加密/解密操作期间使用的填充字符(PAD NORMAL)。
padmode -> 可选参数,设置填充模式(PAD_NORMAL或PAD_PKCS5)在使用此实例完成的所有encrypt / decrpt操作期间使用。
建议使用PAD_PKCS5填充,因为不需要担心填充出现问题,填充可以在解密时明确地删除使用PAD_PKCS5 padmode加密的数据。
encrypt(data, [pad], [padmode])
decrypt(data, [pad], [padmode])
data -> 要加密/解密的字节
pad -> 可选参数。 仅在使用padmode为PAD_NORMAL时, 加密时,将此字符添加到数据块的末尾。 对于解密,将删除尾随与最后8个垫填充
字符匹配的字符未加密数据块的字节数。
padmode -> 可选参数,设置填充模式,必须是PAD_NORMAL之一或PAD_PKCS5。 默认为PAD_NORMAL
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 #返回加密后的密文
#解密函数DesDecrypt
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()
SendData = SendData.encode() #中文必须先转成字节才能加密
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()
仅供学习我也知识个小白希望有大佬指点或者一起交流。