码迷,mamicode.com
首页 > Web开发 > 详细

JS URL 使用base64加密与解密

时间:2015-05-23 11:14:08      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:

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 URL 使用base64加密与解密

标签:

原文地址:http://www.cnblogs.com/loyung/p/4523711.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!