¶Ô±ÈÐÂÎļþ |
| | |
| | | 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"; |
| | | /** |
| | | * å
¬é¥ï¼MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCD+0EDvobeBBOp5P0ax8jjEWdyNjHhGLviKMNrqAdAZfYMJdq0bv2LTzijBB/7bQcjdeN+HFyNKXOsTeCgnHUaGPs++B5lLgc3PqxfP4QlhYpHebDnWfJ4WIy49nzGNGwaUETx0bYHxPWpIZCzAVoPa0rVISb9L6JX2p3SmRe4/QIDAQAB |
| | | * ç§é¥ï¼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 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; |
| | | } |
| | | |
| | | /** |
| | | * ç§é¥å å¯ å
¬é¥è§£å¯---å å¯ |
| | | * |
| | | * @param privateKey |
| | | * @param data |
| | | * @return |
| | | * @throws Exception |
| | | */ |
| | | public static byte[] encryptByPrivateKey(byte[] privateKey, byte[] data) throws Exception { |
| | | return encrypt(true, privateKey, data); |
| | | } |
| | | |
| | | /** |
| | | * ç§é¥å å¯ å
¬é¥è§£å¯---è§£å¯ |
| | | * |
| | | * @param publicKey |
| | | * @param data |
| | | * @return |
| | | * @throws Exception |
| | | */ |
| | | public static byte[] decryptByPublicKey(byte[] publicKey, byte[] data) throws Exception { |
| | | return decrypt(false, publicKey, data); |
| | | } |
| | | |
| | | /** |
| | | * å
¬é¥å å¯ ç§é¥è§£å¯---å å¯ |
| | | * |
| | | * @param publicKey |
| | | * @param data |
| | | * @return |
| | | * @throws Exception |
| | | */ |
| | | public static byte[] encryptByPublicKey(byte[] publicKey, byte[] data) throws Exception { |
| | | return encrypt(false, publicKey, data); |
| | | } |
| | | |
| | | /** |
| | | * å
¬é¥å å¯ ç§é¥è§£å¯---è§£å¯ |
| | | * |
| | | * @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("è§£å¯ï¼" + 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 { |
| | | // ç§é¥å å¯ å
¬é¥è§£å¯---å å¯ |
| | | byte[] encryptBytes = RsaUtils.encryptByPrivateKey(privateKey, data); |
| | | System.out.println("ç§é¥å å¯å
¬é¥è§£å¯-坿ï¼" + Base64.encodeBase64String(encryptBytes)); |
| | | // ç§é¥å å¯ å
¬é¥è§£å¯---è§£å¯ |
| | | byte[] result = RsaUtils.decryptByPublicKey(publicKey, encryptBytes); |
| | | System.out.println("è§£å¯åï¼" + new String(result)); |
| | | } |
| | | |
| | | private static void testEncrypt2(byte[] publicKey, byte[] privateKey, byte[] data) throws Exception { |
| | | // å
¬é¥å å¯ ç§é¥è§£å¯---å å¯ |
| | | byte[] encryptBytes = RsaUtils.encryptByPublicKey(publicKey, data); |
| | | System.out.println("å
¬é¥å å¯ç§é¥è§£å¯-坿ï¼" + Base64.encodeBase64String(encryptBytes)); |
| | | // å
¬é¥å å¯ ç§é¥è§£å¯---è§£å¯ |
| | | byte[] result = RsaUtils.decryptByPrivateKey(privateKey, encryptBytes); |
| | | System.out.println("è§£å¯åï¼" + 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); |
| | | } |
| | | |
| | | |
| | | } |