# -*- coding: utf-8 -*-
import sys
from Crypto.Cipher import AES
from Crypto import Random
from binascii import b2a_hex, a2b_hex
class prpcrypt():
def __init__(self, key):
self.key = key # key是bytes类型的
self.mode = AES.MODE_CBC
self.iv = Random.new().read(AES.block_size)
print(self.iv, '二进制形式')
print(b2a_hex(self.iv), '二进制的十六进制assicc形式')
# 加密函数,如果text不是16的倍数【加密文本text必须为16的倍数!】,那就补足为16的倍数
def encrypt(self, text): # text 参数是bytes类型 输出 也是bytes类型
cryptor = AES.new(self.key, self.mode, self.iv)
# 这里密钥key 长度必须为16(AES-128)、24(AES-192)、或32(AES-256)Bytes 长度.目前AES-128足够用
length = 16
count = len(text)
if count % length != 0:
add = length - (count % length)
else:
add = 0
text = text + (b'\0' * add)
self.ciphertext = cryptor.encrypt(text)
# 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题
# 所以这里统一把加密后的字符串转化为16进制字符串
result = b2a_hex(self.ciphertext) # bytes to ascii 形式,hex形式
return result
# 解密后,去掉补足的空格用strip() 去掉
def decrypt(self, text):
cryptor = AES.new(self.key, self.mode, self.iv)
plain_text = cryptor.decrypt(a2b_hex(text))
return plain_text.rstrip(b'\0')
if __name__ == '__main__':
# 结论 如何加密,如何解密
mp4_path = r'C:\Users\wangcc\Desktop\ads_svp_video__0b6bt4aagaaas4amgwefrvpbvhyeaopqaa2a.f40.mp4'
with open(mp4_path, 'rb') as f:
buf = f.read()
pc = prpcrypt(b'keyskeyskeyskeys') # 初始化密钥
# e = pc.encrypt(b"0123456789ABCDEF")
# print(buf, 'buf')
e = pc.encrypt(buf)
with open('encrypt.mp4', 'wb') as enf:
enf.write(e)
print(type(e), 'e en')
d = pc.decrypt(e)
with open('decrypt.mp4', 'wb') as df:
df.write(d)
aes 128位加密/解密
最新推荐文章于 2024-04-24 10:34:23 发布