看到很多文章上描述用Base64进行加密解密......在我看来,Base64只是一种编码方式,不让编码内容直接被人读取而已,也算不上加密的程度,我们知道Base64解码是非常容易的。百度百科:加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。 这些当然是题外话,我们以后再讨论。
好了,就是这些了,希望给诸位带来一点点帮助,如有不足之处还望指正。
在java开发过程中遇到过将下载链接转为下载软件的专用链接,这里把代码贴出来,跟大家分享。
这里用到了Sun公司提供的 javabase64-1.3.1.jar
package com.shen.utils;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* BASE64编码
* @author jiangsyace
* @date 2014-07-29
*/
public class JavaBase64 {
public static void main(String[] args) {
String resource = "http://192.168.56.1:8080/portal2.7z";
//迅雷的编码规则为:原地址前面加"AA",后面加"ZZ",然后进行Base64编码,最后加上迅雷下载协议"Thunder://"组成完整的下载链接
String resourceForThunder = "Thunder://" + getBASE64("AA" + resource + "ZZ");
//快车的编码规则:原地址前后都加上"[FLASHGET]",注意后面还要加上"&",符号怎么得出不清楚,在最后面加的是其他个人信息,至今未有人报告转换错误
String resourceForFlashget = "Flashget://" + getBASE64("[FLASHGET]" + resource + "[FLASHGET]") + "&something";
//旋风相对就简单多了:将原地址直接base64编码加上下载协议就好了
String resourceForQQDownLoad = "qqdl://" + getBASE64(resource);
System.out.println(resourceForThunder);
System.out.println(resourceForFlashget);
System.out.println(resourceForQQDownLoad);
//解码调用getFromBASE64,注意不要将resourceForThunder直接进行解码,因为当中含有"Thunder://"等未经过编码的字符
System.out.println("迅雷链接解码:"+getFromBASE64("QUFodHRwOi8vMTkyLjE2OC41Ni4xOjgwODAvcG9ydGFsMi43elpa"));
}
//BASE64 编码
public static String getBASE64(String s) {
if (s == null)
return null;
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(s.getBytes());
}
//BASE64 解码
public static String getFromBASE64(String s) {
if (s == null)
return null;
BASE64Decoder decoder = new BASE64Decoder();
try {
byte[] b = decoder.decodeBuffer(s);
return new String(b);
} catch (Exception e) {
return null;
}
}
}
执行结果:
Thunder://QUFodHRwOi8vMTkyLjE2OC41Ni4xOjgwODAvcG9ydGFsMi43elpa
Flashget://W0ZMQVNIR0VUXWh0dHA6Ly8xOTIuMTY4LjU2LjE6ODA4MC9wb3J0YWwyLjd6W0ZMQVNIR0VUXQ==&something
qqdl://aHR0cDovLzE5Mi4xNjguNTYuMTo4MDgwL3BvcnRhbDIuN3o=
迅雷链接解码:AAhttp://192.168.56.1:8080/portal2.7zZZ
当然除了用第三方包,我们也可以自己实现,详见 http://baike.baidu.com/view/469071.htm 代码实现部分
package com.shen.utils;
import java.io.CharArrayWriter;
import java.io.IOException;
public class Base64 {
static final char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
.toCharArray();
public static void main(String[] args) {
String str = "http://192.168.56.1:8080/portal2.7z";
str = "AA" + str + "ZZ";
char[] ch = encode(str.getBytes());
System.out.println("Thunder://" +new String(ch));
}
//Base64编码
public static char[] encode(byte[] content) {
CharArrayWriter cw = new CharArrayWriter(4 * content.length / 3);
int idx = 0;
int x = 0;
for (int i = 0; i < content.length; i++) {
if (idx == 0)
x = (content[i] & 0xFF) << 16;
else if (idx == 1)
x |= (content[i] & 0xFF) << 8;
else {
x |= content[i] & 0xFF;
}
idx++;
if (idx == 3) {
cw.write(alphabet[(x >> 18)]);
cw.write(alphabet[(x >> 12 & 0x3F)]);
cw.write(alphabet[(x >> 6 & 0x3F)]);
cw.write(alphabet[(x & 0x3F)]);
idx = 0;
}
}
if (idx == 1) {
cw.write(alphabet[(x >> 18)]);
cw.write(alphabet[(x >> 12 & 0x3F)]);
cw.write(61);
cw.write(61);
}
if (idx == 2) {
cw.write(alphabet[(x >> 18)]);
cw.write(alphabet[(x >> 12 & 0x3F)]);
cw.write(alphabet[(x >> 6 & 0x3F)]);
cw.write(61);
}
return cw.toCharArray();
}
//Base64解码
public static byte[] decode(char[] message) throws IOException {
byte[] buff = new byte[4];
byte[] dest = new byte[message.length];
int bpos = 0;
int destpos = 0;
for (int i = 0; i < message.length; i++) {
int c = message[i];
if ((c == 10) || (c == 13) || (c == 32) || (c == 9)) {
continue;
}
if ((c >= 65) && (c <= 90))
buff[(bpos++)] = (byte) (c - 65);
else if ((c >= 97) && (c <= 122))
buff[(bpos++)] = (byte) (c - 97 + 26);
else if ((c >= 48) && (c <= 57))
buff[(bpos++)] = (byte) (c - 48 + 52);
else if (c == 43)
buff[(bpos++)] = 62;
else if (c == 47)
buff[(bpos++)] = 63;
else if (c == 61)
buff[(bpos++)] = 64;
else {
throw new IOException("Illegal char in base64 code.");
}
if (bpos == 4) {
bpos = 0;
if (buff[0] == 64) {
break;
}
if (buff[1] == 64) {
throw new IOException("Unexpected '=' in base64 code.");
}
if (buff[2] == 64) {
int v = (buff[0] & 0x3F) << 6 | buff[1] & 0x3F;
dest[(destpos++)] = (byte) (v >> 4);
break;
}
if (buff[3] == 64) {
int v = (buff[0] & 0x3F) << 12 | (buff[1] & 0x3F) << 6
| buff[2] & 0x3F;
dest[(destpos++)] = (byte) (v >> 10);
dest[(destpos++)] = (byte) (v >> 2);
break;
}
int v = (buff[0] & 0x3F) << 18 | (buff[1] & 0x3F) << 12
| (buff[2] & 0x3F) << 6 | buff[3] & 0x3F;
dest[(destpos++)] = (byte) (v >> 16);
dest[(destpos++)] = (byte) (v >> 8);
dest[(destpos++)] = (byte) v;
}
}
byte[] res = new byte[destpos];
System.arraycopy(dest, 0, res, 0, destpos);
return res;
}
}
好了,就是这些了,希望给诸位带来一点点帮助,如有不足之处还望指正。