py实现DES加解密详解

一、安装pyDes库

下载点这里

安装

使用Python包管理器:

$ pip安装pydes
或者,用于手动安装

从下载的档案中提取文件并运行:

$ python setup.py安装

要测试,请运行:

$ python test_pydes.py
用法
python -c“ import pyDes; des = pyDes.des('This Key'); print des.encrypt('SomeData')。encode('hex')”
文件与范例
类初始化
--------------------
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(密码块链接)
如果使用CBC模式,则必须提供IV->可选的初始值字节。
	   长度必须为8个字节。
pad->可选参数,设置填充字符(PAD_NORMAL)以在
	   使用此实例完成的所有加密/解密操作。
padmode->可选参数,设置填充模式(PAD_NORMAL或PAD_PKCS5)
	   在对此实例执行的所有加密/解密操作期间使用。

我建议使用PAD_PKCS5填充,因为这样您就不必担心任何
填充问题,因为在解密时可以明确删除填充
使用PAD_PKCS5填充模式加密的数据。

常用方法
--------------
加密(数据,[填充],[填充模式])
解密(数据,[pad],[padmode])

数据->要加密/解密的字节
pad->可选参数。仅在使用PAD_NORMAL的padmode时。对于
	   加密时,将以下字符添加到数据块的末尾
	   数据不是8个字节的倍数。对于解密,将删除
	   最后8个与此填充字符匹配的结尾字符
	   未加密数据块的字节。
padmode->可选参数,设置填充模式,必须为PAD_NORMAL之一
	   或PAD_PKCS5)。默认为PAD_NORMAL。
	  

例
-------
导入pyDes

#对于Python3,您需要使用字节,即:
#data = b“请加密我的数据”
#k = pyDes.des(b“ DESCRYPT”,pyDes.CBC,b“ \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0”,pad = None,padmode = pyDes.PAD_PKCS5)

data =“请加密我的数据”
k = pyDes.des(“ DESCRYPT”,pyDes.CBC,“ \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0”,pad = None,padmode = pyDes.PAD_PKCS5)
d = k.encrypt(数据)
打印“已加密:%r”%d
打印“解密:%r”%k.decrypt(d)
断言k.decrypt(d)==数据


有关更多使用示例,请参见pyDes测试文件(test_pydes.py)。

注意:此代码不是为需要快速运行的高端系统编写的
      实施,而是一种使用方便,轻便的解决方案。

也可以直接把pyDes.py拖到lib库里面、如图为安装成功:
在这里插入图片描述

二、熟悉DES流程
  • 概念:

DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。

  • 基本原理:

其入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。

  • 流程图:

img

三、编写代码
import pyDes
import binascii         #二进制和 ASCII 码互转

#创建类
class Descryption:
    # pyDes.des(key,[mode],[IV],[pad],[padmode])
    # 加密密钥的字节、加密类型、可选参数用来设置填充字符、设置填充模式
    def des_encrypt(self, key, plaintext):
        iv = secret_key = key
        k = pyDes.des(secret_key, pyDes.CBC, iv, pad=None, padmode = pyDes.PAD_PKCS5)
        data = k.encrypt(plaintext, padmode=pyDes.PAD_PKCS5)
        print(binascii.b2a_hex(data).decode())      #data.进制返回文本字符串.解码字符串

    def des_decrypt(self, key, ciphertext):
        iv = secret_key = key
        k = pyDes.des(secret_key, pyDes.CBC, iv, pad=None, padmode = pyDes.PAD_PKCS5)
        data = k.decrypt(binascii.a2b_hex(ciphertext), padmode=pyDes.PAD_PKCS5)
        print(data.decode())

#调用
des = Descryption()

while True:
    key = input("请输入秘钥:\n")
    mode = input("encrypt or decrypt?:\n")
    if mode.strip() == 'encrypt':
        plaintext = input("请输入明文:\n")
        des.des_encrypt(key, plaintext.strip())
    else:
        ciphertext = input("请输入密文:\n")
        des.des_decrypt(key, ciphertext.strip())
发布了40 篇原创文章 · 获赞 2 · 访问量 2389

猜你喜欢

转载自blog.csdn.net/qq_42404383/article/details/104839142