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())
以下是使用Python实现CBC模式的AES加解密的示例代码: ```python from Crypto.Cipher import AES from Crypto.Util.Padding import pad, unpad import base64 # 加密函数 def encrypt(key, iv, plaintext): cipher = AES.new(key, AES.MODE_CBC, iv) ciphertext = cipher.encrypt(pad(plaintext.encode(), AES.block_size)) return base64.b64encode(ciphertext).decode() # 解密函数 def decrypt(key, iv, ciphertext): cipher = AES.new(key, AES.MODE_CBC, iv) plaintext = unpad(cipher.decrypt(base64.b64decode(ciphertext)), AES.block_size) return plaintext.decode() # 测试 key = b'Sixteen byte key' iv = b'Initialization Ve' plaintext = 'Hello, world!' ciphertext = encrypt(key, iv, plaintext) print('加密后的密文:', ciphertext) decrypted_text = decrypt(key, iv, ciphertext) print('解密后的明文:', decrypted_text) ``` 在这个示例中,我们使用了PyCryptodome库来实现AES加解密,它是Python加密库的一个分支,提供了对AES加密的支持。我们还使用了Padding库来确保明文的长度是AES块大小的倍数。 在加密函数中,我们首先创建了一个AES对象,该对象使用CBC模式和指定的IV向量。我们然后使用pad函数来填充明文,使其长度为AES块大小的倍数。最后,我们使用base64编码来生成可读的密文。 在解密函数中,我们首先使用与加密函数相同的参数创建AES对象。我们然后使用unpad函数来删除填充,并使用base64解码来获取原始密文。最后,我们将解密的明文返回。 请注意,示例中使用的密钥和IV向量是硬编码的,这不是一个好的实践。在实际应用中,您应该使用安全的随机生成的密钥和IV向量来加密和解密数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值