本文只适用于初学者,只需要会打断点追踪就可以了。
前端js代码除了Base64编码和解码,MD5加密,AES加密,RSA加密之外,偶尔还会看见DES/3DES加密。
简介
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。
DES是一种对称加密方式,其加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码。
DES是以64比特的明文为一个单位来进行加密的,超过64比特的数据,要求按固定的64比特的大小分组,关于分组模式参见链接。
DES使用的密钥长度为64比特,但由于每隔7个比特设置一个奇偶校验位,因此其密钥长度实际为56比特,另外8位是奇偶校验位。奇偶校验为最简单的错误检测码,即根据一组二进制代码中1的个数是奇数或偶数来检测错误。
其加密/解密过程如下:
DES加密的缺陷明显,即56位的密钥安全性不足,已被证实可以在短时间内破解。为解决此问题,出现了3DES,也称Triple DES。
3DES为DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。为了兼容普通的DES,3DES并没有直接使用 加密->加密->加密 的方式,而是采用了加密->解密->加密 的方式。
其加密过程如下:
当三重密钥均相同时,前两步相互抵消,相当于仅实现了一次加密,因此可实现对普通DES加密算法的兼容。
相比DES,3DES因密钥长度变长,安全性有所提高,但其处理速度不高。因此又出现了AES加密算法,AES较于3DES速度更快、安全性更高。
js使用DES加密
DES加密的弱点已经说过了,所以实际中使用的很少。
看form data,界面上输入的密码是“123456”,但是实际显示的内容很明显是加密过的。
进入source,搜索"password"
在这里,6969行,encryptByDES。
继续搜索“encryptByDES”
在这里了,熟悉吗?是的,很AES加密太像了。
把代码复制出来,nodejs执行一下
const CryptoJS = require('crypto-js'); //引用AES源码js
function encryptByDES(t, e) {
var a = CryptoJS.enc.Utf8.parse(e);
try {
var s = CryptoJS.DES.encrypt(String(t), a, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
})
} catch (t) {
console.log(t)
}
return s.toString()
}
DESkey= "e9284d45-cf2a-4e46-9367-f122413ca6b0"
aaaa="123456"
console.log(encryptByDES(aaaa,DESkey))
运行结果,是一致的。
88Fypeu1fTg=
补充内容
1.分组模式
这个网站的分组模式用的是ECB,也就是电码本模式 Electronic Codebook Book。
这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。
这种模式的优点
- 简单
- 有利于并行计算
- 误差不会被传送
这种模式的缺点
- 不能隐藏明文的模式
- 可能对明文进行主动攻击
2.3DES加密
如果是3DES加密方式,那使用以下代码
CryptoJS.TripleDES.encrypt
3.2个文件
网上的很多例子使用的以下2个文件
<script src="tripledes.js"></script>
<script src="mode-ecb-min.js"></script>
这2个文件
- tripledes.js 为DES主文件,自带 CBC模块
- mode-ecb.js 为 DES的ECB模块
使用CBC模式引入 tripledes.js,二使用 ECB模式需要引入 tripledes.js和mode-ecb.js。
上面的网站就是使用这2个文件。
我在nodejs中引入的是整个crypto模块。
其实在安装目录中node_modules\crypto-js,也能找到这2个文件。