epass1000钥匙盘java 代码

package com.bitservice.ntt.core.utils;

import java.util.HashMap;
import java.util.Map;

import epasjni.CePass;
import epasjni.IePass;
import epasjni.RTException;
import epasjni.WFileInfo;
import epasjni.ePassDef;

public class KeyHashToken {
    // private static MessageBox box;
    public static boolean haveError;

    public static char Hex(int bin) {
        char retval;

        if (bin >= 0 && bin <= 9)
            retval = (char) ('0' + bin);
        else if (bin >= 10 && bin <= 15)
            retval = (char) ('A' + bin - 10);
        else
            retval = '0';
        return retval;
    }

    public static int B2Int(byte[] bina) {
        int retval = 0;
        int t1 = 0;

        t1 = bina[3];
        retval = t1 & 0xFF;
        t1 = bina[2] & 0xFF;
        retval = retval * 0x100 + t1;
        t1 = bina[1] & 0xFF;
        retval = retval * 0x100 + t1;
        t1 = bina[0] & 0xFF;
        retval = retval * 0x100 + t1;
        return retval;
    }

    public static Map HashToken(String randomnumner) {
        Map hashMap = new HashMap();
        String oText = "";
        try {
            haveError = false;// 将haveerror初始化为false
            IePass ePass = new CePass();

            // ePassDef flag = new ePassDef();
            WFileInfo fi = new WFileInfo();
            byte[] tText = new byte[64];
            int[] tSize = new int[1];
            int Low, Hiw;
            try {
                ePass.CreateContext(0, ePassDef.EPAS_API_VERSION); //256
                System.out.println("打开设备");
                ePass.OpenDevice(ePassDef.EPAS_OPEN_FIRST, null);

                ePass.ChangeDir(ePassDef.EPAS_DIR_BY_LONG_ID, 0xF000, null);
                System.out.println("更改目录成功");

                ePass.OpenFile(ePassDef.EPAS_FILE_WRITE, 0x1234, fi);
                System.out.println("打开第一个密钥文件");
                System.out.println("Granted Access Right : 0x"
                        + Integer.toHexString(fi.chGrantedAccess));

                byte[] randomByte = toByteArray(randomnumner);
                for (int i = 0; i < randomByte.length; i++) {
                    System.out.print(randomByte[i] + ";");
                }

                ePass.HashToken(ePassDef.EPAS_HASH_MD5_HMAC, 0x2345, randomByte, randomByte.length,
                        tText, 16, tSize);
                System.out.println("打开第二个密钥文件,并进行加密运算,HashToken succeed. "
                        + Integer.toString(tSize[0]) + " bytes returned.");
//                String string = new String(tText);
//                System.out.println("tText = "+string);
                oText = "Data : ";
                for (int i = 0; i < randomByte.length; i++) {
                    Hiw = Low = randomByte[i];
                    Low &= 0xF;
                    Hiw >>= 4;
                    Hiw &= 0xF;
                    oText = oText + Hex(Hiw) + Hex(Low);
                }
                System.out.println("oText1_randomByte=" + oText);

                oText = "";
                for (int i = 0; i < 16; i++) {
                    Hiw = Low = tText[i];
                    //System.out.print(""+tText[i]+"-");
                    //System.out.println("--------------------");
                    Low &= 0xF;
                    Hiw >>= 4;
                    Hiw &= 0xF;
                    oText = oText + Hex(Hiw) + Hex(Low);
                }
                System.out.println("oText2_tText=" + oText);
                hashMap.put("status", "1");
                hashMap.put("msg", oText);

                ePass.CloseFile();
                System.out.println("关闭密钥文件2");

                ePass.ChangeDir(ePassDef.EPAS_DIR_TO_PARENT, 0, null);
                System.out.println("更改当前目录到根目录");
                System.out.println("Close the opened token...");
                ePass.CloseDevice();
                ePass.DeleteContext();
            } catch (RTException e) {
                System.out.println("RTException" + e.HResult() + ":" + e.getMessage());
                if (e.HResult() == 6) {
                    // box = new MessageBox(LoginDialog.shell,
                    // SWT.ICON_INFORMATION);
                    // box.setText("提示信息");
                    // box.setMessage("没有找到钥匙盘,请将钥匙盘插在USB端口上!");
                    // box.open();
                    hashMap.put("status", "0");
                    hashMap.put("msg", "没有找到钥匙盘,请将钥匙盘插在USB端口上!");

                    haveError = true;
                } else if (e.HResult() == 9 || e.HResult() == 10) {
                    // box = new MessageBox(LoginDialog.shell,
                    // SWT.ICON_INFORMATION);
                    // box.setText("提示信息");
                    // box.setMessage("不是有效的钥匙盘!");
                    // box.open();
                    hashMap.put("status", "0");
                    hashMap.put("msg", "不是有效的钥匙盘!");

                    haveError = true;
                }
            }
        } catch (Exception e) {
            // TODO: handle exception
            // box = new MessageBox(LoginDialog.shell, SWT.ICON_INFORMATION);
            // box.setText("提示信息");
            // box.setMessage("没有发现钥匙盘驱动程序,请安装钥匙盘驱动!");
            // box.open();
            hashMap.put("status", "0");
            hashMap.put("msg", "没有发现钥匙盘驱动程序,请安装钥匙盘驱动!");
            haveError = true;
        }
        return hashMap;

    }

