socket中使用Python DES加密解密方法 pyDes库(中英文)

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()

仅供学习我也知识个小白希望有大佬指点或者一起交流。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部