From f232d52357658e0b1a7689c2cdf0e7105b9e1d5e Mon Sep 17 00:00:00 2001 From: vince <757871790@qq.com> Date: 星期四, 28 三月 2024 16:54:36 +0800 Subject: [PATCH] 初始提交 --- pms-core/src/main/java/com/fzzy/utils/RsaUtils.java | 231 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 231 insertions(+), 0 deletions(-) diff --git a/pms-core/src/main/java/com/fzzy/utils/RsaUtils.java b/pms-core/src/main/java/com/fzzy/utils/RsaUtils.java new file mode 100644 index 0000000..7246c64 --- /dev/null +++ b/pms-core/src/main/java/com/fzzy/utils/RsaUtils.java @@ -0,0 +1,231 @@ +package com.fzzy.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import java.security.*; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.HashMap; +import java.util.Map; + +/** + * 闈炲绉板姞瀵� RSA + */ +public class RsaUtils { + + private static final String ALGORITHM = "RSA"; + + private static final String SIGNATURE_ALGORITHM = "MD5withRSA"; + /** + * 鍏挜锛歁IGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCD+0EDvobeBBOp5P0ax8jjEWdyNjHhGLviKMNrqAdAZfYMJdq0bv2LTzijBB/7bQcjdeN+HFyNKXOsTeCgnHUaGPs++B5lLgc3PqxfP4QlhYpHebDnWfJ4WIy49nzGNGwaUETx0bYHxPWpIZCzAVoPa0rVISb9L6JX2p3SmRe4/QIDAQAB + * 绉侀挜锛歁IICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIP7QQO+ht4EE6nk/RrHyOMRZ3I2MeEYu+Iow2uoB0Bl9gwl2rRu/YtPOKMEH/ttByN1434cXI0pc6xN4KCcdRoY+z74HmUuBzc+rF8/hCWFikd5sOdZ8nhYjLj2fMY0bBpQRPHRtgfE9akhkLMBWg9rStUhJv0volfandKZF7j9AgMBAAECgYAwU4bJ1TDTCJEeq39WGANhyZSkSF3ZO1JIjH6J4/vLw8nlRtMfMGjcYsStRCxlxtVPUbJcEgx9j8kQNW/jv4ZM4mh71kut9WUa1EVdbJyUKgWUl2b5ENAmeKs9VvDwLZ1WDneEeUBa4qWvgwWt8a4DrbXHG91HNmCYD3pAJL9xrQJBALsv6JC5nURFurKMSaMwhMB72OfrhIX5CMJtYYlDWn5kpdB1I6aeXzXcUZc0InYi5Tnd1Z3Kbla8PkPOJ0sFZYcCQQC0f/cpjnKJS4npDV2GHak2X+WaZ/Yc2xfSnPJKxjyw94126JO7QvgUBt+7NVP9CGc00DZh6cpz+0roEOh0Ns5bAkEAsem9MCFbmtJzutSgAN1Sr+iGpxgxI20pqDJybBZ6YnujJljQA8OvVvALFJ3Wy1YrbS6tpIYNDZ9pxuSgcCu27QJAKVLSpzTxi/U7UZu5uaa4wrYZvsvmUJzoS1ObNPtFkc5bGMoOaGTgntUkC5wd6mQuHK0+hhQcQYlakN6uGU0i2QJAXYWeqxU62GBqq+T5KrbYQWUcMFAOmB2fjebJdbZMn3mHcJoxKmSgZeucQV/n3AB9r5Q8zegY3AsMkQAWy9odew== + */ + public static final String priKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIP7QQO+ht4EE6nk/RrHyOMRZ3I2MeEYu+Iow2uoB0Bl9gwl2rRu/YtPOKMEH/ttByN1434cXI0pc6xN4KCcdRoY+z74HmUuBzc+rF8/hCWFikd5sOdZ8nhYjLj2fMY0bBpQRPHRtgfE9akhkLMBWg9rStUhJv0volfandKZF7j9AgMBAAECgYAwU4bJ1TDTCJEeq39WGANhyZSkSF3ZO1JIjH6J4/vLw8nlRtMfMGjcYsStRCxlxtVPUbJcEgx9j8kQNW/jv4ZM4mh71kut9WUa1EVdbJyUKgWUl2b5ENAmeKs9VvDwLZ1WDneEeUBa4qWvgwWt8a4DrbXHG91HNmCYD3pAJL9xrQJBALsv6JC5nURFurKMSaMwhMB72OfrhIX5CMJtYYlDWn5kpdB1I6aeXzXcUZc0InYi5Tnd1Z3Kbla8PkPOJ0sFZYcCQQC0f/cpjnKJS4npDV2GHak2X+WaZ/Yc2xfSnPJKxjyw94126JO7QvgUBt+7NVP9CGc00DZh6cpz+0roEOh0Ns5bAkEAsem9MCFbmtJzutSgAN1Sr+iGpxgxI20pqDJybBZ6YnujJljQA8OvVvALFJ3Wy1YrbS6tpIYNDZ9pxuSgcCu27QJAKVLSpzTxi/U7UZu5uaa4wrYZvsvmUJzoS1ObNPtFkc5bGMoOaGTgntUkC5wd6mQuHK0+hhQcQYlakN6uGU0i2QJAXYWeqxU62GBqq+T5KrbYQWUcMFAOmB2fjebJdbZMn3mHcJoxKmSgZeucQV/n3AB9r5Q8zegY3AsMkQAWy9odew=="; + public static final String pubKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCD+0EDvobeBBOp5P0ax8jjEWdyNjHhGLviKMNrqAdAZfYMJdq0bv2LTzijBB/7bQcjdeN+HFyNKXOsTeCgnHUaGPs++B5lLgc3PqxfP4QlhYpHebDnWfJ4WIy49nzGNGwaUETx0bYHxPWpIZCzAVoPa0rVISb9L6JX2p3SmRe4/QIDAQAB"; + + public static InnerKey generateKey() throws NoSuchAlgorithmException { + return generateKey(1024); + } + + /** + * 鍒濆鍖栧瘑閽� + * <p> + * 宸ヤ綔妯″紡 ECB + * 濉厖鏂瑰紡 NoPadding PKCS1Padding ... + * + * @param keysize 榛樿1024锛涜寖鍥村湪 [512~65536] ,涓旈渶瑕佷负 64 鐨勫�嶆暟 + * @return + * @throws NoSuchAlgorithmException + */ + public static InnerKey generateKey(int keysize) throws NoSuchAlgorithmException { + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM); + keyPairGenerator.initialize(keysize); + KeyPair keyPair = keyPairGenerator.generateKeyPair(); + //RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic(); + //RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate(); + return InnerKey.builder() + .publicKey(keyPair.getPublic().getEncoded()) + .privateKey(keyPair.getPrivate().getEncoded()) + .build(); + } + + private static PublicKey getPublicKey(byte[] key) throws NoSuchAlgorithmException, InvalidKeySpecException { + X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(key); + PublicKey publicKey = KeyFactory.getInstance(ALGORITHM).generatePublic(x509EncodedKeySpec); + return publicKey; + } + + private static PrivateKey getPrivateKey(byte[] key) throws NoSuchAlgorithmException, InvalidKeySpecException { + PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key); + PrivateKey privateKey = KeyFactory.getInstance(ALGORITHM).generatePrivate(pkcs8EncodedKeySpec); + return privateKey; + } + + /** + * 绉侀挜鍔犲瘑 鍏挜瑙e瘑---鍔犲瘑 + * + * @param privateKey + * @param data + * @return + * @throws Exception + */ + public static byte[] encryptByPrivateKey(byte[] privateKey, byte[] data) throws Exception { + return encrypt(true, privateKey, data); + } + + /** + * 绉侀挜鍔犲瘑 鍏挜瑙e瘑---瑙e瘑 + * + * @param publicKey + * @param data + * @return + * @throws Exception + */ + public static byte[] decryptByPublicKey(byte[] publicKey, byte[] data) throws Exception { + return decrypt(false, publicKey, data); + } + + /** + * 鍏挜鍔犲瘑 绉侀挜瑙e瘑---鍔犲瘑 + * + * @param publicKey + * @param data + * @return + * @throws Exception + */ + public static byte[] encryptByPublicKey(byte[] publicKey, byte[] data) throws Exception { + return encrypt(false, publicKey, data); + } + + /** + * 鍏挜鍔犲瘑 绉侀挜瑙e瘑---瑙e瘑 + * + * @param privateKey + * @param data + * @return + * @throws Exception + */ + public static byte[] decryptByPrivateKey(byte[] privateKey, byte[] data) throws Exception { + return decrypt(true, privateKey, data); + } + + private static byte[] encrypt(boolean isPrivate, byte[] key, byte[] data) throws Exception { + Key thisKey = isPrivate ? getPrivateKey(key) : getPublicKey(key); + Cipher cipher = Cipher.getInstance(ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, thisKey); + return cipher.doFinal(data); + } + + private static byte[] decrypt(boolean isPrivate, byte[] key, byte[] data) throws Exception { + Key thisKey = isPrivate ? getPrivateKey(key) : getPublicKey(key); + Cipher cipher = Cipher.getInstance(ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, thisKey); + return cipher.doFinal(data); + } + + /** + * 鐢ㄧ閽ュ淇℃伅鐢熸垚鏁板瓧绛惧悕 + * + * @param privateKey + * @param data + * @return + * @throws Exception + */ + public static byte[] sign(byte[] privateKey, byte[] data) throws Exception { + // + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + signature.initSign(getPrivateKey(privateKey)); + signature.update(data); + return signature.sign(); + } + + /** + * 楠岃瘉绛惧悕 + * + * @param publicKey + * @param data + * @param sign + * @return + * @throws Exception + */ + public static boolean verifySign(byte[] publicKey, byte[] data, byte[] sign) throws Exception { + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + signature.initVerify(getPublicKey(publicKey)); + signature.update(data); + return signature.verify(sign); + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class InnerKey { + private byte[] publicKey; + private byte[] privateKey; + } + + + public static void main(String[] args) throws Exception { + InnerKey innerKey = RsaUtils.generateKey(); + System.out.println("鍏挜锛�" + Base64.encodeBase64String(innerKey.getPublicKey())); + System.out.println("绉侀挜锛�" + Base64.encodeBase64String(innerKey.getPrivateKey())); + +// byte[] data = "浣犲ソ锛屼笘鐣�".getBytes(); +// testEncrypt1(innerKey.getPublicKey(), innerKey.getPrivateKey(), data); +// testEncrypt2(innerKey.getPublicKey(), innerKey.getPrivateKey(), data); +// testSign(innerKey.getPublicKey(), innerKey.getPrivateKey(), data); +// String enStr = SystemUtil.getSystemInfoE(); +// System.out.println("鏈満KEY锛�"+enStr); + //鏇存崲杩欎釜key + String enStr = "XzuxnAmiOFrUXUmBgRNtFChyNHxuXm6EJB1puNfM0IdECae9HOWSarTLZJg5ase0kbtjjv2QhlPOCaNe4NG33/fCvmLiErAIxIdLSPiOmeBu+8mD3J9CRAM4SYqLsQghXji1AFI6JPzE1uF+TTbP1c+R/kJ2uj02chTorWCDVAs="; + + String deStr = new String(decryptByPrivateKey(Base64.decodeBase64(priKey), Base64.decodeBase64(enStr))); + System.out.println("瑙e瘑锛�" + deStr); + //缁勮鎺堟潈瀛楃涓� + JSONObject jsonObject = JSON.parseObject(deStr); + Map<String, String> param = new HashMap<>(); + param.put("cpuSerial", jsonObject.getString("cpuSerial")); + param.put("mainBoardSerial", jsonObject.getString("mainBoardSerial")); + param.put("limitTime", "2124-12-15 23:59:59"); + String authStr = Base64.encodeBase64String(encryptByPrivateKey(Base64.decodeBase64(RsaUtils.priKey), JSON.toJSONString(param).getBytes())); + System.out.println("鎺堟潈瀵嗘枃锛�" + authStr); + System.out.println("娴嬭瘯瀹㈡埛绔В瀵嗭細" + new String(RsaUtils.decryptByPublicKey(Base64.decodeBase64(RsaUtils.pubKey), Base64.decodeBase64(authStr)))); + + + } + + private static void testEncrypt1(byte[] publicKey, byte[] privateKey, byte[] data) throws Exception { + // 绉侀挜鍔犲瘑 鍏挜瑙e瘑---鍔犲瘑 + byte[] encryptBytes = RsaUtils.encryptByPrivateKey(privateKey, data); + System.out.println("绉侀挜鍔犲瘑鍏挜瑙e瘑-瀵嗘枃锛�" + Base64.encodeBase64String(encryptBytes)); + // 绉侀挜鍔犲瘑 鍏挜瑙e瘑---瑙e瘑 + byte[] result = RsaUtils.decryptByPublicKey(publicKey, encryptBytes); + System.out.println("瑙e瘑鍚庯細" + new String(result)); + } + + private static void testEncrypt2(byte[] publicKey, byte[] privateKey, byte[] data) throws Exception { + // 鍏挜鍔犲瘑 绉侀挜瑙e瘑---鍔犲瘑 + byte[] encryptBytes = RsaUtils.encryptByPublicKey(publicKey, data); + System.out.println("鍏挜鍔犲瘑绉侀挜瑙e瘑-瀵嗘枃锛�" + Base64.encodeBase64String(encryptBytes)); + // 鍏挜鍔犲瘑 绉侀挜瑙e瘑---瑙e瘑 + byte[] result = RsaUtils.decryptByPrivateKey(privateKey, encryptBytes); + System.out.println("瑙e瘑鍚庯細" + new String(result)); + } + + private static void testSign(byte[] publicKey, byte[] privateKey, byte[] data) throws Exception { + byte[] sign = RsaUtils.sign(privateKey, data); + System.out.println("绛惧悕锛�" + Base64.encodeBase64String(sign)); + boolean result = RsaUtils.verifySign(publicKey, data, sign); + System.out.println("楠岀缁撴灉锛�" + result); + } + + +} -- Gitblit v1.9.3