vince
2024-10-14 acca8bb7ea9bb6cec14feb3f8eeb7dc3316ab888
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
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);
    }
 
 
}