Python 对称加密ECB简单实现

利用pycrypto中的方法来实现简单的ECB对称加密
具体代码如下

from base64 import b64decode
from base64 import b64encode
from Crypto.Cipher import AES # pip install pycrypto==2.6.1
import time


class ECBCipher(object):
    '''
    定义一个基于AES的ECB模式的加解密类
    '''
    def __init__(self, key):
        '''
        定义构造方法,初始化key和加解密对象
        :params key:长度必须为16位
        '''
        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)
    print('解密:', decode_text)

输出:

未加密字符串: e2d8fae47d4c11ea942cc8d9d2066a43+1634544242
加密: zA1Ye1G6d3EGTelNMhnYvqkoNgMEH5sbgBMA8NbM+HcbaggnhmrHVkZNmoCrZtiQ
解密: e2d8fae47d4c11ea942cc8d9d2066a43+1634544242
Python内置了一些加密模块,例如`cryptography`和`pycryptodome`等,可以用来实现对称加密文件并解密。 这里我们以`pycryptodome`为例,演示如何使用AES对称加密算法加密文件,并解密加密后的文件。 首先,你需要安装`pycryptodome`模块。你可以使用`pip`命令来进行安装: ``` pip install pycryptodome ``` 然后,你可以使用以下代码来实现对称加密文件: ```python from Crypto.Cipher import AES from Crypto.Random import get_random_bytes # 定义加密函数 def encrypt_file(key, in_filename, out_filename=None, chunksize=64*1024): # 如果没有指定输出文件名,则将输入文件名加上'.enc'后缀作为输出文件名 if not out_filename: out_filename = in_filename + '.enc' # 使用AES加密算法,ECB模式,PKCS7填充方式 cipher = AES.new(key, AES.MODE_ECB) # 获取随机数作为IV向量 iv = get_random_bytes(AES.block_size) # 打开输入文件和输出文件 with open(in_filename, 'rb') as infile: with open(out_filename, 'wb') as outfile: # 先将IV向量写入输出文件 outfile.write(iv) # 逐块读取输入文件,并加密后写入输出文件 while True: chunk = infile.read(chunksize) if len(chunk) == 0: break elif len(chunk) % AES.block_size != 0: # 如果长度不是16的倍数,则使用PKCS7填充 chunk += b' ' * (AES.block_size - len(chunk) % AES.block_size) outfile.write(cipher.encrypt(chunk)) # 定义解密函数 def decrypt_file(key, in_filename, out_filename=None, chunksize=24*1024): # 如果没有指定输出文件名,则将输入文件名去掉'.enc'后缀作为输出文件名 if not out_filename: out_filename = in_filename[:-4] # 使用AES加密算法,ECB模式,PKCS7填充方式 cipher = AES.new(key, AES.MODE_ECB) # 打开输入文件和输出文件 with open(in_filename, 'rb') as infile: with open(out_filename, 'wb') as outfile: # 读取IV向量 iv = infile.read(AES.block_size) # 逐块读取输入文件,并解密后写入输出文件 while True: chunk = infile.read(chunksize) if len(chunk) == 0: break outfile.write(cipher.decrypt(chunk)) # 去掉PKCS7填充 outfile.truncate(outfile.tell() - ord(outfile.read()[-1])) ``` 使用以上代码,你可以调用`encrypt_file()`函数来加密文件,调用`decrypt_file()`函数来解密加密后的文件。这里需要传入一个`key`参数,作为加密和解密的密钥。注意,密钥长度必须是16、24或32字节(即128、192或256位)。 例如,你可以这样来加密一个文件: ```python key = b'your_secret_key' # 定义密钥 encrypt_file(key, 'plain_file.txt', 'encrypted_file.txt.enc') # 加密文件 ``` 然后,你可以这样来解密加密后的文件: ```python key = b'your_secret_key' # 定义密钥 decrypt_file(key, 'encrypted_file.txt.enc', 'decrypted_file.txt') # 解密文件 ``` 以上代码中的加密算法使用了AES,ECB模式和PKCS7填充方式。在实际使用中,你应该根据自己的需求选择合适的加密算法、加密模式和填充方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haeasringnar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值