背景:窩點後端是.net,要對登入請求資料加密,接收資料解密,讨論到用什麼方式,後端寶直接就說DES,嗯...說實話當時聽都沒聽過...然後開始懵逼版百度,找了很久有DES解密方法,可是居然解不出,看到都是java端,咱這.net端怎麼也解不了呢,後來發現DES解密不隻有一種模式的,找到的一直解的都是ECB模式,CBC模式才是.net預設模式,可是怎麼辦找不到,于是把ECB模式解密的crypto-js.js拿到看原文,查詢下CBC,哇瞬間幸福感,原來加iv偏移量,把模式更改為CBC,就可以了,當中我也發現CBC還有明顯差別就是自己做了base64加密解密的....廢話不多說了,走解決流程:
首先下載下傳crypto-js解密加密工具
1、npm下載下傳即可
npm install crypto-js
2、拿到crypto-js.js引入到相關解密加密區即可
<script type="text/javascript" src="./crypto-js.js" charset="UTF-8"></script>
咱們需要的工具準備好了。搬好小闆凳,給大家科普一下加密算法DES的CBC模式/ECB模式
- ECB模式:電子密本方式,JAVA封裝的DES算法的預設模式
- CBC模式:密文分組連結方式,.NET封裝的DES算法的預設模式
嗯...知道這些就夠了,你們也沒耐心看字,代碼才最重要。咱對号選方式就行,看後端是啥咱就用啥。
直接上代碼:
// DES加密模式:CBC模式/ECB模式
// CBC模式
// 加密
function encryptCBC(text, textKey) {
// 密鑰轉成16進制的字元串
var key = CryptoJS.enc.Utf8.parse(textKey);
// 加密過程
var encrypted = CryptoJS.DES.encrypt(text, key, {
// iv偏移量為key值
iv: key,
// 模式為CBC
mode: CryptoJS.mode.CBC,
// DES加密padding為Pkcs7
padding: CryptoJS.pad.Pkcs7
});
// 加密傳回為字元串密文(加密經過一次base64加密,結果可看結果)
return encrypted.toString();
}
// 解密
function decryptCBC(cipherText, textKey) {
var key = CryptoJS.enc.Utf8.parse(textKey);
var decrypt = CryptoJS.DES.decrypt(cipherText, key, {
iv: key,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
// 解密傳回轉為UTF-8明文(解密也經過一次base64解密)
return decrypt.toString(CryptoJS.enc.Utf8);
}
// ECB模式 (此模式可詳細看大佬文章:https://blog.csdn.net/vv_bug/article/details/71435417)
// 加密
function encryptECB(text, textKey) {
//把私鑰轉換成16進制的字元串
var key = CryptoJS.enc.Utf8.parse(textKey);
//模式為ECB padding為Pkcs7
var encrypted = CryptoJS.DES.encrypt(text, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
//加密出來是一個16進制的字元串
return encrypted.ciphertext.toString();
}
// 解密
function decryptECB(ciphertext, textKey) {
//把私鑰轉換成16進制的字元串
var key = CryptoJS.enc.Utf8.parse(textKey);
//把需要解密的資料從16進制字元串轉換成字元byte數組
var decrypted = CryptoJS.DES.decrypt({
ciphertext: CryptoJS.enc.Hex.parse(ciphertext)
}, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
//以utf-8的形式輸出解密過後内容
return decrypted.toString(CryptoJS.enc.Utf8);
}
測試一下結果看看:
<script>
window.onload=function(){
// 明文
var myText = 'healer';
// 密鑰
var myKey = 'ABCDEFGH';
// CBC加密解密
var enCBC = encryptCBC(myText,myKey);
console.log(enCBC); // 經過一次base64加密
var deCBC = decryptCBC(enCBC,myKey);
console.log(deCBC);
// ECB加密解密
var enECB = encryptECB(myText,myKey);
console.log(enECB);
var deECB = decryptECB(enECB,myKey);
console.log(deECB);
}
</script>
控制台結果:(提示:CBC模式自己做了一次base64加密,解密也會自己進行)
自己試試如果不知道正确與否,再提供一個測試網站:http://tool.chacuo.net/cryptdes
好了前端DES的加密解密就說到,希望能幫到你。
更多詳情的加密方式,推薦此篇文章^-^ https://blog.csdn.net/guxingsheng/article/details/84451573
【我是小墨_Simon,感謝您閱讀,一起加油!】