vince
2024-03-28 f232d52357658e0b1a7689c2cdf0e7105b9e1d5e
初始提交
已添加1个文件
231 ■■■■■ 文件已修改
pms-core/src/main/java/com/fzzy/utils/RsaUtils.java 231 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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";
    /**
     * å…¬é’¥ï¼š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);
    }
}