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);
|
}
|
|
|
}
|