天天看點

前端DES加密解密(.net/java等後端語言中的CBC模式/ECB模式,雙模式使用方法)

背景:窩點後端是.net,要對登入請求資料加密,接收資料解密,讨論到用什麼方式,後端寶直接就說DES,嗯...說實話當時聽都沒聽過...然後開始懵逼版百度,找了很久有DES解密方法,可是居然解不出,看到都是java端,咱這.net端怎麼也解不了呢,後來發現DES解密不隻有一種模式的,找到的一直解的都是ECB模式,CBC模式才是.net預設模式,可是怎麼辦找不到,于是把ECB模式解密的crypto-js.js拿到看原文,查詢下CBC,哇瞬間幸福感,原來加iv偏移量,把模式更改為CBC,就可以了,當中我也發現CBC還有明顯差別就是自己做了base64加密解密的....廢話不多說了,走解決流程:

首先下載下傳crypto-js解密加密工具

前端DES加密解密(.net/java等後端語言中的CBC模式/ECB模式,雙模式使用方法)

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加密,解密也會自己進行)

前端DES加密解密(.net/java等後端語言中的CBC模式/ECB模式,雙模式使用方法)

自己試試如果不知道正确與否,再提供一個測試網站:http://tool.chacuo.net/cryptdes

好了前端DES的加密解密就說到,希望能幫到你。

更多詳情的加密方式,推薦此篇文章^-^ https://blog.csdn.net/guxingsheng/article/details/84451573

【我是小墨_Simon,感謝您閱讀,一起加油!】

繼續閱讀