实现PHP和JavaScript的TripleDES加密解密(一)
介绍
因为第三方PaaS服务商的接口调用是使用TripleDES加密参数的,因此需要在PHP实现与js效果一样的加密和解密,因此在花费了一周的时间解决这个问题后,记录过程,因为内容比较多,大致拆分了三部分。
1. 阐述TripleDES算法原理以及JS中的应用
2. 在PHP中模拟TripleDES加密
3. 业务过程中遇到的一些问题及其解决办法
什么是TriplesDES
TriplesDES是对称加密中的一种加密方式,而对称加密,是一种比较传统的加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码)。因此,通信双方都必须获得这把钥匙,并保持钥匙的秘密
TripleDES算法提供的key位数更多,加密可靠性更高。使用24字节的key,初始向量IV也是8字节。而算法都是以8字节为一个块进行加密,一个数据块一个数据块的加密,一个8字节的明文加密后的密文也是8字节。如果明文长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。所以加密后的密文长度一定为8字节的整数倍。
js里的TripleDES是什么样的
在了解TriplesDES加密算法其实就是对称加密算法中的一种后,JavaScript中有提供类似的加密库也就是cryptoJs。因此我们需要在PHP去实现和cryptoJs加密一样的效果,而我们则主要使用cryptoJs中的TriplesDES加密方式
var iv = CryptoJs.enc.Hex.parse('0000000000000001');
var key = CryptoJs.enc.Utf8.parse(sk.substr(0, 24));
var msg = CryptoJs.enc.Utf8.parse(JSON.stringify(bodyDict));
var encrypted = CryptoJs.TripleDES.encrypt(msg, key, {
iv: iv,
mode: CryptoJs.mode.CBC,
padding: CryptoJs.pad.Pkcs7
}).ciphertext;
var based = CryptoJs.enc.Base64.stringify(encrypted).toString()
上面则是在JS中使用 CryptoJs.TripleDES 加密的整个过程。而加密中会使用一些参数,我接下来讲讲这些参数的意思和原理
- msg: 这个就是加密中的明文,也就是我们需要加密的数据,在加密之前需要转成字符串才能参与加密。
- key: 这个则是加密使用的key,因为TripleDES使用的是24位key,因此需要截取24位字串
mode: 工作模式,这个也就是加密算法中的加密方式了,目前常用两种
- ecb: 一般先将明文分成等长大小的块,通常为8个字节。然后用相同的密钥对每个明文块加密
- cbc: 先对当前的明文组和上一个密文组做异或,然后将异或的结果用密钥加密
iv: 初始向量,在cbc模式中主要跟第一组明文组做异或操作后再和密钥加密的,因此也称始向量。
padding: 则是补位模式,因为加密方式的原因,通常会每8个字节拆为一个明文组进行加密。因此会遇到一个问题,如果明文不是8的倍数怎么办?数据补位实际是在数据不满8字节的倍数,才补充到8字节的倍数的填充过程
NoPadding: 算法本身不填充,比如.NET的padding提供了有None,Zeros方式,分别为不填充和填充0的方式。
PKCS7Padding(PKCS5Padding)填充方式:为.NET和JAVA的默认填充方式,对加密数据字节长度对8取余为r,如r大于0,则补8-r个字节,字节为8-r的值;如果r等于0,则补8个字节8。
比如:加密字符串为为AAA,则补位为AAA55555;加密字符串为BBBBBB,则补位为BBBBBB22;加密字符串为CCCCCCCC,则补位为CCCCCCCC88888888。
因此在了解上面所有参数后,大概就知道这个加密算法的运作方式了,接下来只需要在PHP中去模拟TripleDES加密了。