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); } /** * 初始化密钥 *

* 工作模式 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 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); } }