license.TestWakeLicense.java Source code

Java tutorial

Introduction

Here is the source code for license.TestWakeLicense.java

Source

package license;

import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.math.BigInteger;
import java.net.NetworkInterface;
import java.security.KeyFactory;
import java.security.MessageDigest;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.RSAPrivateKeySpec;
import java.security.spec.RSAPublicKeySpec;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.Enumeration;

import javax.crypto.Cipher;

import license.blowfish.Blowfish;

import org.apache.commons.codec.binary.Base64;
import org.junit.Test;

/**
 * wake
 * @author byht
 *
 */
public class TestWakeLicense {

    //1.?
    ProjectInfo pi = new ProjectInfo();
    /**
     * ??string
     */
    private String testData;

    /**
     * wakelicense
     * @throws Exception
     */
    @Test
    public void testWake() throws Exception {

        pi.setClient("");
        pi.setName("");
        pi.setContact("");
        pi.setTel("15000100001");
        pi.setEmail("dcm19890101@163.com");

        String info = projectInfoToString(pi);
        System.out.println(
                "---===(*****?info.getBytes()?Register.data)"
                        + info);

        System.out.println();
        System.out.println();

        readProjectInfo(pi, info);

        System.out.println();
        System.out.println();

        setInput(pi);

        System.out.println();
        System.out.println();

        //??testData
        testData = toString(pi);
        System.out.println(testData);

        System.out.println(extraData());

        System.out.println();
        System.out.println();

        //
        //wake*?*license?
        //
        String[] ss = testData.split("\n");
        String blowfishInfo = new Blowfish(Date.class.getName()).decryptString(ss[0]);
        byte[] rmd5 = md5(blowfishInfo);
        //?base64?
        byte[] lmd5 = rsa(new Base64().decode(ss[1]));
        System.out.println("?? " + equalsBytes(rmd5, lmd5));
    }

    /**
     * ??? 
     * @param rmd5
     * @param lmd5
     * @return
     */
    private static boolean equalsBytes(byte[] rmd5, byte[] lmd5) {
        if (rmd5.length == lmd5.length) {
            for (int i = 0; i < rmd5.length; i++)
                if (rmd5[i] != lmd5[i])
                    return false;
            return true;
        }
        return false;
    }

    /**
     * ?
     * @return
     * @throws Exception
     */
    static PublicKey readPublicKeyFromFile() throws Exception {
        ObjectInputStream oin = new ObjectInputStream(new ByteArrayInputStream(KeyData.publicKey));
        try {
            BigInteger m = (BigInteger) oin.readObject();
            BigInteger e = (BigInteger) oin.readObject();
            RSAPublicKeySpec keySpec = new RSAPublicKeySpec(m, e);
            KeyFactory fact = KeyFactory.getInstance("RSA");
            return fact.generatePublic(keySpec);
        } finally {
            oin.close();
        }
    }

    /**
     * ?rsa?
     * @param key
     * @return
     * @throws Exception
     */
    private static byte[] rsa(byte[] key) throws Exception {
        PublicKey pubKey = readPublicKeyFromFile();
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(2, pubKey);
        return cipher.doFinal(key);
    }

