一、什么是AES加密
一、定义
密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。
二、加密方式及参数
1、密钥
密钥是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法解密需要使用同一个密钥
AES支持三种长度的密钥:
128位,192位,256位
俗称:AES128,AES192,AES256
2、填充
要想了解填充的概念,我们先要了解AES分组加密特性
什么是分组加密呢?我们先看下面这张图:
AES算法在对明文加密的时候,并不是把整个明文都加密成一整段密文,而是把明文拆分成一个独立的明文块,每一个明文块长度128bit
这些明文经过AES加密器的复杂处理,生成一个个独立的密文块,这些密文块拼接到一起,就是最终的AES加密结果。
但是这里涉及一个问题:
加入一段明文长度是192bit,如果按每128bit一个明文块来拆分的话,第二个明文块只有192-128=64bit,不足128bit。这时候就需要对明文进行填充(Padding)。
填充方式:
1、NoPadding
不做任何填充,但是要求明文必须是16字节的整数倍
2、PKCS5Padding(默认)
如果明文块缺少于16字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。
例如:{1,2,3,4,5,a,b,c,d,e}缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}
3、ISO10126Padding
如果明文缺少于16字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数
例如:{1,2,3,4,5,a,b,c,d,e}缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,5,c,3,G,$,6}
需要注意的是,如果再AES加密的时候使用了某一种填充,解密的时候也必须采用同样的填充方式。
3、模式
AES的工作模式,体现在把明文块加密成密文块的处理过程中。AES加密算法提供了五种不同的工作模式:
ECB、CBC、CTR、CFB、OFB
三、模式讲解
主要讲解一下常用的两种模式ECB和CBC
1、ECB模式
ECB模式是最简单的工作模式,在该模式下,每一个明文块的加密都是完全独立,互不干扰的。
优点:
1.简单
2.有利于并行计算
缺点:
安全性差
2、CBC模式
CBC模式引入一个新的概念:初始向量IV。用于防止同样的明文块加密成同样的密文块。
从图中可以看出,CBC模式在每一个明文块加密前会让明文块和一个值先做异或操作。IV作为初始化变量,参与第一个明文块的异或,后续的每一个明文和它前一个明文块所加密出的密文块相异或。这样下来,相同的明文块加密出的密文块显然是不一样的
优点:
安全性高
缺点:
无法并行计算,性能不如ECB
引入初始化向量IV,增加复杂度
二、python爬虫实战
实现对目标网页的登入
1、查找加密位置
F12抓包,然后调试,找到加密的位置
通过调试发现:
word:账号/密码
LoginPK.cmsPK():‘ailk!QAZ@#$)IY&^’
mode是之前说过的模式
padding是之前说的填充方式
然后return加密后的结果
2、node.js执行文件
1、安装node.js
检查安装是否成功:
node -v
npm -v
2、安装crypto-js
npm isntall crypto-js(和python的pip install XXXX一样)
3、在node中测试加密函数
将加密函数中的密钥直接用值,便于测试
var CryptoJS = require("crypto-js");#导入加密模块
encrypt = function(word) {
var key = CryptoJS.enc.Utf8.parse('ailk!QAZ@#$)IY&^');
var srcs = CryptoJS.enc.Utf8.parse(word);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
};
测试完成!
之后就是使用python去调用这个js文件就行了