文章目录
前言
本文介绍常用的分组密码AES,DES,3DES,Blowfish,CAST,Camellia的五种模式(CBC,ECB,CFB,OFB,CTR)加密。
可以以AES为例观看,仅看 二、AES 以及 九、主函数 进行调试运行,将AES中的两段代码以及主函数中的两段代码粘贴到一个py文件中即可正常运行。
一、使用的包
from Crypto.Cipher import AES,DES,DES3,Blowfish,CAST,ARC2,ARC4
from Crypto import Random
from binascii import b2a_hex
import string
import random
import os
二、AES
代码如下:
#AES加密
def encrypt_AES_ECB(str, key):#补全字符串
str = align(str)
key = align(key, True)
# 生成长度等于AES块大小的不可重复的密钥向量,ECB不需要
iv = Random.new().read(AES.block_size)
#CTR模式需要counter
#counter = os.urandom(16)
# 初始化AES
AESCipher = AES.new(key, AES.MODE_ECB,iv)#这里的MODEL可以改模式,CTR需要counter,用下边的
#AESCipher = AES.new(key, AES.MODE_CTR,counter=lambda: counter)
# 加密
cipher = AESCipher.encrypt(str)
return b2a_hex(cipher)
#return cipher
这里需要两个函数,一个是生成密钥的,一个是明文和密钥检验的:
# 生成指定长度的秘钥
def keyGenerater(length):
if length not in (16, 24, 32):
return None
x = string.ascii_letters + string.digits
return ''.join([random.choice(x) for i in range(length)])
#传入数据(明文和秘钥)校验
def align(str, isKey=False,isAES=True):
# 如果接受的字符串是密码,需要确保其长度为16
if isKey:
if isAES:
if len(str) > 16:
return str[0:16]
else:
return align(str)
else:
if len(str) > 8:
return str[0:8]
else:
return align(str)
# 如果接受的字符串是明文或长度不足的密码,则确保其长度为16的整数倍
else:
zerocount = 16-len(str) % 16
for i in range(0, zerocount):
str = str + '\0'
return str
三、DES
def encrypt_DES_ECB(str, key):
str = align(str)
key = align(key, True,False)
iv = Random.new().read(8) #iv值必须是8位
# CTR模式需要counter
counter = os.urandom(8)
DESCipher = DES.new(key, DES.MODE_CTR,counter=lambda: counter)
#其他模式
#DESCipher = DES.new(key, DES.MODE_ECB,iv)
cipher = DESCipher.encrypt(str)
return b2a_hex(cipher)
四、3DES
def encrypt_DES3_ECB(str, key):
str = align(str)
#key = align(key, True)
iv = Random.new().read(8)#8
# CTR模式需要counter
#counter = os.urandom(8)
#cipher1 = DES3.new(key, DES3.MODE_CTR,counter=lambda: counter) # 密文生成器,采用MODE_CBC加密模式
#其他模式
cipher1 = DES3.new(key, DES3.MODE_CBC,iv)
cipher = cipher1.encrypt(str)
return b2a_hex(cipher)
五、Blowfish
def encrypt_Blowfish_ECB(str,key):
str = align(str)
iv = Random.new().read(Blowfish.block_size)
cipher1 = Blowfish.new(key, Blowfish.MODE_ECB,iv)
cipher = cipher1.encrypt(str)
return b2a_hex(cipher)
六、CAST
def encrypt_CAST_ECB(str,key):
str = align(str)
iv = Random.new().read(CAST.block_size)
cipher1 = CAST.new(key, CAST.MODE_ECB,iv)
cipher = cipher1.encrypt(str)
return b2a_hex(cipher)
七、RC2
def encrypt_RC2_ECB(str,key):
str = align(str)
iv = Random.new().read(8)
cipher1 = ARC2.new(key, ARC2.MODE_CBC,iv)
#cipher = iv + cipher1.encrypt(str)
cipher = cipher1.encrypt(str)
return b2a_hex(cipher)
八、Camellia
def encrypt_Camellia_ECB(str,key):
str = align(str)
iv = Random.new().read(16)
key = bytes(key, encoding="utf8")
str = bytes(str, encoding="utf8")
#iv = bytes(iv, encoding="utf8")
c1 = camellia.CamelliaCipher(key=key, IV=iv, mode=camellia.MODE_ECB)
encrypted = c1.encrypt(str)
return b2a_hex(encrypted)
Cmallia需要camellia这个包,可以使用在命令行pip install camellia下载。
九、主函数
读明文文件,加密,存储密文文件函数:
#读取明文,调用加密算法加密并存储密文
def createFile(key, dirpath,filepath):
files = os.listdir(dirpath) # 得到文件夹下的所有文件名称
txts = []
for file in files: # 遍历文件夹
position = dirpath + '\\' + file # 构造绝对路径,"\\",其中一个'\'为转义符
print(position)
with open(position, "r", encoding='utf-8') as f: # 打开文件
text = f.read() # 读取文件
crypto_Camellia = encrypt_DES_ECB(text, key)
print(type(crypto_Camellia))
s=crypto_Camellia.decode()
print(type(s))
fh = open(filepath+ file, 'w', encoding='utf-8')
fh.write(s)
fh.close()
f.close()
主函数调用:
if __name__ == '__main__':
#生成密钥
key = keyGenerater(16)
print(key)
#明文
dirpath_NIST_Plaintext = r"E:\Model_identify_Crypto\100"
#密文
filepath_NIST_Camellia = r"E:\Model_identify_Crypto\DES_CTR\DES_CTR_"
#加密
createFile(key,dirpath_NIST_Plaintext,filepath_NIST_Camellia)
总结
基本所有的分组密码加密python已经给了我们现成的库函数,我们只需调用即可,可以以AES为例进行调试运行,其他加密算法都是类似。