whycxzp
2022-03-14 49ea842aa493a2ada79d6833f4ff85fc8291c0cc
SM2的公私钥获取方式更新
3个文件已修改
132 ■■■■ 已修改文件
src/main/java/com/whyc/controller/LicenseController.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/encryption/SM2.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/service/LicenseService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/whyc/controller/LicenseController.java
@@ -11,18 +11,13 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.bouncycastle.math.ec.ECPoint;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.ClassUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.*;
import java.math.BigInteger;
@RequestMapping("license")
@@ -31,9 +26,12 @@
public class LicenseController {
    @Resource
    private LicenseService service;
    /**
     * 类加载时初始化sm2的公私钥
     */
    final static ECPoint publicKey = SM2.getPublicKey();
    final static BigInteger privateKey = SM2.getPrivateKey();
    @Autowired
    private Environment environment;
    /**
     * 检验服务器是否注册,是否已存在序列号
@@ -63,7 +61,7 @@
    @ApiOperation(value = "获取序列号license")
    public Response getSerialNumberLicense(){
        //序列号加密 license
        Response model=createLicense(System.currentTimeMillis()+"createTime"+ SerialNumberUtil.getSerialNumber());
        Response model=LicenseController.createLicense(System.currentTimeMillis()+"createTime"+ SerialNumberUtil.getSerialNumber());
        //同时,将序列号生成时间记录到application域中
        //getApplication().setAttribute("serialNumberLicenseTime",System.currentTimeMillis());
        //ActionUtil.getApplication().setAttribute("serialNumberLicenseTime",System.currentTimeMillis());
@@ -71,7 +69,7 @@
    }
    //获取一个license
    public Response createLicense(String serialNumber){
    public static Response createLicense(String serialNumber){
        //初始化sm2参数x
        SM2 x = new SM2();
        /*String realPath = ClassUtils.getDefaultClassLoader().getResource("").getPath();
@@ -79,15 +77,17 @@
        BigInteger privKey = x.importPrivateKey(realPath+"config/pri_key.ksm");
        ECPoint pubKey = x.importPublicKey(realPath+"config/pub_key.ksm");*/
        String fileDirName=getRealPath("pub_key.ksm");
        ECPoint pubKey = x.importPublicKey(fileDirName+"/pub_key.ksm");
        //旧版本
        /*String fileDirName=LicenseController.getRealPath("pub_key.ksm");
        ECPoint pubKey = x.importPublicKey(fileDirName+"/pub_key.ksm");*/
        //System.out.println("pubKey "+pubKey);
        /*String origin = "Company: Fuguang Electronic\n"
                + "Project:BTS monitor platform\n"
                + "Licence type:Permanent";*/
        //获取加密列表
        //System.out.println("origin "+origin);
        byte[] encryptResult = x.encrypt(serialNumber, pubKey);
        //byte[] encryptResult = x.encrypt(serialNumber, pubKey);
        byte[] encryptResult = x.encrypt(serialNumber, publicKey);
        String encrypt = ByteConvertUtil.bytesToHexString(encryptResult);
        //System.out.println("encrypt:"+encrypt);
        return new Response().set(1,encrypt);
@@ -108,15 +108,16 @@
        SM2 x = new SM2();
        //String realPath = ClassUtils.getDefaultClassLoader().getResource("").getPath();
        //ECPoint pubKey = x.importPublicKey(realPath + "config/pub_key.ksm");
        String fileDirName=getRealPath("pri_key.ksm");
        BigInteger privKey = x.importPrivateKey(fileDirName + "/pri_key.ksm");
        /*//旧版本
        String fileDirName=LicenseController.getRealPath("pri_key.ksm");
        BigInteger privKey = x.importPrivateKey(fileDirName + "/pri_key.ksm");*/
        String origin = "Company: Fuguang Electronic\n"
                + "Project:BTS monitor platform\n"
                + "Licence duration:";
        //获取解密后license,附带校验license编码格式
        String decryptResult = null;
        byte[] bytes = ByteConvertUtil.hexToByteArray(license);
        decryptResult = x.decrypt(bytes, privKey);
        decryptResult = x.decrypt(bytes, privateKey);
        //用户只能往小调时间
        String[] split1 = decryptResult.split("machineCode:");
        Long registerCodeTime = Long.valueOf(split1[0]);
@@ -175,18 +176,13 @@
    //将pri_key.ksm。pub_key.ksm文件拷贝至ksm文件下然后读取fileName:/config/pri_key.ksm
    public String getRealPath(String fileName){
    public static String getRealPath(String fileName){
        ClassPathResource classPathResource = new ClassPathResource("/config/"+fileName);
        InputStream inputStream_pub = null;
        ApplicationHome applicationHome = new ApplicationHome(LicenseController.class);
        File jarFile = applicationHome.getDir();
        int configType = Integer.parseInt(environment.getProperty("configFile.type"));
        String fileDirName = "";
        if(configType==1){
            fileDirName = jarFile.getParentFile().toString()+ File.separator+"ksm";
        }else {
            fileDirName = jarFile.toString()+File.separator+"ksm";//打包版本
        }
        String fileDirName = jarFile.getParentFile().toString()+ File.separator+"ksm";
        //String fileDirName = jarFile.toString()+File.separator+"ksm";//打包版本
        createFile(fileDirName);//创建文件夹ksm
        try {
            inputStream_pub = classPathResource.getInputStream();
@@ -203,7 +199,7 @@
        }
        return fileDirName;
    }
    public void createFile(String pathName) {
    public static void createFile(String pathName) {
        File dir = new File(pathName);
        if (!dir.exists()) {// 判断目录是否存在
            dir.mkdir();
src/main/java/com/whyc/encryption/SM2.java
@@ -3,6 +3,7 @@
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.math.ec.ECCurve;
import org.bouncycastle.math.ec.ECPoint;
import org.springframework.core.io.ClassPathResource;
import java.io.*;
import java.math.BigInteger;
@@ -34,6 +35,14 @@
    private static ECCurve.Fp curve;
    private static ECPoint G;
    private boolean debug = false;
    static {
        curve = new ECCurve.Fp(p, // q
                a, // a
                b); // b
        G = curve.createPoint(gx, gy);
        ecc_bc_spec = new ECDomainParameters(curve, G, n);
    }
    public boolean isDebug() {
        return debug;
@@ -780,9 +789,66 @@
        }
    }
    /**
     * 获取私钥
     * @return
     */
    public static BigInteger getPrivateKey(){
        ClassPathResource classPathResource = new ClassPathResource("/config/pri_key.ksm");
        InputStream inputStream = null;
        try {
            inputStream = classPathResource.getInputStream();
            ObjectInputStream ois = new ObjectInputStream(inputStream);
            BigInteger res = (BigInteger) (ois.readObject());
            ois.close();
            return res;
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 获取公钥
     * @return
     */
    public static ECPoint getPublicKey(){
        try {
            ClassPathResource classPathResource = new ClassPathResource("/config/pub_key.ksm");
            InputStream inputStream = classPathResource.getInputStream();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte buffer[] = new byte[16];
            int size;
            while ((size = inputStream.read(buffer)) != -1) {
                baos.write(buffer, 0, size);
            }
            inputStream.close();
            return curve.decodePoint(baos.toByteArray());
        }catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
    public static void main(String[] args) throws UnsupportedEncodingException {
        SM2 sm02 = new SM2();
        //BigInteger privateKey = sm02.importPrivateKey(ClassUtils.getDefaultClassLoader().getResource("").getPath() + "config/pri_key.ksm");
        //ECPoint publicKey = sm02.importPublicKey(ClassUtils.getDefaultClassLoader().getResource("").getPath() + "config/pri_key.ksm");
        BigInteger privateKey2 = sm02.getPrivateKey();
        privateKey2 = privateKey2.add(new BigInteger("1"));
        ECPoint publicKey2 = sm02.getPublicKey();
        byte[] encrypt = sm02.encrypt("123456", publicKey2);
        String decrypt = sm02.decrypt(encrypt, privateKey2);
        System.out.println(decrypt);
        //System.out.println(privateKey);
        //System.out.println(publicKey);
        //System.out.println(privateKey2);
        //System.out.println(publicKey2);
        /*
         BigInteger px = new BigInteger(
         "0AE4C779 8AA0F119 471BEE11 825BE462 02BB79E2 A5844495 E97C04FF 4DF2548A".replace(" ", ""), 16);
@@ -792,15 +858,15 @@
         BigInteger privateKey = new BigInteger(
         "128B2FA8 BD433C6C 068C8D80 3DFF7979 2A519A55 171B1B65 0C23661D 15897263".replace(" ", ""), 16);
         */
        SM2KeyPair keyPair = sm02.generateKeyPair();
        /*SM2KeyPair keyPair = sm02.generateKeyPair();
        ECPoint publicKey=keyPair.getPublicKey();
        BigInteger privateKey=keyPair.getPrivateKey();
        sm02.exportPublicKey(publicKey, "E:/publickey.pem");
        sm02.exportPrivateKey(privateKey, "E:/privatekey.pem");
        System.out.println("-----------------公钥加密与解�?-----------------");
        /*ECPoint*/ publicKey = sm02.importPublicKey("E:/publickey.pem");
        /*BigInteger*/ privateKey = sm02.importPrivateKey("E:/privatekey.pem");
        *//*ECPoint*//* publicKey = sm02.importPublicKey("E:/publickey.pem");
        *//*BigInteger*//* privateKey = sm02.importPrivateKey("E:/privatekey.pem");
        byte[] data = sm02.encrypt("测试加密aaaaaaaaaaa123aabb", publicKey);
        System.out.print("密文:");
        SM2.printHexString(data);
@@ -826,7 +892,7 @@
        TransportEntity entity1 = aKeyExchange.keyExchange_1();
        TransportEntity entity2 = bKeyExchange.keyExchange_2(entity1);
        TransportEntity entity3 = aKeyExchange.keyExchange_3(entity2);
        bKeyExchange.keyExchange_4(entity3);
        bKeyExchange.keyExchange_4(entity3);*/
    }
    public static class Signature {
src/main/java/com/whyc/service/LicenseService.java
@@ -45,14 +45,15 @@
        SM2 x = new SM2();
//        String realPath = ServletActionContext.getServletContext().getRealPath("/");
//        BigInteger privKey = x.importPrivateKey(realPath+"WEB-INF/classes/pri_key.ksm");
        String path = ClassUtils.getDefaultClassLoader().getResource("").getPath();
        BigInteger privKey = x.importPrivateKey(path+"config/pri_key.ksm");
        //旧版本
        /*String path = ClassUtils.getDefaultClassLoader().getResource("").getPath();
        BigInteger privKey = x.importPrivateKey(path+"config/pri_key.ksm");*/
        //解密
        try {
            byte[] bytes = ByteConvertUtil.hexToByteArray(license);
            String decryptResult = x.decrypt(bytes, privKey);
            String decryptResult = x.decrypt(bytes, SM2.getPrivateKey());
            if(decryptResult.indexOf(origin)!=-1){
                String[] split = decryptResult.split("Valid time:");
@@ -102,13 +103,14 @@
            SM2 x = new SM2();
//            String realPath = ServletActionContext.getServletContext().getRealPath("/");
//            BigInteger privKey = x.importPrivateKey(realPath+"WEB-INF/classes/pri_key.ksm");
            /*//旧版本
            String path = ClassUtils.getDefaultClassLoader().getResource("").getPath();;
            BigInteger privKey = x.importPrivateKey(path+"config/pri_key.ksm");
            BigInteger privKey = x.importPrivateKey(path+"config/pri_key.ksm");*/
            //解密
            try {
                byte[] bytes = ByteConvertUtil.hexToByteArray(license);
                String decryptResult = x.decrypt(bytes, privKey);
                String decryptResult = x.decrypt(bytes, SM2.getPrivateKey());
                String[] split = decryptResult.split("Valid time:");
                if(split.length>1){