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

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

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值