python AES加密

外链:DES、AES、RSA等常用加密算法介绍与比较

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

AES,是美国联邦政府采用的一种加密技术,AES加密方式有五种:ECB, CBC, CTR, CFB, OFB,其中CBC模式是公认的安全性最好的模式,被TLS所采用。

加密与解密双方需确定好key,key的长度可以是16位,24位,32位中的一个,分别对应了不同的算法。

如果key的长度是是16位的,那么被加密的明文长度必须是16的整数倍,但实际使用中,这么巧的事情很难发生,因此就需要对明文进行填充,最常用 的方式就是填充\0,等到解密的时候,再把解密出来的明文右侧的\0全部去掉。你也许会关心,如果我明文最右侧原本就是一堆的\0,那么这么搞,岂不是要 出问题么,是滴,确实会出问题,但这样的明文用来做什么呢?你想多了,这样的明文你这辈子恐怕都不会遇到。

AES只是个基本算法,简单地说,CBC使用密码和salt(起扰乱作用)按固定算法(md5)产生key和iv。然后用key和iv(初始向量,加密第一块明文)加密(明文)和解密(密文)。

以下是python代码实现:
import base64
from Crypto.Cipher import AES

#key默认值
aes_key='1234567890123456'
class prpcrypt():
    """
    AES加密
    """

    def __init__(self, key=None, iv=None):
        """
        初始化
        :param key:
        :param iv:
        """
        # 加密时使用的key,只能是长度16,24和32的字符串
        self.key = key if key else aes_key
        # 加密向量,根据加密模式来确定,默认模式ECB不用传,CBC模式需要此参数
        self.iv = iv if iv else self.key
        self.bs = AES.block_size
        # 加密模式,这里用的CBC模式,默认ECB模式
        self.mode = AES.MODE_CBC

    def encrypt(self, data):
        """
        用aes加密,再用base64  encode
        :param data:
        :return:
        """
        # 如果text不是16的倍数【加密文本text必须为16的倍数!】,那就补足为16的倍数
        pad = lambda s: s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)
        cipher = AES.new(self.key, self.mode, self.iv)
        encrypted = cipher.encrypt(pad(data))  # aes加密
        # 因为AES加密时候得到的字符串不一定是ascii字符集的,输出到终端或者保存时候可能存在问题 ,
        # 所以这里转换为base64
        result = base64.b64encode(encrypted)  # base64 encode
        return result

    def decrypt(self, data):
        """
        把加密的数据,用base64  decode,再用aes解密
        :param data:
        :return:
        """
        # 去掉补全的空格
        unpad = lambda s: s[0:-ord(s[-1])]
        cipher = AES.new(self.key, self.mode, self.iv)
        result2 = base64.b64decode(data)
        decrypted = unpad(cipher.decrypt(result2))
        return decrypted

你可能感兴趣的:(python AES加密)