?? dpcmobileauth.java
字號:
package dynamicP;
public class DPCMobileAuth {
// DPCAuth隨機數(shù)據(jù)
private final int RandomData[] = { 0x77, 0x3F, 0xAD, 0x16, 0xF0, 0x4B, 0x9D, 0xCE };
// DPCGetKey隨機數(shù)據(jù)left
private final int RandomFir[] = { 0x23, 0x64, 0xc8, 0x84, 0x35, 0xc5, 0xe4, 0x76, 0xdf, 0xac, 0xf1, 0x50, 0x3b, 0xa5, 0xca, 0xde };
// DPCGetKey隨機數(shù)據(jù)right
private final int RandomSec[] = { 0xf0, 0x98, 0xb9, 0x57, 0x96, 0xcb, 0xbd, 0x37, 0x50, 0x23, 0x40, 0xc1, 0x60, 0x40, 0xa7, 0x78 };
private String keyData = ""; // 輸人參數(shù):用戶輸入序列
private String timeData = ""; // 輸人參數(shù):用戶時間序列
private int result8[] = new int[8]; // 返回數(shù)據(jù):加密后的數(shù)據(jù)
private String password = ""; // 返回數(shù)據(jù):動態(tài)密碼
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位數(shù)字字符串轉(zhuǎn)換為整型數(shù)組
StringToIntArray(keyData, key);
// 轉(zhuǎn)換時間序列數(shù)據(jù)
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); // 給簡化的整數(shù)付值
result8[i] = result8[i] % 256; // 簡化返回數(shù)據(jù)數(shù)組
}
}
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 + -