⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dpcmobileauth.java

📁 手机动态密码产生器
💻 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 + -