赞
踩
AES简介
AES(Advanced Encryption Standars)高级加密标准,又称 Rijndael 加密法,是美国联邦政府采用的一种区块加密标准。AES是用来替换DES的,已经被广泛应用于各行各业。AES由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
AES算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijdael之名命之,投稿高级加密标准的甄选流程。(Rijdael的发音近于 “Rhine doll”。)
AES是对称加密算法。AES算法基于排列和置换运算。排列是对数据重新进行安排,置换是将一个数据单元替换为另一个。AES使用几种不同的方法来执行排列和置换运算。AES是一个迭代的、对称密钥分组的密码。AES 加密有 AES-128、AES-192、AES-256 三种。分别对应三种密钥长度 128bits(16字节)、192bits(24字节)、256bits(32字节)。当然,密钥越长,安全性越高,加解密花费时间也越长。默认的是AES-128,其安全性完全够用。与公共密钥加密使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换和替换输入数据。
AES是基于数据块的加密方式,也就是说,每次处理的数据是一块(16字节),当数据不是16字节的倍数时会进行填充,这就是所谓的分组密码(区别于基于比特位的流密码),16字节是分组长度。
python需要安装 pycryptodome 库,装方法:pip install pycryptodome
(用pip装各种库有时候是一件很痛苦的事情,后期有时间单独写一篇博客分析一下各种坑~~~~,不会装的访问一下这个 神奇的网站.)
(刚刚安装Crtpto库时又遇到了一个坑!!!居然用pip install Crypto命令时报错如下
网上查明原因竟然是我开启了VPN!!!!!)
pip报错种类太多了,该话题后期再聊,继续这次的主角,上代码!
下面展示python代码
。
import base64 from Crypto.Cipher import AES # 密钥(key), 密斯偏移量(iv) CBC模式加密 def AES_Encrypt(key, data): vi = '0102030405060708' pad = lambda s: s + (16 - len(s)%16) * chr(16 - len(s)%16) data = pad(data) # 字符串补位 cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8')) encryptedbytes = cipher.encrypt(data.encode('utf8')) # 加密后得到的是bytes类型的数据 encodestrs = base64.b64encode(encryptedbytes) # 使用Base64进行编码,返回byte字符串 enctext = encodestrs.decode('utf8') # 对byte字符串按utf-8进行解码 return enctext def AES_Decrypt(key, data): vi = '0102030405060708' data = data.encode('utf8') encodebytes = base64.decodebytes(data) # 将加密数据转换位bytes类型数据 cipher = AES.new(key.encode('utf8'), AES.MODE_CBC, vi.encode('utf8')) text_decrypted = cipher.decrypt(encodebytes) unpad = lambda s: s[0:-s[-1]] text_decrypted = unpad(text_decrypted) # 去补位 text_decrypted = text_decrypted.decode('utf8') return text_decrypted key = '8Vh1Py0Eg8Ks8Ji7' data = '123456' AES_Encrypt(key, data) enctext = AES_Encrypt(key, data) #加密后的字符串 text_decrypted = AES_Decrypt(key, enctext) #加密的字符串 print("加密的字符串为:",text_decrypted) print("加密后的字符串为:",enctext)
from Crypto.Cipher import AES import base64 BLOCK_SIZE = 16 # Bytes pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * chr(BLOCK_SIZE - len(s) % BLOCK_SIZE) unpad = lambda s: s[:-ord(s[len(s) - 1:])] #加密函数 def aesEncrypt(key, data): ''' AES的ECB模式加密方法 :param key: 密钥 :param data:被加密字符串(明文) :return:密文 ''' key = key.encode('utf8') # 字符串补位 data = pad(data) cipher = AES.new(key, AES.MODE_ECB) # 加密后得到的是bytes类型的数据,使用Base64进行编码,返回byte字符串 result = cipher.encrypt(data.encode()) encodestrs = base64.b64encode(result) enctext = encodestrs.decode('utf8') return enctext #解密函数 def aesDecrypt(key, data): ''' :param key: 密钥 :param data: 加密后的数据(密文) :return:明文 ''' key = key.encode('utf8') data = base64.b64decode(data) cipher = AES.new(key, AES.MODE_ECB) # 去补位 text_decrypted = unpad(cipher.decrypt(data)) text_decrypted = text_decrypted.decode('utf8') return text_decrypted if __name__ == '__main__': key = '8Vh1Py0Eg8Ks8Ji7' data = '123456' enctext = aesEncrypt(key, data) text_decrypted = aesDecrypt(key, enctext) print("加密的字符串为:",text_decrypted) print("加密后的字符串为:",enctext)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。