loyung

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
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.\n" + "Valid base64 characters are A-Z, a-z, 0-9, '+', '/', and '='\n" + "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;
        }

 

posted on 2015-05-23 09:50  loyung  阅读(8106)  评论(0编辑  收藏  举报