zoukankan      html  css  js  c++  java
  • javascript 使用数据加密跟base64 编码

       下面的js代码首先将给定的数据字符串,跟指定的密匙字符串做异或运算,接着将结果序列进行base64编码,
     下面同时给出了解密算法跟,base64还原函数

    代码如下:

      function secode(opArray) {
            var _local2 = opArray;
            var strEnd="=";
            var _local3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
            var bits;
            var decOut = new Array ();
            var _local1 = 0;
            var j = 0;
            _local1 = 0;
            while (_local1 < _local2.length) {

               //第一个元素(这里前提是单字节)向前移动2个字节,
               //第二个移动1字节,第三个不移动
              //那么 | 后的结果是,形成一个 3字节的数据如下
             
    //xxxxxxxx0000000000000000
              //00000000xxxxxxxx00000000
              //0000000000000000xxxxxxxx
              //注意bits是一个正整数,其值等与上面3组数 |(异)  后的数值
              //16515072的二进制表示为:1111 1100, 0000 0000 ,0000 0000
              //那么 bits & 16515072 后,就是取bits的前6位
              //>>18 表示右移动 18为注意 bits & 16515072 后是正数,那么>>18时高位补的是00,
              // 正数高位第一位为0,负数为1

             //这样((bits & 16515072)>>18)的值就是其在_local3中对应字的符位置.

                bits = ((_local2[_local1]<<16) | (_local2[_local1+1]<<8) | (_local2[_local1+2]));
                decOut[j++] = _local3.charAt((bits & 16515072) >> 18);
                decOut[j++] = _local3.charAt((bits & 258048) >> 12);
                decOut[j++] = _local3.charAt((bits & 4032) >> 6);
                decOut[j++] = _local3.charAt(bits & 63);
                _local1 = _local1 + 3;
            }

            //另外258048其二进制表示为 11 ,1111 0000 ,0000 0000
           //
    等价于0000 0011 ,1111 0000 ,0000 0000 (正数高位为0)
           //当字节数不是3的整数倍时,_local2[_local1+1],或_local2[_local1+2] 其值(下标已经超标)是0,
          //也正好符合base64不足补零的定义

            switch(_local2.length%3){
                     //多一个字节时映射成的4字接有2个字节里无数据(纯零)应此丢弃
                     //多2个字节时,丢弃一个,而正好是,末尾不加"=",故将strEnd="" 设置为空.

                    case 1:decOut.pop();decOut.pop();break;
                    case 2:decOut.pop();break;
                    case 0:strEnd="";break;
            }
            decOut.push(strEnd);
            return (decOut.join(""));
        }
        function encode(var1, key) {
            var _local3 = var1;
            var2 = new Array();
            var _local2 = 0;
            var _local1 = 0;
            while (_local1 < _local3.length) {
                var2.push(_local3.charCodeAt(_local1) ^ key.charCodeAt(_local2++));

               //当key序列不够长时循环使用
                if (_local2 >= key.length) {
                    _local2 = 0;
                }
                _local1++;
            }
            var2=secode(var2);
            return (var2);
        }
       function decode(var1, key) {
            var _local3 = var1;
            _local3 = becode(_local3);
            var2 = "";
            var _local2 = 0;
            var _local1 = 0;
            while (_local1 < _local3.length) {
                var2 = var2.concat(String.fromCharCode(_local3[_local1] ^ key.charCodeAt(_local2++)));
                if (_local2 >= key.length) {
                    _local2 = 0;
                }
                _local1++;
            }
            return (var2);
        }
        function becode(opString) {
            var _local2 = opString;
            var _local3 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
            var bits;
            var decOut = new Array ();
            var _local1 = 0;
            var j = 0;
            _local1 = 0;
            while (_local1 < _local2.length) {
                bits = ((((_local3.indexOf(_local2.charAt(_local1)) & 255) << 18) | ((_local3.indexOf(_local2.charAt(_local1 + 1)) & 255) << 12)) | ((_local3.indexOf(_local2.charAt(_local1 + 2)) & 255) << 6)) | (_local3.indexOf(_local2.charAt(_local1 + 3)) & 255);
                decOut[j++] = (bits & 16711680) >> 16;
                decOut[j++] = (bits & 65280) >> 8;
                decOut[j++] = bits & 255;
                _local1 = _local1 + 4;
            }
            if (_local2.charCodeAt(_local1 - 2) == 61) {
                decOut.pop();
                decOut.pop();
            } else if (_local2.charCodeAt(_local1 - 1) == 61) {
                decOut.pop();
                //
            }
            return (decOut);
        }
     function base64(str){
      var d=new Array();
      for(var i=0;i<str.length;i++){
        d.push(str.charCodeAt(i));
      }alert(d);
       return secode(d);
     }

    //说明,首先获取字符串的字节序列(Array) 使用 str.charCodeAt(i), 这里需要注意的是, charCodeAt(i)获取的值应该<=255 (单字节) 如果str中含有中文等双字节码,那么请先使用str=escape(str)对其进行编码(还原时使用unescape).


    encode函数, encode里将待处理字符序列(假设已经为单字节序列),与给顶的key序列,将每个字符的Unicode值做^操作,获得一个待base64编码数组.

    secode函数, 根据base64编码,将每3个字节映射成4个字节,当字节数不是3的倍数时尾部补0(bit),形成的base64字符串最后加"="

    后面的两个是相应的还原函数

  • 相关阅读:
    获取自定义属性的值
    当前窗口,父级窗口,顶层窗口
    图片一直居中,并且窗口变小图片两端缩小,但是图片还是居中。
    解决IE打开时,弹出的提示调用active的问题,阻止js运行。
    $.fn.exted({})与$.extend({})区别
    rem与部分手机 字体偏大问题
    Python 内部函数
    Python lambda表达式
    Python 函数动态参数
    python 邮件发送
  • 原文地址:https://www.cnblogs.com/wdfrog/p/1315993.html
Copyright © 2011-2022 走看看