int i;
int j;
int[] L0 = new int[32];
int[] R0 = new int[32];
int[] L1 = new int[32];
int[] R1 = new int[32];
int[] RE = new int[48];
int[][] S = new int[8][6];
int[] sBoxData = new int[8];
int[] sValue = new int[32];
int[] RP = new int[32];
for (i = 0; i < 32; i++) {
L0[i] = M[i]; // 明文左侧的初始化
R0[i] = M[i + 32]; // 明文右侧的初始化
}
for (i = 0; i < 48; i++) {
RE[i] = R0[E[i] - 1]; // 经过E变换扩充,由32位变为48位
RE[i] = RE[i] + keyarray[times][i]; // 与KeyArray[times][i]按位作不进位加法运算
if (RE[i] == 2) {
RE[i] = 0;
}
}
for (i = 0; i < 8; i++) { // 48位分成8组
for (j = 0; j < 6; j++) {
S[i][j] = RE[(i * 6) + j];
}
// 下面经过S盒,得到8个数
sBoxData[i] = S_Box[i][(S[i][0] << 1) + S[i][5]][(S[i][1] << 3)
+ (S[i][2] << 2) + (S[i][3] << 1) + S[i][4]];
// 8个数变换输出二进制
for (j = 0; j < 4; j++) {
sValue[((i * 4) + 3) - j] = sBoxData[i] % 2;
sBoxData[i] = sBoxData[i] / 2;
}
}
for (i = 0; i < 32; i++) {
RP[i] = sValue[P[i] - 1]; // 经过P变换
L1[i] = R0[i]; // 右边移到左边
R1[i] = L0[i] + RP[i];
if (R1[i] == 2) {
R1[i] = 0;
}
// 重新合成M,返回数组M
// 最后一次变换时,左右不进行互换。此处采用两次变换实现不变
if (((flag == 0) && (times == 0)) || ((flag == 1) && (times == 15))) {
M[i] = R1[i];
M[i + 32] = L1[i];
} else {
M[i] = L1[i];
M[i + 32] = R1[i];
}
}
}
/**
*
* @param src
* @param srcPos
* @param dest
* @param destPos
* @param length
*/
private void arraycopy(byte[] src, int srcPos, byte[] dest, int destPos,
int length) {
if (dest != null && src != null) {// 当两个都不为空时
byte[] temp = new byte[length];
for (int i = 0; i < length; i++) {
temp[i] = src[srcPos + i];
}
for (int i = 0; i < length; i++) {
dest[destPos + i] = temp[i];
}
}
}
/**
* 格式化字节数组,使其的长度为8的倍数,那些不足的部分元素用0填充
*
* @return 一个新的字节数组,其长度比原数组长1-8位
*/
private byte[] ByteDataFormat(byte[] data) {
int len = data.length;
int padlen = 8 - (len % 8);// 要格式化的字节数组的长度与8的倍数的差值
int newlen = len + padlen;
byte[] newdata = new byte[newlen];
arraycopy(data, 0, newdata, 0, len);
for (int i = len; i < newlen; i++)
newdata[i] = 0;
return newdata;
}
/**
* 加密解密(主要方法)
*
* @param des_key
* 密钥字节数组
* @param des_data
* 要处理的数据字节数组
* @param flag
* (1或0),1为加密,0为解密
* @return 处理后的数据
*/
private byte[] DesEncrypt(byte[] des_key, byte[] des_data, int flag) {
byte[] format_key = ByteDataFormat(des_key);// 补齐密钥字节数组的长度为8的倍数,不足元素用0补
byte[] format_data = ByteDataFormat(des_data);// 补齐原始数据字节数组的长度为8的倍数,不足元素用0补
int datalen = format_data.length;// 补齐后的原始数据字节数组的长度
int unitcount = datalen / 8;// 补齐后的原始数据字节数组长度是8的多少倍
byte[] result_data = new byte[datalen];// 用于盛放加密后的结果
// Log.v("unitcount", unitcount +