    public static byte[] toByteArray(String hexString) {
        hexString = hexString.toLowerCase();
        final byte[] byteArray = new byte[hexString.length() / 2];
        int k = 0;
        for (int i = 0; i < byteArray.length; i++) {// 因为是16进制,最多只会占用4位,转换成字节需要两个16进制的字符,高位在先
            byte high = (byte) (Character.digit(hexString.charAt(k), 16) & 0xff);
            byte low = (byte) (Character.digit(hexString.charAt(k + 1), 16) & 0xff);
            byteArray[i] = (byte) (high << 4 | low);
            k += 2;
        }
        return byteArray;
    }
}






package com.bitservice.ntt.core.utils;

/*
HMAC_MD5 Interface

http://www.ftsafe.com
*/

import java.security.*;

public class KeyMD5HMAC {
    /**
    * Run standard tests from the RFC:
    */
    public static KeyMD5HMAC MD5HMAC (String authkey, String randomnumner) {
        //byte digest[];
        KeyMD5HMAC hm = null;
        try {
            byte key[] = authkey.getBytes();
            //byte key2[] = "bjestate161103AA190770043".getBytes();
            String text = randomnumner;
            //byte [] randomByte = {0x54, 0x70, 0x76, 0x4C, 0x76, 0x40, 0x45, 0x58};
            byte [] randomByte = KeyHashToken.toByteArray(text);
            for (int i = 0; i < randomByte.length; i++) {
                System.out.print(randomByte[i]+";");
            }
            System.out.println();
            
            hm = new KeyMD5HMAC(key);
            hm.addData(randomByte);
            //digest = hm.sign();
            //System.out.println("KeyMD5HMAC="+hm);
        } catch (NoSuchAlgorithmException nsae) {
            nsae.printStackTrace();
        }
        return hm;
    }
    
    /**
    * Digest to be returned upon completion of the HMAC_MD5.
    */
    private byte digest[];

    /**
    * Inner Padding.
    */
    private byte kIpad[];

    /**
    * Outer Padding.
    */
    private byte kOpad[];

    /**
    * Outer and general purpose MD5 object.
    */
    private MessageDigest md5;
    /**
    * Inner MD5 object.
    */
    private MessageDigest innerMD5;

