隨筆 - 16  文章 - 42  trackbacks - 0
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          失業中…

          常用鏈接

          留言簿(7)

          隨筆檔案(16)

          技術Blog

          搜索

          •  

          最新隨筆

          最新評論

          閱讀排行榜

          評論排行榜

          Javascript寫的DES算法,目前只能使用8位的密鑰.
          <html>
          <head>
          <meta?http-equiv="content-type"?content="text/html;charset=gb2312">
          <title>DES算法-Code?by?梅雪香</title>
          <style?type="text/css">
          textarea
          {width:600px;?height:150px;}
          body
          {font-size:12px}
          input
          {font-size:12px}
          </style>
          <script?language="JavaScript">
          <!--
          var?DES?=?{
          ????
          //?initial?permutation?IP
          ????IP_Table?:?[
          ????????
          58,?50,?42,?34,?26,?18,?10,?2,?60,?52,?44,?36,?28,?20,?12,?4,
          ????????
          62,?54,?46,?38,?30,?22,?14,?6,?64,?56,?48,?40,?32,?24,?16,?8,
          ????????
          57,?49,?41,?33,?25,?17,??9,?1,?59,?51,?43,?35,?27,?19,?11,?3,
          ????????
          61,?53,?45,?37,?29,?21,?13,?5,?63,?55,?47,?39,?31,?23,?15,?7
          ????],
          ????
          //?final?permutation?IP^-1?
          ????IPR_Table?:??[
          ????????
          40,?8,?48,?16,?56,?24,?64,?32,?39,?7,?47,?15,?55,?23,?63,?31,
          ????????
          38,?6,?46,?14,?54,?22,?62,?30,?37,?5,?45,?13,?53,?21,?61,?29,
          ????????
          36,?4,?44,?12,?52,?20,?60,?28,?35,?3,?43,?11,?51,?19,?59,?27,
          ????????
          34,?2,?42,?10,?50,?18,?58,?26,?33,?1,?41,??9,?49,?17,?57,?25
          ????],
          ????
          //?permuted?choice?table?(key)?
          ????PC1_Table?:??[
          ????????
          57,?49,?41,?33,?25,?17,??9,??1,?58,?50,?42,?34,?26,?18,
          ????????
          10,??2,?59,?51,?43,?35,?27,?19,?11,??3,?60,?52,?44,?36,
          ????????
          63,?55,?47,?39,?31,?23,?15,??7,?62,?54,?46,?38,?30,?22,
          ????????
          14,??6,?61,?53,?45,?37,?29,?21,?13,??5,?28,?20,?12,??4
          ????],
          ????
          //?permuted?choice?key?(table)?
          ????PC2_Table?:?[
          ????????
          14,?17,?11,?24,??1,??5,??3,?28,?15,??6,?21,?10,
          ????????
          23,?19,?12,??4,?26,??8,?16,??7,?27,?20,?13,??2,
          ????????
          41,?52,?31,?37,?47,?55,?30,?40,?51,?45,?33,?48,
          ????????
          44,?49,?39,?56,?34,?53,?46,?42,?50,?36,?29,?32
          ????],
          ????
          //?number?left?rotations?of?pc1?
          ????LOOP_Table?:?[1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1],
          ????
          //?expansion?operation?matrix
          ????E_Table?:??[
          ????????
          32,??1,??2,??3,??4,??5,??4,??5,??6,??7,??8,??9,
          ?????????
          8,??9,?10,?11,?12,?13,?12,?13,?14,?15,?16,?17,
          ????????
          16,?17,?18,?19,?20,?21,?20,?21,?22,?23,?24,?25,
          ????????
          24,?25,?26,?27,?28,?29,?28,?29,?30,?31,?32,??1
          ????],
          ????
          //?32-bit?permutation?function?P?used?on?the?output?of?the?S-boxes?
          ????P_Table?:?[????16,?7,?20,?21,?29,?12,?28,?17,?1,??15,?23,?26,?5,??18,?31,?10,
          ?????????????????????
          2,??8,?24,?14,?32,?27,?3,??9,??19,?13,?30,?6,??22,?11,?4,??25?],

          ????
          //?The?(in)famous?S-boxes?
          ????S_Box?:?[
          ????????
          //?S1?
          ????????[[14,??4,?13,??1,??2,?15,?11,??8,??3,?10,??6,?12,??5,??9,??0,??7],
          ?????????[?
          0,?15,??7,??4,?14,??2,?13,??1,?10,??6,?12,?11,??9,??5,??3,??8],
          ?????????[?
          4,??1,?14,??8,?13,??6,??2,?11,?15,?12,??9,??7,??3,?10,??5,??0],
          ?????????[
          15,?12,??8,??2,??4,??9,??1,??7,??5,?11,??3,?14,?10,??0,??6,?13]],
          ????????
          //?S2?
          ????????[[15,??1,??8,?14,??6,?11,??3,??4,??9,??7,??2,?13,?12,??0,??5,?10],
          ?????????[?
          3,?13,??4,??7,?15,??2,??8,?14,?12,??0,??1,?10,??6,??9,?11,??5],
          ?????????[?
          0,?14,??7,?11,?10,??4,?13,??1,??5,??8,?12,??6,??9,??3,??2,?15],
          ?????????[
          13,??8,?10,??1,??3,?15,??4,??2,?11,??6,??7,?12,??0,??5,?14,??9]],
          ????????
          //?S3?
          ????????[[10,??0,??9,?14,??6,??3,?15,??5,??1,?13,?12,??7,?11,??4,??2,??8],
          ?????????[
          13,??7,??0,??9,??3,??4,??6,?10,??2,??8,??5,?14,?12,?11,?15,??1],
          ?????????[
          13,??6,??4,??9,??8,?15,??3,??0,?11,??1,??2,?12,??5,?10,?14,??7],
          ?????????[?
          1,?10,?13,??0,??6,??9,??8,??7,??4,?15,?14,??3,?11,??5,??2,?12]],
          ????????
          //?S4?
          ????????[[?7,?13,?14,??3,??0,??6,??9,?10,??1,??2,??8,??5,?11,?12,??4,?15],
          ?????????[
          13,??8,?11,??5,??6,?15,??0,??3,??4,??7,??2,?12,??1,?10,?14,??9],
          ?????????[
          10,??6,??9,??0,?12,?11,??7,?13,?15,??1,??3,?14,??5,??2,??8,??4],
          ?????????[?
          3,?15,??0,??6,?10,??1,?13,??8,??9,??4,??5,?11,?12,??7,??2,?14]],
          ????????
          //?S5?
          ????????[[?2,?12,??4,??1,??7,?10,?11,??6,??8,??5,??3,?15,?13,??0,?14,??9],
          ?????????[
          14,?11,??2,?12,??4,??7,?13,??1,??5,??0,?15,?10,??3,??9,??8,??6],
          ?????????[?
          4,??2,??1,?11,?10,?13,??7,??8,?15,??9,?12,??5,??6,??3,??0,?14],
          ?????????[
          11,??8,?12,??7,??1,?14,??2,?13,??6,?15,??0,??9,?10,??4,??5,??3]],
          ????????
          //?S6?
          ????????[[12,??1,?10,?15,??9,??2,??6,??8,??0,?13,??3,??4,?14,??7,??5,?11],
          ?????????[
          10,?15,??4,??2,??7,?12,??9,??5,??6,??1,?13,?14,??0,?11,??3,??8],
          ?????????[?
          9,?14,?15,??5,??2,??8,?12,??3,??7,??0,??4,?10,??1,?13,?11,??6],
          ?????????[?
          4,??3,??2,?12,??9,??5,?15,?10,?11,?14,??1,??7,??6,??0,??8,?13]],
          ????????
          //?S7?
          ????????[[?4,?11,??2,?14,?15,??0,??8,?13,??3,?12,??9,??7,??5,?10,??6,??1],
          ?????????[
          13,??0,?11,??7,??4,??9,??1,?10,?14,??3,??5,?12,??2,?15,??8,??6],
          ?????????[?
          1,??4,?11,?13,?12,??3,??7,?14,?10,?15,??6,??8,??0,??5,??9,??2],
          ?????????[?
          6,?11,?13,??8,??1,??4,?10,??7,??9,??5,??0,?15,?14,??2,??3,?12]],
          ????????
          //?S8?
          ????????[[13,??2,??8,??4,??6,?15,?11,??1,?10,??9,??3,?14,??5,??0,?12,??7],
          ?????????[?
          1,?15,?13,??8,?10,??3,??7,??4,?12,??5,??6,?11,??0,?14,??9,??2],
          ?????????[?
          7,?11,??4,??1,??9,?12,?14,??2,??0,??6,?10,?13,?15,??3,??5,??8],
          ?????????[?
          2,??1,?14,??7,??4,?10,??8,?13,?15,?12,??9,??0,??3,??5,??6,?11]]
          ????],
          ????Oct2Bin?:?[
          "0000","0001","0010","0011","0100","0101","0110","0111",
          ???????????????
          "1000","1001","1010","1011","1100","1101","1110","1111"?],
          ????
          //str?為八位的字符
          ????subKeys?:?new?Array(16),
          ????key?:?
          "",
          ????text?:?
          ""
          }
          ;

          DES.init?
          =?function(key,text){
          ????
          if(key?!=?this.key){
          ????????
          this.key=key;?
          ????????
          this.GenSubKey();
          ????}

          ????
          this.text=?text?+?"????????".substring(0,parseInt("07654321".charAt(?text.length%8?),10));
          }
          ;

          DES.GenSubKey?
          =?function(){
          ????
          var?arr?=?this.Permute(?this.Byte2Bit(this.key)?,?this.PC1_Table);
          ????
          var?AL?=?arr.slice(0,28);
          ????
          var?AR?=?arr.slice(28,56);
          ????
          for(var?i=0;?i<16;?i++)?{
          ????????
          for(var?j=0,k=this.LOOP_Table[i];j<k;j++){
          ????????????AL.push(AL.shift());
          ????????????AR.push(AR.shift());
          ????????}

          ????????
          this.subKeys[i]?=?this.Permute(?AL.concat(AR)?,?this.PC2_Table?);
          ????}

          }
          ;
          //數組ar存儲二進制數據,該函數將從頭開始的每八位轉換成對應的字符
          DES.Bit2Byte?=?function(ar,fCh){
          ????
          var?str="";
          ????
          if(fCh?==?"byte"){
          ????????
          var?tmpAr?=?ar.join("").match(/.{8}/g);
          ????????
          for(var?i=0,j=tmpAr.length;?i<j;?i++)
          ????????????str?
          +=?String.fromCharCode(parseInt(tmpAr[i],2));
          ?????}

          ????
          else?if(fCh?==?"hex"){
          ????????
          var?tmpAr?=?ar.join("").match(/.{4}/g);
          ????????
          for(var?i=0,j=tmpAr.length;?i<j;?i++)
          ????????????str?
          +=?"0123456789abcdef".charAt(parseInt(tmpAr[i],2));
          ????}

          ????
          else?return?"Error:Second?param?is?wrong.";
          ????
          return?str;
          }
          ;
          //將字符串轉換成二進制數組
          DES.Byte2Bit?=?function(str){
          ????
          for(var?i=0,j=8*str.length,ar?=?[],ch="";?i<j;?i++){
          ????????
          var?k?=?7?-?i%8;
          ????????
          if(k?==?7)?ch?=?str.charCodeAt(parseInt(i/8,10));
          ????????ar.push(?(ch?
          >>?k)?&?1?);
          ????}

          ????
          return?ar;
          }
          ;

          //將16進制字符串轉變成二進制數組
          DES.Hex2Bin?=?function(str){
          ????
          for(var?i=0,j=str.length,s="";?i<j;?i++)
          ????????s?
          +=?this.Oct2Bin[?parseInt(str.charAt(i),16)];
          ????
          return?s.split("");
          }
          ;

          DES.Xor?
          =?function(A,B){
          ????
          for(var?i=0,j=B.length,rtn=new?Array(j);?i<j;?i++)
          ????????rtn[i]?
          =?A[i]?^?B[i];
          ????
          return?rtn;
          }


          DES.Permute?
          =?function(ar,tb){
          ????
          for(var?i=0,j=tb.length,rtn=new?Array(j);i<j;i++)
          ????????rtn[i]?
          =?ar[tb[i]-1];
          ????
          return?rtn;
          }
          ;

          DES.F_func?
          =?function(Ri,Ki)
          {
          ????
          return?this.Permute(?this.S_func(?this.Xor(?this.Permute(?Ri?,?this.E_Table?)?,?Ki)?)?,?this.P_Table);
          }
          ;
          //ar為輸入48位串數組
          DES.S_func?=?function(ar){
          ????
          for(var?i=0,arRtn?=?[];i<8;i++){
          ????????
          var?x?=?i*6;
          ????????
          var?j?=?parseInt(""+ar[x]+ar[x+5],2);
          ????????
          var?k?=?parseInt(ar.slice(x+1,x+5).join(""),2);
          ????????arRtn?
          =?arRtn.concat(?this.Oct2Bin[?this.S_Box[i][j][k]?].split("")?);
          ????}

          ????
          return?arRtn;
          }


          //mode參數為處理模式."Encrypt":加密?"Decrypt":解密,默認為加密
          DES.Encrypt?=?function(mode){
          ????mode?
          =?mode?mode:"Encrypt";
          ????
          if(mode=="Decrypt")
          ????????
          var?plainTextAr?=?this.Hex2Bin(this.text).join("").match(/.{64}/g);
          ????
          else
          ????????
          var?plainTextAr?=?this.Byte2Bit(this.text).join("").match(/.{64}/g);
          ????
          for(var?i=0,j=plainTextAr.length;i<j;i++){
          ????????
          var?arr?=?this.Permute(plainTextAr[i].split(""),this.IP_Table)
          ????????
          var?AL?=?arr.slice(0,32);
          ????????
          var?AR?=?arr.slice(32,64);
          ????????
          if(mode?==?"Decrypt"){
          ????????????
          for(var?k=15;k>-1;k--){
          ????????????????
          var?tmp?=?AR.slice(0,32);
          ????????????????AR?
          =?this.Xor(this.F_func(AR,this.subKeys[k])?,?AL);
          ????????????????AL?
          =?tmp;
          ????????????}

          ????????}

          ????????
          else{
          ????????????
          for(var?k=0;k<16;k++){
          ????????????????
          var?tmp?=?AR.slice(0,32);
          ????????????????AR?
          =?this.Xor(this.F_func(AR,this.subKeys[k])?,?AL);
          ????????????????AL?
          =?tmp;
          ????????????}

          ????????}

          ????????plainTextAr[i]?
          =?this.Bit2Byte(this.Permute(AR.concat(AL),?this.IPR_Table),(mode=="Decrypt"?"byte":"hex"));
          ????}

          ????
          return?plainTextAr.join("").trim();
          }

          String.prototype.trim?
          =?function(){?return?this.replace(/\s+$/g,"");}
          //-->
          </script>

          <script?language="JavaScript">
          <!--
          var?$?=?document.getElementById;
          function?jiami(){
          ???DES.init($(
          "txtKey").value,$("taText").value?);
          ???$(
          "taCipher").value?=?DES.Encrypt();
          }

          function?jiemi(){
          ???DES.init($(
          "txtKey").value,$("taCipher").value?);
          ???$(
          "taText").value?=?DES.Encrypt("Decrypt");
          }

          //-->
          </script>
          </head>

          <body>
          請輸入加(解)密密鑰:
          <input?id="txtKey"?type="text"?onfocus="this.select()"?value="47944980"?size="10">
          <font?color="red">(*目前密鑰只能是八位)</font><br>

          未加密文本:
          <br>
          <textarea?id="taText">Hi,I'm?meixuexiang.</textarea>
          <input?type="button"?value="clear"?onclick="document.all[this.sourceIndex-1].value=''"><br>
          <input?type="button"?value="Encrypt"?onclick="jiami()">&nbsp;&nbsp;&nbsp;
          <input?type="button"?value="Decrypt"?onclick="jiemi()"><br><br>
          加密后文本:
          <br>
          <textarea?id="taCipher"></textarea>
          <input?type="button"?value="clear"?onclick="document.all[this.sourceIndex-1].value=''"><br>
          <p>code?by?meixx(<a?href="http://www.aygfsteel.com/mxx">梅雪香</a>)?2006-10-18?23:00?<a?href="mailto:wy_hd@163.com">信息反饋</a></p>
          </body>
          </html>
          posted on 2006-10-19 00:11 梅雪香 閱讀(5529) 評論(4)  編輯  收藏

          FeedBack:
          # re: DES算法的javascript實現 2006-12-11 17:52 黑風手
          這個算法還有其他方法實現,我的意思并不是說用其他語言,而是通過改變8個矩陣來改變明文和密文對應順序
          這樣可以增進對DES的算法過程的進一步理解  回復  更多評論
            
          # re: DES算法的javascript實現 2006-12-31 09:03 rotApple
          強!!!!!
          但是...但....是.. 沒用~~~~
          沒人用js加密.  回復  更多評論
            
          # re: DES算法的javascript實現 2007-09-10 09:52 momo
          解密的時候有出錯吧。。  回復  更多評論
            
          # re: DES算法的javascript實現 2007-09-10 14:17 momo
          沒有沒有,是不支持中文...  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 木兰县| 林芝县| 昭平县| 西平县| 萝北县| 长葛市| 尼玛县| 云林县| 兰州市| 沧源| 拜城县| 新兴县| 荥阳市| 蒙城县| 牙克石市| 镇赉县| 东乡族自治县| 禹州市| 洪洞县| 克拉玛依市| 千阳县| 文成县| 酒泉市| 芜湖市| 荣昌县| 嵊州市| 马山县| 丹凤县| 嘉峪关市| 山东| 姜堰市| 荣成市| 万源市| 山丹县| 嘉峪关市| 石渠县| 双牌县| 义马市| 抚远县| 昌江| 红原县|