Java服务器的JSON数据包三重加密算法 (一)

2014-11-24 10:38:29 · 作者: · 浏览: 2

由于游戏对数据包的传输内容很关注,如果写的不好很容易被破解。我这里采用的是json传输数据,所以要对数据进行加密解密,用来更方便的做操作。

基本加密顺序就是 JSON字符串->Base64字符串->DES加密

其中

Base64是一重加密

Base64里面我改进了算法,支持任意形式的字典表,所以这个地方是第二重加密

DES在Base64的基础上再次用秘钥加密。

有人问为什么还需要改Base64的字典表,其实原因就是DES的秘钥只能是8个字节,按照现在计算机的处理速度,24小时就破解了。


首先我们要有个处理Base64的处理类,这里我把网上一个公开的类库做了改进,做了一个混排编码格式

public class Base64 {

private static final char[] legalChars = "ghijk67stuJKLM89rvwxyzAlmnOUV+/abcdefPQRSTopqCDEFG012345BHINWXYZ"

.toCharArray();//字典内顺序任意更改,只要内容保证不缺就行

private static HashMap hashDecode=new HashMap();

/**

* data[]进行编码

*

* @param data

* @return

*/


public static String encode(byte[] data) {

int start = 0;

int len = data.length;

StringBuffer buf = new StringBuffer(data.length * 3 / 2);

int end = len - 3;

int i = start;

int n = 0;

while (i <= end) {

int d = ((((int) data[i]) & 0x0ff) << 16)

| ((((int) data[i + 1]) & 0x0ff) << 8)

| (((int) data[i + 2]) & 0x0ff);

buf.append(legalChars[(d >> 18) & 63]);

buf.append(legalChars[(d >> 12) & 63]);

buf.append(legalChars[(d >> 6) & 63]);

buf.append(legalChars[d & 63]);

i += 3;

if (n++ >= 14) {

n = 0;

buf.append(" ");

}

}

if (i == start + len - 2) {

int d = ((((int) data[i]) & 0x0ff) << 16)

| ((((int) data[i + 1]) & 255) << 8);

buf.append(legalChars[(d >> 18) & 63]);

buf.append(legalChars[(d >> 12) & 63]);

buf.append(legalChars[(d >> 6) & 63]);

buf.append("=");

} else if (i == start + len - 1) {

int d = (((int) data[i]) & 0x0ff) << 16;

buf.append(legalChars[(d >> 18) & 63]);

buf.append(legalChars[(d >> 12) & 63]);

buf.append("==");

}

return buf.toString();

}

public static byte[] decode(String s) {


ByteArrayOutputStream bos = new ByteArrayOutputStream();

try {

decode(s, bos);

} catch (IOException e) {

throw new RuntimeException();

}

byte[] decodedBytes = bos.toByteArray();

try {

bos.close();

bos = null;

} catch (IOException ex) {

System.err.println("Error while decoding BASE64: " + ex.toString());

}

return decodedBytes;

}

private static void decode(String s, OutputStream os) throws IOException {

int i = 0;

int len = s.length();

while (true) {

while (i < len && s.charAt(i) <= ' ')

i++;

if (i == len)

break;

int tri = (decode(s.charAt(i)) << 18)

+ (decode(s.charAt(i + 1)) << 12)

+ (decode(s.charAt(i + 2)) << 6)

+ (decode(s.charAt(i + 3)));

os.write((tri >> 16) & 255);

if (s.charAt(i + 2) == '=')

break;

os.write((tri >> 8) & 255);

if (s.charAt(i + 3) == '=')

break;

os.write(tri & 255);

i += 4;

}

}

private static int decode(char c) {


if(hashDecode.size()==0)

{

for(int i =0;i<64;i++)

{ char ch = legalChars[i];

hashDecode.put(