AES加密
加密模式
ECB
ECB(电子密码本模式:Electronic codebook)是最简单的块密码加密模式,加密前根据加密块大小(如AES为128位)分成若干块,之后将每块使用相同的密钥单独加密,解密同理。
####CBC
CBC(密码分组链接:Cipher-block chaining)模式对于每个待加密的密码块在加密前会先与前一个密码块的密文异或然后再用加密器加密。第一个明文块与一个叫初始化向量的数据块异或。
CFB
CBC(密文反馈:Cipher feedback)模式对于每个待加密的密码块在加密前会先与前一个密码块的密文异或然后再用加密器加密。第一个明文块与一个叫初始化向量的数据块异或。
OFB
OFB(输出反馈:Output feedback)是先用块加密器生成密钥流(Keystream),然后再将密钥流与明文流异或得到密文流,解密是先用块加密器生成密钥流,再将密钥流与密文流异或得到明文,由于异或操作的对称性所以加密和解密的流程是完全一样的。
数据填充方式
PKCS5Padding
如果块长度是16,数据长度9,那么还差7个字节,就在后面补充7个0x07,如下所示
如果数据长度为16,仍然需要补充16个0x16
PKCS7Padding
在AES加密的时候,同PKCS5Padding
####ZeroPadding
如字面意思,在数据后面填充0即可
Java 实现
Java 并不支持ZeroPadding填充模式,用NoPadding代替,然后手动填充,未避免麻烦,本例中 iv和key都是16位,不需要填充,实际生产中可能需要填充,注意加密解密端保持一致。
Python 实现
Python 实现采用Crpyto库,以下代码用lambda自己实现的pkcs5填充,仅供参考
Javascript 实现
JS的加密采用了CryptoJS库,示例代码如下
ECB 模式默认的是ZeroPadding
1234567891011121314 <script src="js/cryptojslib/rollups/aes.js"></script><script src="js/cryptojslib/components/pad-zeropadding-min.js"></script><script>var data = "123456";var key = CryptoJS.enc.Latin1.parse('1234567812345678');var iv = CryptoJS.enc.Latin1.parse('1234567812345678');//加密//如果不是和Java交互,而是和python或者其他交互,那么padding方式可以采用pkcs7(和pkcs5一样)var encrypted = CryptoJS.AES.encrypt(data,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});console.log('encrypted: ' + encrypted) ;