使用Python对数据进行AES加密和解密

随着网络上爬虫的横行和猖獗 , 各大网站为了最大限度地限制自家数据被采集 , 纷纷加入了各种反爬手段 , 比如:

  • 生成浏览器UA指纹识别;
  • 用各种验证方式(短信、滑块、点选汉字、点击)进行识别;
  • ……
这一类的反爬手段都是一层防御 , 类似于城堡的城门一样 , 只要突破这道防线 , 就可以为所欲为了 。
除此之外 , 还有一些网站 , 会进行二层防御 , 对数据加入各种限制措施 , 比如混淆、加密等 。这就像我们进了城门之后 , 要是想进某某内城 , 还得经过门口的官兵对腰牌和核验 。
比如某电商网站就在数据中使用了AES加密 , 其返回的数据如下图所示:
使用Python对数据进行AES加密和解密

文章插图
 
经过解密之后 , 我们可以得到真正的数据为 , 如下图所示:
使用Python对数据进行AES加密和解密

文章插图
 
这就是利用Python进行AES解密实现的 , 下面 , 我们来介绍一下在Python中对数据进行AES加密和AES解密 。
一、AES算法简介
以下内容来自于网络 , 大家随便看看 , 如果想详细了解 , 可以找专门的资料进行学习:
AES全称为高级加密标准 , 是Advanced Encryption Standard的首字母简写 。
AES加密标准又称为高级加密标准Rijndael加密法 , 是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准 。AES的基本要求是 , 采用对称分组密码体制 , 密钥长度可以为128、192或256位 , 分组长度128位 , 算法应易在各种硬件和软件上实现 。1998年NIST开始AES第一轮分析、测试和征集 , 共产生了15个候选算法 。[1]1999年3月完成了第二轮AES2的分析、测试 。2000年10月2日美国政府正式宣布选中比利时密码学家Joan Daemen和Vincent Rijmen提出的一种密码算法Rijndael作为AES的加密算法 。AES加密数据块和密钥长度可以是128b、192b、256b中的任意一个 。AES加密有很多轮的重复和变换 。大致步骤如下:①密钥扩展(Key Expansion);②初始轮(InitialRound);③重复轮(Rounds) , 每一重复轮又包括字节间减法运算(SubBytes)、行移位(ShiftRows)、列混合(MixColurmns)、轮密钥加法运算(AddRoundKey)等操作;①最终轮(Final Round) , 最终轮没有列混合操作(MixColumns) 。
二、AES加密
在这里 , 我们选用AES加密算法中的CBC模式来进行演示 。
在上面我们提过 , AES加密算法的CBC模式采用密钥和偏移量的方式对数据进行加密 , 所以我们首先定义几个公共的参数 , 包括原始数据、密钥、偏移量和AES的CBC模式 , 代码如下所示:
a = '''{'name':'州的先生','url':'zmister.com','desc':'编程应用实战'}''' # 原始数据k = 'zmistercomzmiste'.encode('utf-8') # 密钥iv = b'1234567890asdfgh' # 偏移量mode = AES.MODE_CBC # 模式在这里 , 我们设置的密钥长度为16位字符串 , 也就是128位字节 , 在AES加密算法中 , 密钥的长度必须为16位字符串(128字节)、34位字符串(192字节)、32位字符串(256字节) 。
接着 , 我们创建一个函数 , 用来对原始的数据进行加密:
# 加密数据def cryp_str(value): value = https://www.isolves.com/it/cxkf/yy/Python/2019-09-20/value.encode('utf-8') # 对数据进行utf-8编码 cryptor = AES.new(k, mode, iv) # 创建一个新的AES实例 length = 16 count = len(value) # 如果数据长度小于密钥长度 if count < length: add = (length - count) #backspace text = value + ('' * add).encode('utf-8') elif count > length: add = (length - (count % length)) text = value + ('' * add).encode('utf-8') ciphertext = cryptor.encrypt(text) # 加密字符串 print("原始加密数据:",ciphertext) ciphertext_hex = b2a_hex(ciphertext) # 字符串转十六进制数据 print("十六进制加密:",ciphertext_hex) ciphertext_hex_de = ciphertext_hex.decode() print("十六进制加密字符串:",ciphertext_hex_de) return ciphertext_hex_de我们将原始数据传入其中运行 , 可以得到加密后的数据 , 如下图所示:
使用Python对数据进行AES加密和解密

文章插图
 
在完成使用Python对数据进行AES加密之后 , 我们继续使用Python对AES加密的数据进行解密 。


推荐阅读