常用分组密码算法五种模式加密(python)

文章目录

前言

一、使用的包

二、AES

三、DES

四、3DES

五、Blowfish

六、CAST

七、RC2

八、Camellia

九、主函数

总结


前言

本文介绍常用的分组密码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为例进行调试运行,其他加密算法都是类似。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值