    /**
     * blowfish??md5
     * @param info
     * @return
     * @throws Exception
     */
    private static byte[] md5(String info) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < info.length(); i++)
            sb.append(Integer.valueOf(info.charAt(i)));
        return md.digest(sb.toString().getBytes());
    }

    /**
     * jersey.data??
     * @return
     */
    public String extraData() {

        StringBuffer sb = new StringBuffer();
        sb.append("\n:");
        sb.append(pi.getClient());
        sb.append("\n:");
        sb.append(pi.getName());
        sb.append("\n:");
        switch (pi.getType().intValue()) {
        case 0:
            sb.append("?");
            break;
        case 1:
            sb.append("");
            break;
        case 2:
            sb.append("?");
            break;
        }

        sb.append("\n");
        sb.append(new SimpleDateFormat("yyyy-MM-dd").format(new Date(pi.getPeriod().longValue())));

        return sb.toString();
    }

    public String encryptProjectInfo(ProjectInfo pi) {
        return new Blowfish(Date.class.getName()).encryptString(projectInfo(pi));
    }

    private String projectInfo(ProjectInfo pi) {
        StringBuilder sb = new StringBuilder();
        sb.append("1=").append(pi.getName()).append("\n");
        sb.append("2=").append(pi.getClient()).append("\n");
        sb.append("3=").append(pi.getMaxUsers()).append("\n");
        sb.append("4=").append(pi.getMaxOnlineUsers()).append("\n");
        sb.append("5=").append(pi.getType()).append("\n");
        sb.append("6=").append(pi.getPeriod()).append("\n");
        sb.append("7=").append(pi.getEmail()).append("\n");
        sb.append("8=").append(pi.getTel()).append("\n");
        sb.append("9=").append(pi.getContact()).append("\n");
        sb.append("10=").append(pi.getPath()).append("\n");
        sb.append("11=").append(pi.getCpuNumber()).append("\n");
        sb.append("12=").append(pi.getMacName1()).append("\n");
        sb.append("13=").append(pi.getMac1()).append("\n");
        sb.append("14=").append(pi.getMacName2()).append("\n");
        sb.append("15=").append(pi.getMac2()).append("\n");

        System.out.println("----- : " + sb.toString());

        return sb.toString();
    }

    /**
     * ?
     * ;blowfish??
     * ;md5--rsa--base64??
     * 
     */
    public String toString(ProjectInfo pi) {
        System.out.println("?");

        try {
            return encryptProjectInfo(pi) + "\n" + new Base64().encodeAsString(rsa());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    byte[] rsa() throws Exception {
        PrivateKey privateKey = readPrivateKeyFromFile();
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(1, privateKey);
        return cipher.doFinal(md5());
    }

    byte[] md5() throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        StringBuilder sb = new StringBuilder();
        String info = projectInfo(pi);
        System.out.println("----?md5");
        System.out.println(info);
        System.out.println();
        for (int i = 0; i < info.length(); i++)
            sb.append(Integer.valueOf(info.charAt(i)));
        return md.digest(sb.toString().getBytes());
    }

    /**
     * ??
     * @return
     * @throws Exception
     */
    private static PrivateKey readPrivateKeyFromFile() throws Exception {
        //??
        ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(
                new FileInputStream(new File("E:\\workspace\\TestProject\\src\\license\\private.key"))));
        try {
            BigInteger m = (BigInteger) oin.readObject();
            BigInteger e = (BigInteger) oin.readObject();
            RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(m, e);
            KeyFactory fact = KeyFactory.getInstance("RSA");
            return fact.generatePrivate(keySpec);
        } finally {
            //         oin.close();
        }
    }

    /**
     * ?
     * @param pi
     */
    private void setInput(ProjectInfo pi) throws Exception {
        System.out.println("?=====");
        System.out.println();
        System.out.println("License (0: ?, 1: , 2: ?) :------?1 ");
        pi.setType(1);
        System.out.println(" (yyyy-MM-dd) :-----?2013-06-01 ");
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        pi.setPeriod(Long.valueOf(sdf.parse("2013-06-01").getTime()));
        System.out.println(" : -----?100");
        pi.setMaxUsers(100);
        System.out.println(" : -----?100");
        pi.setMaxOnlineUsers(100);
    }

    /**
     * ?
     * @param info
     * @throws Exception
     */
    public void readProjectInfo(ProjectInfo pi, String info) throws Exception {
        String[] arrayOfString1;
        System.out.println("???---");
        int j = (arrayOfString1 = new Blowfish(Date.class.getName()).decryptString(info).split("\n")).length;
        for (int i = 0; i < j; i++) {
            String str = arrayOfString1[i];
            String[] s = str.split("=");
            System.out.println(s[0] + "=" + s[1]);
            switch (Integer.valueOf(s[0]).intValue()) {
            case 1:
                pi.setName(s[1]);
                break;
            case 2:
                pi.setClient(s[1]);
                break;
            case 7:
                pi.setEmail(s[1]);
                break;
            case 8:
                pi.setTel(s[1]);
                break;
            case 9:
                pi.setContact(s[1]);
                break;
            case 10:
                pi.setPath(s[1]);
                break;
            case 11:
                pi.setCpuNumber(Integer.valueOf(s[1]));
                break;
            case 12:
                pi.setMacName1(s[1]);
                break;
            case 13:
                pi.setMac1(s[1]);
                break;
            case 14:
                pi.setMacName2(s[1]);
                break;
            case 15:
                pi.setMac2(s[1]);
            case 3:
            case 4:
            case 5:
            case 6:
            }
        }
    }

    private String projectInfoToString(ProjectInfo pi) {
        StringBuilder sb = new StringBuilder();
        sb.append("1=").append(pi.getName()).append("\n");
        sb.append("2=").append(pi.getClient()).append("\n");
        sb.append("3=").append(pi.getMaxUsers()).append("\n");
        sb.append("4=").append(pi.getMaxOnlineUsers()).append("\n");
        sb.append("5=").append(pi.getType()).append("\n");
        sb.append("6=").append(pi.getPeriod()).append("\n");
        sb.append("7=").append(pi.getEmail()).append("\n");
        sb.append("8=").append(pi.getTel()).append("\n");
        sb.append("9=").append(pi.getContact()).append("\n");
        sb.append("10=").append(path()).append("\n");
        sb.append("11=").append(Runtime.getRuntime().availableProcessors()).append("\n");
        try {
            mac(sb);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("----?---====\n" + sb.toString());
        return new Blowfish(Date.class.getName()).encryptString(sb.toString());
    }

    /**
     * ?mac?
     * @param sb
     * @throws Exception
     */
    private static void mac(StringBuilder sb) throws Exception {
        Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
        int i = 12;
        Base64 base64 = new Base64();
        for (NetworkInterface ni : Collections.list(interfaces)) {
            if (ni.getName().substring(0, 1).equalsIgnoreCase("e")) {
                sb.append(String.valueOf(i)).append('=').append(ni.getName()).append('\n');
                i++;
                byte[] mac = ni.getHardwareAddress();
                sb.append(String.valueOf(i)).append('=').append(base64.encodeAsString(mac)).append('\n');
                i++;
            }
        }
    }

    /**
     * ?
     * @return
     */
    private static String path() {
        return ProjectInfo.class.getProtectionDomain().getCodeSource().getLocation().getPath().split("lib")[0];
    }

}