【Python实现AES加密】

穿精又带淫゛_ 提交于 2019-11-28 11:00:31

原文: http://blog.gqylpy.com/gqy/392

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

        AES在软件硬件上都能快速地进行加密解密,相对来说较易于实作,且只需要很少的存储器。作为一个新的加密标准,目前正在被部署应用到更广大的范围。

特点

  1. 抵抗所有已知的攻击
  2. 在多个平台上速度快,编码紧凑
  3. 设计简单

原理

        AES为分组密码,分组密码就是把明文分成一组一组的,没组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同。一般常用的128位。

基本用法

import binascii from Cryptodome.Cipher import AES from Cryptodome import Random   # 准备要加密的数据 data = "数据库的密码是:123456"  # 秘钥-Key,秘钥的长度必须为 16(AES-128)、24(AES-192)、32(AES-256) key = b'0' * 16   # 1. 生成长度等于AES块大小的不可重复的秘钥向量 iv = Random.new().read(AES.block_size)  # 2. 使用 key 和 iv 初始化AES对象 cipher = AES.new(key, AES.MODE_CFB, iv)  # 3. 加密的明文长度必须为16的倍数,如果长度不为16的倍数,则需要补充为16的倍数 # data += (16 - len(data) % 16) * '=' # 书上是这么说的,但我这里实测都没问题的  # 4. 加密数据 cipher_data = cipher.encrypt(data.encode()) print(binascii.b2a_hex(cipher_data))  # b'9b5e93ee68df40be7bd7bc08fa8ef21430ab6801cb4f7bf002e51a1bf7d6'  # 5. 生成新的AES对象,该AES对象用于解密 decrypt = AES.new(key, AES.MODE_CFB, iv)  # 6. 解密数据 decrypt_data = decrypt.decrypt(cipher_data) print(decrypt_data.decode())  # 数据库的密码是:123456   # 注意:     # AES对象加密数据后不可再调用解密方法     # 一个AES对象只可解密一条数据

原文: http://blog.gqylpy.com/gqy/392

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!