Des类,java代码(七)

2014-11-24 10:38:38 · 作者: · 浏览: 5
"");
byte[] tmpkey = new byte[8];// 真正起作用的密钥字节数组,只有8个字节
arraycopy(format_key, 0, tmpkey, 0, 8);
byte[] tmpdata = new byte[8];// 用于参与操作的数据字节数组,只有8个字节
createKey(tmpkey);
// 每一次循环,都操作8个字节(加密解密)
for (int i = 0; i < unitcount; i++) {
// if (i % 1000 == 0)
// Log.v("i", i + "");
arraycopy(format_data, i * 8, tmpdata, 0, 8);
byte[] tmpresult = UnitDes(tmpkey, tmpdata, flag);// 执行操作
arraycopy(tmpresult, 0, result_data, i * 8, 8);
}
return result_data;
}

// 密钥初试化成二维数组
int[][] KeyArray = new int[16][48];

private void createKey(byte[] des_key) {
// 二进制加密密钥
int[] keydata = new int[64];
// 将密钥字节数组转换成二进制字节数组
keydata = ReadDataToBirnaryIntArray(des_key);
// 初试化密钥为二维密钥数组
KeyInitialize(keydata, KeyArray);
// 将加密数据字节数组转换成二进制字节数组

}

/**
* DES加密
*
* @param data
* 原始数据
* @return 加密后的数据字节数组
*/
public String encrypt(String data) {
String dataLength = data.length() + "";// 原始数据长度
String datal = dataLength;
// 原始数据长度不满16位的加0补满16位
for (int i = 0; i < 16 - datal.length(); i++) {
dataLength = "0" + dataLength;
}
// System.out.println("dataLength = " + dataLength);
String sbDate = dataLength + data;// 保证原始数据的前16位为该数据的长度
byte[] bytekey = key.getBytes();// 密钥字节数组
byte[] bytedata = sbDate.getBytes();// 原始数据字节数组
byte[] result = new byte[(bytedata.length + 8) - (bytedata.length % 8)];// 能包含原始数据字节数组的长度是8的倍数的最小字节数组
result = DesEncrypt(bytekey, bytedata, 1);
return toBase64(result);
}

/**
* DES解密
*
* @param encryptData
* 加密后的数据字节数组
* @return 还原后的数据字符串
*/
public String decrypt(String encryptData) {
try {
byte[] encryptByteArray = fromBase64(encryptData);
byte[] bytekey = key.getBytes();
byte[] result = new byte[encryptByteArray.length];
result = DesEncrypt(bytekey, encryptByteArray, 0);
String deResult = new String(result);
int dataLength = Integer.parseInt(deResult.substring(0, 16));
return deResult.substring(16, dataLength + 16);
} catch (Exception e) {
return "";
}
}

/**
* 字节数组转换为字符串
*
* @param buffer
* @return
*/
private String toBase64(byte[] buffer) {
int len = buffer.length, pos = len % 3;
byte b0 = 0, b1 = 0, b2 = 0;
switch (pos) {
case 1:
b2 = buffer[0];
break;
case 2:
b1 = buffer[0];
b2 = buffer[1];
break;
}
String returnValue = "";
int c;
boolean notleading = false;
do {
// c = (b0 & 0xFC) >>> 2;
c = (b0 & 0xFC) >> 2;
if (notleading || c != 0) {
returnValue += BASE64_CHARSET[c];
notleading = true;
}
// c = ((b0 & 0x03) << 4) | ((b1 & 0xF0) >>> 4);
c = ((b0 & 0x03) << 4) | ((b1 & 0xF0) >> 4);
if (notleading || c != 0) {
returnValue += BASE64_CHARSET[c];
notleading = true;
}