实现PHP和JavaScript的TripleDES加密解密(一)


实现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加密了。


文章作者: 我若为侠
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 我若为侠 !
 上一篇
实现PHP和JavaScript的TripleDES加密解密(二) 实现PHP和JavaScript的TripleDES加密解密(二)
实现PHP和JavaScript的TripleDES加密解密(二)介绍接着上一章开始讲,上章讲了TripleDES的大致原理以及在JS中的使用方法。因此这章节讲下PHP里去实现TripleDES。 PHP 里实现TripleDES加密解密
2020-05-20
下一篇 
Laravel Passport中使用JSON API形式的code授权模式小结 Laravel Passport中使用JSON API形式的code授权模式小结
Laravel Passport中使用JSON API形式的code授权模式小结介绍业务需要开发账号系统,所以在Laravel中使用passport。使用密码授权模式进行前台用户的登录时合格的,但是在开发Oauth的第三方服务的时候,发现授
2020-05-18
  目录