1、掌握基于ECB电子密码本模式进行大文件加密的思想
2、掌握基于CBC密码分组链接模式进行大文件加密的思想
请简介 ECB、CBC 进行分组加密的原理
ECB 模式是将明文分成固定长度的组块,然后对每个明文分组块使用相同的密钥进行独立加密或解密,且该加密的结果将直接作为密文分组。
CBC 模式是指将前一个密文分组与当前明文分组的内容混合起来进行加密,这样就可以避免
ECB 模式的弱点。 CBC 模式的全称 Cipher Block Chaining 模式(密文分组组链接模式),之所以叫这个名字是因为密文分组是像链条一样相互连接在一起。
实验环境:Python 编程环境/Java 编程环境
1、 请以两种分组加密方式编写一个加密/解密工具,该工具能够接收一个待加密的文件,输出加密后的文件。具体要求如下:
(1) 具体对称加密算法请调用 Java/Python 中的密码库函数实现
(2) 加密/解密工具可以做成命令行的,也可以是基于 Web 页面
2、基于ECB模式进行大数据文件加密/解密
(1) 请绘制一下ECB模式加密和解密的程序流程图
(2) 请简要说明一下你所调用的 Java/Python 库中的对称分组加密算法(API 名称及 用法的说明) def __init__(self, key): 定义构造方法,初始化 key 和加解密对象 :params key:长度必须为 16 位 def __pad(self, s): # 私有方法 定义 PKCS7 填充的私有方法,用于对目标进行补位填充 def __unpad(self, s): 定义去除填充的私有方法,用于对目标进行解码得到 原始值 def encrypted(self, msg): 定义加密方法,对目标进行加密,并返回一个 byte 类型的字符串 def decrypted(self, encode_str): 解密方法,对目标进行解密,并返回一个解密得到的字符串 (3) 截图显示你的加密核心代码,并做简要的解释
from base64 import b64decode
from base64 import b64encode
from Crypto.Cipher import AES
import time
class ECBCipher(object):
'''
定义一个基于 AES 的 ECB 模式的加解密类
'''
def __init__(self, key):
'''
定义构造方法,初始化 key 和加解密对象
:params key:长度必须为 16 位
'''A
if len(key) % 16 != 0:
raise ValueError('key 的长度必须为 16 的倍数。')
self.key = key
self.__cipher = AES.new(self.key.encode(), AES.MODE_ECB)
def __pad(self, s): # 私有方法
'''
定义 PKCS7 填充的私有方法,用于对目标进行补位填充
'''
return s + (AES.block_size - len(s) % AES.block_size) *
chr(AES.block_size - len(s) % AES.block_size)
def __unpad(self, s):
'''
定义去除填充的私有方法,用于对目标进行解码得到原始值
'''
return s[:-ord(s[-1:])]
def encrypted(self, msg):
'''
定义加密方法,对目标进行加密,并返回一个 byte 类型的字符串
:params msg:需要加密的明文
'''
try:
return
b64encode(self.__cipher.encrypt(self.__pad(msg).encode())).decode()
except:
return None
def decrypted(self, encode_str):
'''
定义解密方法,对目标进行解密,并返回一个解密得到的字符串
:params encode_str:需要解密的密文
'''
try:
decode_str =
self.__unpad(self.__cipher.decrypt(b64decode(encode_str))).decode()
return decode_str if decode_str else None
except:
return None
if __name__ == '__main__':
ecb_obj = ECBCipher('16ed9ecc7d9011eab9c63c6aa7c68b67')
need_crypto = 'e2d8fae47d4c11ea942cc8d9d2066a43+%s' %
str(int(time.time()))
encode_text = ecb_obj.encrypted(need_crypto)
decode_text = ecb_obj.decrypted(encode_text)
print('未加密字符串:', need_crypto)
print('加密:', encode_text)
、基于 CBC 模式进行大数据文件加密/解密 (1) 请绘制一下 CBC 模式加密和解密的程序流程图 (2) 请简要说明一下你所调用的 Java/Python 库中的对称分组加密算法(API 名称及 用法的说明) FromCryptoCipher import AES PyCryptodome 是一个低级密码学原语的独立 Python 包 引用其中的 AES 类 Self.key = key Self._cipher = AES.new(self.key.encode(),AES.MODE_ECB) (3) 截图显示你的加密核心代码,并做简要的解释
def encrypt(self, plainText, iv):
plainText = bytes(plainText)
blockSZ = self.block_size
iv = bytes(iv)
# PKCS#7 填充规则
padLen = (blockSZ - len(plainText) % blockSZ)
plainText = plainText + bytes([padLen] * padLen)
#填充密文内容
cipherText = bytearray(blockSZ + len(plainText))
cipherText[0:blockSZ] = iv
for i in range(blockSZ, len(cipherText), blockSZ):
#块长度
j = i + blockSZ
#异或操作
after_xor=bytes(xor_block(plainText[i - blockSZ:i],
cipherText[i - blockSZ:i]))
#调用加密接口
cipherText[i:j] = self.my_cipher.encrypt(after_xor)
return cipherText