    /**
    * Constructor
    * @throws NoSuchAlgorithmException if the MD5 implementation can't be found.
    * If this occurs or you need a faster implementation see www.bouncycastle.org
    * for something much better.
    */
    public KeyMD5HMAC(byte key[]) throws NoSuchAlgorithmException
    {
        md5 = MessageDigest.getInstance("MD5");
        innerMD5 = MessageDigest.getInstance("MD5");
        int kLen = key.length;

        // if key is longer than 64 bytes reset it to key=MD5(key)
        if (kLen > 64)
        {
            md5.update(key);
            key = md5.digest();
        }

        kIpad = new byte[64];    // inner padding - key XORd with ipad

        kOpad = new byte[64];    // outer padding - key XORd with opad

        // start out by storing key in pads
        System.arraycopy(key, 0, kIpad, 0, kLen);
        System.arraycopy(key, 0, kOpad, 0, kLen);

        // XOR key with ipad and opad values
        for (int i = 0; i < 64; i++)
        {
            kIpad[i] ^= 0x36;
            kOpad[i] ^= 0x5c;
        }

        clear();    // Initialize the first digest.
    }


    /**
    * Clear the HMAC_MD5 object.
    */
    public void clear()
    {
        innerMD5.reset();
        innerMD5.update(kIpad);    // Intialize the inner pad.

        digest = null;                // mark the digest as incomplete.
    }

    /**
    * HMAC_MD5 function.
    *
    * @param text Text to process
    *
    * @param key Key to use for HMAC hash.
    *
    * @return hash
    */
    public void addData(byte text[])
    {
        addData(text, 0, text.length);
    }

    /**
    * HMAC_MD5 function.
    *
    * @param text Text to process
    *
    * @param textStart    Start position of text in text buffer.
    * @param textLen Length of text to use from text buffer.
    * @param key Key to use for HMAC hash.
    *
    * @return hash
    */
    public void addData(byte text[], int textStart, int textLen)
    {
        innerMD5.update(text, textStart, textLen);    // then text of datagram.
    }

    public byte [] sign()
    {
        md5.reset();

        /*
        * the HMAC_MD5 transform looks like:
        *
        * MD5(K XOR opad, MD5(K XOR ipad, text))
        *
        * where K is an n byte key
        * ipad is the byte 0x36 repeated 64 times
        * opad is the byte 0x5c repeated 64 times
        * and text is the data being protected
        */

        // Perform inner MD5

        digest = innerMD5.digest();                // finish up 1st pass.

         // Perform outer MD5

        md5.reset();                                // Init md5 for 2nd pass.
        md5.update(kOpad);                            // Use outer pad.
        md5.update(digest);                            // Use results of first pass.
        digest = md5.digest();                        // Final result.

        return digest;
    }

    /**
    * Validate a signature against the current digest.
    * Compares the hash against the signature.
    *
    * @param signature
    *
    * @return True if the signature matches the calculated hash.
    */
    public boolean verify(byte signature[])
    {
        // The digest may not have been calculated.  If it's null, force a calculation.
        if (digest == null)
            sign();

        int sigLen = signature.length;
        int digLen = digest.length;

        if (sigLen != digLen)
            return false;    // Different lengths, not a good sign.

        for (int i = 0; i < sigLen; i++)
            if (signature[i] != digest[i])
                return false;    // Mismatch. Misfortune.

        return true;    // Signatures matched. Perseverance furthers.
    }

    /**
    *  Return the digest as a HEX string.
    *
    * @return a hex representation of the MD5 digest.
    */
    @Override
    public String toString()
    {
        // If not already calculated, do so.
        if (digest == null)
            sign();

        StringBuffer r = new StringBuffer();
        final String hex = "0123456789ABCDEF";
        byte b[] = digest;

        for (int i = 0; i < 16; i++)
        {
            int c = ((b[i]) >>> 4) & 0xf;
            r.append(hex.charAt(c));
            c = (b[i] & 0xf);
            r.append(hex.charAt(c));
        }

        return r.toString();
    }
}


你可能感兴趣的:(java)