• JS URL 使用base64加密与解密和MD5解密


    JS编码方式:
    <script type="text/javascript">
    document.write(encodeURI("http://www.w3school.com.cn/My first/")+ "<br />")//编译
    document.write(decodeURI("http://www.w3school.com.cn/My first/")+ "<br />")//反编译
    document.write(encodeURI(",/?:@&=+$#")+ "<br />")
    document.write(encodeURIComponent("http://www.w3school.com.cn/My first/")+ "<br />")
    document.write(escape("http://www.w3school.com.cn/My first/123")+ "<br />")//编译
    document.write(unescape("http://www.w3school.com.cn/My first/123")+ "<br />")//反编译
    </script>
    

    <script type="text/javascript"> <!-- var keyStr = "ABCDEFGHIJKLMNOP" + "QRSTUVWXYZabcdef" + "ghijklmnopqrstuv" + "wxyz0123456789+/" + "="; //加密函数 function encode64(input) { input = escape(input);//注意escape()函数 var output = ""; var chr1, chr2, chr3 = ""; var enc1, enc2, enc3, enc4 = ""; var i = 0; do { chr1 = input.charCodeAt(i++); chr2 = input.charCodeAt(i++); chr3 = input.charCodeAt(i++); enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4); chr1 = chr2 = chr3 = ""; enc1 = enc2 = enc3 = enc4 = ""; } while (i < input.length); return output; } //解密函数 function decode64(input) { var output = ""; var chr1, chr2, chr3 = ""; var enc1, enc2, enc3, enc4 = ""; var i = 0; // remove all characters that are not A-Z, a-z, 0-9, +, /, or = var base64test = /[^A-Za-z0-9+/=]/g; if (base64test.exec(input)) { alert("There were invalid base64 characters in the input text. " + "Valid base64 characters are A-Z, a-z, 0-9, '+', '/', and '=' " + "Expect errors in decoding."); } input = input.replace(/[^A-Za-z0-9+/=]/g, ""); do { enc1 = keyStr.indexOf(input.charAt(i++)); enc2 = keyStr.indexOf(input.charAt(i++)); enc3 = keyStr.indexOf(input.charAt(i++)); enc4 = keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; output = output + String.fromCharCode(chr1); if (enc3 != 64) { output = output + String.fromCharCode(chr2); } if (enc4 != 64) { output = output + String.fromCharCode(chr3); } chr1 = chr2 = chr3 = ""; enc1 = enc2 = enc3 = enc4 = ""; } while (i < input.length); return unescape(output);//注意unescape()函数 } //--></script>

      

    当我们采用encode64(input)函数对数据加密之后,当要在Java代码中对数据解密时,我们不能调用js的decoder(input)函数,必须使用Java语言编写的函数。

    apache公司提供的commons-codec-1.3.jar类库中的org.apache.commons.codec.binary.Base64包提供了encodeBase64(byte[] bts)和decodeBase64(byte[] bts)方法实现了数据的Base64()加密,但与上面的js代码的加密和解密函数并不一一对应,为例实现用js代码加密,用java函数解密,我们必须调用另外一个java函数,unescape(String src),其代码如下:

    private static String unescape(String src) {   
            StringBuffer tmp = new StringBuffer();   
            tmp.ensureCapacity(src.length());   
            int lastPos = 0, pos = 0;   
            char ch;   
            while (lastPos < src.length()) {   
                pos = src.indexOf("%", lastPos);   
                if (pos == lastPos) {   
                    if (src.charAt(pos + 1) == 'u') {   
                        ch = (char) Integer.parseInt(src   
                                .substring(pos + 2, pos + 6), 16);   
                        tmp.append(ch);   
                        lastPos = pos + 6;   
                    } else {   
                        ch = (char) Integer.parseInt(src   
                                .substring(pos + 1, pos + 3), 16);   
                        tmp.append(ch);   
                        lastPos = pos + 3;   
                    }   
                } else {   
                    if (pos == -1) {   
                        tmp.append(src.substring(lastPos));   
                        lastPos = src.length();   
                    } else {   
                        tmp.append(src.substring(lastPos, pos));   
                        lastPos = pos;   
                    }   
                }   
            }   
            return tmp.toString();   
        }
    

      与js代码中的unescape() 函数对应,才能正确的对数据信息解密,解密方法为:

    public static String decode64(String encode){
      //调用org.apache.commons.codec.binary.Base64包,在commons-codec-1.3.jar中
      Base64 base64 = new Base64();
      byte[] byteOfEncode = encode.getBytes();
      byte[] byteOfDecode = Base64.decodeBase64(byteOfEncode);//调用decodeBase64方法
      String decode = new String(byteOfDecode);
      return  unescape(decode);//调用unescape(String src)方法
    }
    附:在网上找到的java编写的escape()方法:
    public class EscapeUnescape {   
           
        public static String escape(String src) {   
            int i;   
            char j;   
            StringBuffer tmp = new StringBuffer();   
            tmp.ensureCapacity(src.length() * 6);   
            for (i = 0; i < src.length(); i++) {   
                j = src.charAt(i);   
                if (Character.isDigit(j) || Character.isLowerCase(j)   
                        || Character.isUpperCase(j))   
                    tmp.append(j);   
                else if (j < 256) {   
                    tmp.append("%");   
                    if (j < 16)   
                        tmp.append("0");   
                    tmp.append(Integer.toString(j, 16));   
                } else {   
                    tmp.append("%u");   
                    tmp.append(Integer.toString(j, 16));   
                }   
            }   
            return tmp.toString();   
        }
    

      asp.net平台,base64加密和解密方法:

    /// <summary>
    /// Encrypt 的摘要说明
    /// </summary>
    public class Encrypt
    {
        public Encrypt()
        {
            //
            // TODO: 在此处添加构造函数逻辑
            //
        }
        /// <summary>
        /// Base64加密,采用utf8编码方式加密
        /// </summary>
        /// <param name="source">待加密的明文</param>
        /// <returns>加密后的字符串</returns>
        public static string EncodeBase64(string source)
        {
           return Convert.ToBase64String(Encoding.Default.GetBytes(source));
        }
        /// <summary>
        /// Base64解密
        /// </summary>
        /// <param name="result">待解密的密文</param>
        /// <returns>解密后的字符串</returns>
        public static string DecodeBase64(string result)
        {
            return Encoding.Default.GetString(Convert.FromBase64String(result));
        }
    
    }
    

      JS与后台对应base64加密方式:

    <HTML>
    <HEAD>
    <TITLE>Base64</TITLE>
    <script language=javascript>
    var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    var base64DecodeChars = new Array(
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
      -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
      -1, 0, 1, 2, 3,  4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
      -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
    function base64encode(str) {
      var out, i, len;
      var c1, c2, c3;
      len = str.length;
      i = 0;
      out = "";
      while(i < len) {
     c1 = str.charCodeAt(i++) & 0xff;
     if(i == len)
     {
       out += base64EncodeChars.charAt(c1 >> 2);
       out += base64EncodeChars.charAt((c1 & 0x3) << 4);
       out += "==";
       break;
     }
     c2 = str.charCodeAt(i++);
     if(i == len)
     {
       out += base64EncodeChars.charAt(c1 >> 2);
       out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
       out += base64EncodeChars.charAt((c2 & 0xF) << 2);
       out += "=";
       break;
     }
     c3 = str.charCodeAt(i++);
     out += base64EncodeChars.charAt(c1 >> 2);
     out += base64EncodeChars.charAt(((c1 & 0x3)<< 4) | ((c2 & 0xF0) >> 4));
     out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >>6));
     out += base64EncodeChars.charAt(c3 & 0x3F);
      }
      return out;
    }
    function base64decode(str) {
      var c1, c2, c3, c4;
      var i, len, out;
      len = str.length;
      i = 0;
      out = "";
      while(i < len) {
     /* c1 */
     do {
       c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
     } while(i < len && c1 == -1);
     if(c1 == -1)
       break;
     /* c2 */
     do {
       c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
     } while(i < len && c2 == -1);
     if(c2 == -1)
       break;
     out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
     /* c3 */
     do {
       c3 = str.charCodeAt(i++) & 0xff;
       if(c3 == 61)
     return out;
       c3 = base64DecodeChars[c3];
     } while(i < len && c3 == -1);
     if(c3 == -1)
       break;
     out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
     /* c4 */
     do {
       c4 = str.charCodeAt(i++) & 0xff;
       if(c4 == 61)
     return out;
       c4 = base64DecodeChars[c4];
     } while(i < len && c4 == -1);
     if(c4 == -1)
       break;
     out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
      }
      return out;
    }
    function utf16to8(str) {
      var out, i, len, c;
      out = "";
      len = str.length;
      for(i = 0; i < len; i++) {
     c = str.charCodeAt(i);
     if ((c >= 0x0001) && (c <= 0x007F)) {
       out += str.charAt(i);
     } else if (c > 0x07FF) {
       out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
       out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
       out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
     } else {
       out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
       out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
     }
      }
      return out;
    }
    function utf8to16(str) {
      var out, i, len, c;
      var char2, char3;
      out = "";
      len = str.length;
      i = 0;
      while(i < len) {
     c = str.charCodeAt(i++);
     switch(c >> 4)
     {
      case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
       // 0xxxxxxx
       out += str.charAt(i-1);
       break;
      case 12: case 13:
       // 110x xxxx  10xx xxxx
       char2 = str.charCodeAt(i++);
       out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
       break;
      case 14:
       // 1110 xxxx 10xx xxxx 10xx xxxx
       char2 = str.charCodeAt(i++);
       char3 = str.charCodeAt(i++);
       out += String.fromCharCode(((c & 0x0F) << 12) |
        ((char2 & 0x3F) << 6) |
        ((char3 & 0x3F) << 0));
       break;
     }
      }
      return out;
    }
    
    function doit() {
      var f = document.f
      f.output.value = base64encode(utf16to8(f.source.value))
      f.decode.value = utf8to16(base64decode(f.output.value))
    }
    </script>
    </HEAD>
    <BODY>
    <H1>Base64</H1>
    <FORM NAME="f">
    原码<BR>
    <TEXTAREA NAME="source" ROWS=4 COLS=60 WRAP="soft"></TEXTAREA><BR><BR>
    Base64 encode<BR>
    <TEXTAREA NAME="output" ROWS=4 COLS=60 WRAP="soft"></TEXTAREA><BR><BR>
    Base64 decode<BR>
    <TEXTAREA NAME="decode" ROWS=4 COLS=60 WRAP="soft"></TEXTAREA><BR><BR>
    <INPUT TYPE=BUTTON VALUE="转换" ONCLICK="doit()">
    </FORM>
    </BODY>
    </HTML>

     C#实现MD532位加密

         /// <summary>
            /// md5加密
            /// </summary>
            /// <param name="ConvertString">MD5加密的字符</param>
            /// <returns>32位小写字符</returns>
          public static string EncryptMd5(string ConvertString)
            {
                string StrEncode = "";
                MD5 md = MD5.Create();
                StrEncode = BitConverter.ToString(md.ComputeHash(Encoding.Default.GetBytes(ConvertString))).Replace("-", "").ToLower();
                return StrEncode;
            }

      C#实现MD516位加密

             /// <summary>
            /// MD5加密
            /// </summary>
            /// <param name="strText">加密字符串</param>
            /// <returns></returns>
            public static string MD5Encrypt(string strText)
            {
                string StrEncode = "";
                MD5 md = MD5.Create();
                StrEncode = BitConverter.ToString(md.ComputeHash(Encoding.UTF8.GetBytes(strText)),4,8).Replace("-", "").ToLower();
                return StrEncode;
            }
  • 相关阅读:
    根据对象中某个元素进行排序
    Bootstrap 弹出框(Popover)插件
    echarts+bmap 去掉地图左下角的logo
    get提交参数中存在空格
    long类型的转换为正常时间格式遇到的问题
    jQuery validate使用过程中遇到的问题
    问题 G: 最长公共子串问题
    1567. 乘积为正数的最长子数组长度(dp)
    C. Parsa's Humongous Tree(树形dp)
    1558. 得到目标数组的最少函数调用次数
  • 原文地址:https://www.cnblogs.com/loyung/p/4523711.html
Copyright © 2020-2023  润新知