📄 dpcmobileauth.java
字号:
package dynamicP;
public class DPCMobileAuth {
// DPCAuth随机数据
private final int RandomData[] = { 0x77, 0x3F, 0xAD, 0x16, 0xF0, 0x4B, 0x9D, 0xCE };
// DPCGetKey随机数据left
private final int RandomFir[] = { 0x23, 0x64, 0xc8, 0x84, 0x35, 0xc5, 0xe4, 0x76, 0xdf, 0xac, 0xf1, 0x50, 0x3b, 0xa5, 0xca, 0xde };
// DPCGetKey随机数据right
private final int RandomSec[] = { 0xf0, 0x98, 0xb9, 0x57, 0x96, 0xcb, 0xbd, 0x37, 0x50, 0x23, 0x40, 0xc1, 0x60, 0x40, 0xa7, 0x78 };
private String keyData = ""; // 输人参数:用户输入序列
private String timeData = ""; // 输人参数:用户时间序列
private int result8[] = new int[8]; // 返回数据:加密后的数据
private String password = ""; // 返回数据:动态密码
public DPCMobileAuth(String keycode, String timecode) {
int i;
keyData = keycode;
timeData = timecode;
int key[] = new int[8];
int timeCode[] = new int[8];
int okey32_1[] = new int[8];
int okey32_2[] = new int[8];
int okey32_3[] = new int[8];
int okey32_4[] = new int[8];
byte md5Middle[] = new byte[16];
byte workBuf[] = new byte[32];
byte byteout[] = new byte[16];
int intout[] = new int[16];
// 将19位数字字符串转换为整型数组
StringToIntArray(keyData, key);
// 转换时间序列数据
SetStringToInt(timeData, timeCode);
for(i = 0; i < timeCode.length; ++i) {
workBuf[i] = (byte)timeCode[i];
workBuf[i + timeCode.length] = (byte)key[i];
}
MD5 m = new MD5();
md5Middle = m.getMD5ofByte(workBuf, workBuf.length>>1);
for(i = 0; i < 8; ++i) {
workBuf[i] = (byte)timeCode[i];
workBuf[(i<<1) + timeCode.length] = (byte)(md5Middle[(i<<1)] ^ RandomFir[(i<<1)]);
workBuf[(i<<1) + 1 + timeCode.length] = (byte)(md5Middle[(i<<1) + 1] ^ RandomFir[(i<<1) + 1]);
workBuf[i + timeCode.length + md5Middle.length] = (byte)key[i];
}
byteout = m.getMD5ofByte(workBuf, workBuf.length);
SetByteToInt(byteout, intout);
for(i = 0; i < 8; ++i) {
okey32_1[i] = intout[i];
okey32_2[i] = intout[i + 8];
}
for(i = 0; i < 8; ++i) {
workBuf[i] = (byte)key[i];
workBuf[(i<<1) + key.length] = (byte)(md5Middle[(i<<1)] ^ RandomSec[(i<<1)]);
workBuf[(i<<1) + 1 + key.length] = (byte)(md5Middle[(i<<1) + 1] ^ RandomSec[(i<<1) + 1]);
workBuf[i + key.length + md5Middle.length] = (byte)timeCode[i];
}
byteout = m.getMD5ofByte(workBuf, workBuf.length);
SetByteToInt(byteout, intout);
for(i = 0; i < 8; ++i) {
okey32_3[i] = intout[i];
okey32_4[i] = intout[i + 8];
}
// 计算密码
password = ""; // 清空原有信息
for(i = 0; i < 8; i++) {
okey32_1[i] ^= RandomData[i];
okey32_2[i] ^= RandomData[i];
okey32_3[i] ^= RandomData[i];
okey32_4[i] ^= RandomData[i];
result8[i] = okey32_1[i] + okey32_2[i] + okey32_3[i] + okey32_4[i];
password += Integer.toString(result8[i] % 10); // 给简化的整数付值
result8[i] = result8[i] % 256; // 简化返回数据数组
}
}
private int StringToIntArray(String strdata, int intdata[]) {
int i;
if(strdata.length() != 19) {
return -1;
}
String str1 = strdata.substring(0, 1);
String str2 = strdata.substring(1, strdata.length());
long ld1 = Long.parseLong(str1) * 1000000000000000000L;
long ld2 = Long.parseLong(str2);
long ldata = ld1 + ld2;
//long ldata = Long.parseLong(strdata);
for(i = 0; i < 8; i++) {
intdata[i] = (int)((ldata>>>(i<<3)) & 0xFFL);
}
return 0;
}
private int SetStringToInt(String strdata, int intdata[]) {
for(int i = 0; i < 8; i++) {
intdata[i] = (strdata.charAt(i) + 256) % 256;
}
return 0;
}
private int SetByteToInt(byte bytedata[], int intdata[]) {
for(int i = 0; i < bytedata.length; i++) {
intdata[i] = (bytedata[i] + 256) % 256;
}
return 0;
}
public String GetPassword() {
return password;
}
public int[] GetIntResultArray() {
return result8;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -