src/main/java/com/whyc/controller/LicenseController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/encryption/SM2.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/whyc/service/LicenseService.java | ●●●●● 补丁 | 查看 | 原始文档 | 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){