传奇单机版 进去的时候提示invalid base64an invalid characterr 这是什么原因

为什么报错:invalid character in a base 64 string
byte[] bs = Convert.FromBase64String(sXML);时报错,谁能指点一下?
09-09-24 &匿名提问
软件开发中,当在不同页面之间传递参数时,为了系统的安全,常将地址栏中的信息加密处理,由于是通过表单传递数据,因此我们不能用Java代码对其加密,只能通过js函数对数据信息加密,下面是我在网上找的js的加密代码(采用base64加密方式):&script type=&text/javascript&&&!--var keyStr = &ABCDEFGHIJKLMNOP& +&br&&QRSTUVWXYZabcdef& +&br&&ghijklmnopqrstuv& +&br&&wxyz+/& +&br&&=&;//加密函数function encode64(input) {&br&input = escape(input);//注意escape()函数&br&var output = &&;&br&var chr1, chr2, chr3 = &&;&br&var enc1, enc2, enc3, enc4 = &&;&br&var i = 0;do {&br&chr1 = input.charCodeAt(i++);&br&chr2 = input.charCodeAt(i++);&br&chr3 = input.charCodeAt(i++);enc1 = chr1 && 2;&br&enc2 = ((chr1 & 3) && 4) | (chr2 && 4);&br&enc3 = ((chr2 & 15) && 2) | (chr3 && 6);&br&enc4 = chr3 & 63;if (isNaN(chr2)) {&br&enc3 = enc4 = 64;&br&} else if (isNaN(chr3)) {&br&enc4 = 64;&br&}output = output +&br&keyStr.charAt(enc1) +&br&keyStr.charAt(enc2) +&br&keyStr.charAt(enc3) +&br&keyStr.charAt(enc4);&br&chr1 = chr2 = chr3 = &&;&br&enc1 = enc2 = enc3 = enc4 = &&;&br&} while (i & input.length);&br&}//解密函数function decode64(input) {&br&var output = &&;&br&var chr1, chr2, chr3 = &&;&br&var enc1, enc2, enc3, enc4 = &&;&br&var i = 0;// remove all characters that are not A-Z, a-z, 0-9, +, /, or =&br&var base64test = /[^A-Za-z0-9\+\/\=]/g;&br&if (base64test.exec(input)) {&br&alert(&There were invalid base64 characters in the input text.\n& +&br&&Valid base64 characters are A-Z, a-z, 0-9, '+', '/', and '='\n& +&br&&Expect errors in decoding.&);&br&}&br&input = input.replace(/[^A-Za-z0-9\+\/\=]/g, &&);do {&br&enc1 = keyStr.indexOf(input.charAt(i++));&br&enc2 = keyStr.indexOf(input.charAt(i++));&br&enc3 = keyStr.indexOf(input.charAt(i++));&br&enc4 = keyStr.indexOf(input.charAt(i++));chr1 = (enc1 && 2) | (enc2 && 4);&br&chr2 = ((enc2 & 15) && 4) | (enc3 && 2);&br&chr3 = ((enc3 & 3) && 6) | enc4;output = output + String.fromCharCode(chr1);if (enc3 != 64) {&br&output = output + String.fromCharCode(chr2);&br&}&br&if (enc4 != 64) {&br&output = output + String.fromCharCode(chr3);&br&}chr1 = chr2 = chr3 = &&;&br&enc1 = enc2 = enc3 = enc4 = &&;} while (i & input.length);return unescape(output);//注意unescape()函数&br&} &br&//--&&/script&当我们采用encode64(input)函数对数据加密之后,当要在Java代码中对数据解密时,我们不能调用js的decoder(input)函数,必须使用Java语言编写的函数。&/p&apache公司提供的commons-codec-1.3.jar类库中的mons.codec.binary.Base64包提供了encodeBase64(byte[] bts)和decodeBase64(byte[] bts)方法实现了数据的Base64()加密,但与上面的js代码的加密和解密函数并不一一对应,为例实现用js代码加密,用java函数解密,我们必须调用另外一个java函数,unescape(String src),其代码如下:private static String unescape(String src) {   &br&        StringBuffer tmp = new StringBuffer();   &br&        tmp.ensureCapacity(src.length());   &br&        int lastPos = 0, pos = 0;   &br&           &br&        while (lastPos & src.length()) {   &br&            pos = src.indexOf(&%&, lastPos);   &br&            if (pos == lastPos) {   &br&                if (src.charAt(pos + 1) == 'u') {   &br&                    ch = (char) Integer.parseInt(src   &br&                            .substring(pos + 2, pos + 6), 16);   &br&                    tmp.append(ch);   &br&                    lastPos = pos + 6;   &br&                } else {   &br&                    ch = (char) Integer.parseInt(src   &br&                            .substring(pos + 1, pos + 3), 16);   &br&                    tmp.append(ch);   &br&                    lastPos = pos + 3;   &br&                }   &br&            } else {   &br&                if (pos == -1) {   &br&                    tmp.append(src.substring(lastPos));   &br&                    lastPos = src.length();   &br&                } else {   &br&                    tmp.append(src.substring(lastPos, pos));   &br&                    lastPos =   &br&                }   &br&            }   &br&        }   &br&        return tmp.toString();   &br&    }与js代码中的unescape() 函数对应,才能正确的对数据信息解密,解密方法为:public static String decode64(String encode){&br&  //调用mons.codec.binary.Base64包,在commons-codec-1.3.jar中&br&  Base64 base64 = new Base64();&br&  byte[] byteOfEncode = encode.getBytes();&br&  byte[] byteOfDecode = Base64.decodeBase64(byteOfEncode);//调用decodeBase64方法&br&  String decode = new String(byteOfDecode);&br&  return  unescape(decode);//调用unescape(String src)方法&br& }附:在网上找到的java编写的escape()方法:&/p&public class EscapeUnescape {   &br&       &br&    public static String escape(String src) {   &br&           &br&           &br&        StringBuffer tmp = new StringBuffer();   &br&        tmp.ensureCapacity(src.length() * 6);   &br&        for (i = 0; i & src.length(); i++) {   &br&            j = src.charAt(i);   &br&            if (Character.isDigit(j) || Character.isLowerCase(j)   &br&                    || Character.isUpperCase(j))   &br&                tmp.append(j);   &br&            else if (j & 256) {   &br&                tmp.append(&%&);   &br&                if (j & 16)   &br&                    tmp.append(&0&);   &br&                tmp.append(Integer.toString(j, 16));   &br&            } else {   &br&                tmp.append(&%u&);   &br&                tmp.append(Integer.toString(j, 16));   &br&            }   &br&        }   &br&        return tmp.toString();   &br&    }
请登录后再发表评论!5509人阅读
【Exception】(1)
昨天在做一个 Demo 的时候,由于是调用第三方的接口,采用的是 HTTP 的通信协议,按照文档上的说明,需要把参数进行加密后加入到 URL 中,但是,就是这个看似普普通通的操作,却让我着实费了很大的劲。
关于 BASE64,我不想说太多,因为这是很基本的一种编码方式,或者说是加密方式。不了解的可以到我前面的博客中去看看,关于加密,前边有一个系列的文章。下面说说出现这个问题的情景。
昨天拿到一个任务,写一个 Demo,目的是查询一系列的信息,当然,需要调用一个第三方的接口,根据接口文档中的说明,该接口采用的是 HTTP 协议,Post 的数据需要进行 BASE64 加密,由于我之前自己封装了一系列的加密算法,因此,就直接拿过来用了。这里先说明一下,在我封装的加密算法中,用到的是 sun 的 BASE64Encoder,也就是说,我引入的是这个类:
import sun.misc.BASE64E
这里看不出有什么问题,请接着看下边。
出现的问题
就这样,每当测试的时候,程序总是会报同一个错误 —— (java.net.MalformedURLException:Illegal character in URL),刚开始的时候,我还以为是自己写的 模拟 Post 提交的代码有问题呢,于是网上查了又查,最后发现没有什么问题。于是,排除了这一块,就开始找别的原因。什么百度、Google 都查遍了,问题也没有解决,当初也没有想到是
BASE64 加密的问题。因为之前一直在用,也没有出现什么错误。
这个问题从中午一直持续到了下班之前,记得还是下午 5 点多的时候,终于从网上发现一篇文章,好像也是遇到了同样的问题,从他的文章中找到了原因。
之所以出现这样的问题,是由于在 BASE64 加密的过程中,引错了 jar 包,不应该使用 Sun 提供的内部包,也就是 sun.misc,后来了解到 sun.misc 包是 Sun 公司提供给内部使用的专用 API,在 java API 文档中我们看不到任何有关 BASE64 影子,不建议使用。
经过测试,我发现,除了使用 sun.misc 包的 BASE64 报错外,其他两个都可以正常运行,这两个包括:
com.sun.org.apache.xerces.internal.impl.dv.util.Base64;mons.codec.binary.Base64;
这两个提供的实现都可以正常运行。至于这两个的加密方法嘛,百度一下下吧。。。
通过这个问题,我发现,很多时候,我们往往忽略一些看似很没用的东西,而正是这些没用的东西,时不时的会在我们的路途中横上一杠子,我想说的是,尽管会出现这样那样的问题,还是要耐着性子去解决,不要把问题留给以后。
而且,当我们在学习某一类知识的时候,如果有时间,可以多想想,涉及一下与其相关的知识,或许你会有意想不到的收获。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:739622次
积分:9656
积分:9656
排名:第1526名
原创:167篇
转载:20篇
评论:1237条
(3)(2)(4)(4)(4)(4)(4)(6)(2)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(4)(5)(3)(4)(4)(4)(4)(4)(4)(5)(4)(4)(4)(5)(5)(3)(4)(4)(2)(2)(8)(2)(4)(6)(10)

我要回帖

更多关于 传奇世界单机版 的文章

 

随机推荐