RSA工具类/** * @author: Longer * @date: 2020/8/23 * @description: RSA工具类 */public class RSAUtil {/*** 定义加密方式*/private final static String KEY_RSA = "RSA";/*** 定义签名算法*/private final static String KEY_RSA_SIGNATURE = "MD5withRSA";/*** 定义公钥算法*/private final static String KEY_RSA_PUBLICKEY = "RSAPublicKey";/*** 定义私钥算法*/private final static String KEY_RSA_PRIVATEKEY = "RSAPrivateKey";static {Security.addProvider(new BouncyCastleProvider());}/*** 初始化密钥*/public static Map<String, Object> init() {Map<String, Object> map = null;try {KeyPairGenerator generator = KeyPairGenerator.getInstance(KEY_RSA);generator.initialize(2048);KeyPair keyPair = generator.generateKeyPair();// 公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();// 私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();// 将密钥封装为mapmap = new HashMap<>();map.put(KEY_RSA_PUBLICKEY, publicKey);map.put(KEY_RSA_PRIVATEKEY, privateKey);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return map;}/*** 公钥加密** @param data 待加密数据* @param key公钥*/public static byte[] encryptByPublicKey(String data, String key) {byte[] result = null;try {byte[] bytes = decryptBase64(key);// 取得公钥X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);KeyFactory factory = KeyFactory.getInstance(KEY_RSA);PublicKey publicKey = factory.generatePublic(keySpec);// 对数据加密Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] encode = cipher.doFinal(data.getBytes());// 再进行Base64加密result = Base64.encode(encode);} catch (Exception e) {e.printStackTrace();}return result;}/*** 私钥解密** @param data 加密数据* @param key私钥*/public static String decryptByPrivateKey(byte[] data, String key) {String result = null;try {// 对私钥解密byte[] bytes = decryptBase64(key);// 取得私钥PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);KeyFactory factory = KeyFactory.getInstance(KEY_RSA);PrivateKey privateKey = factory.generatePrivate(keySpec);// 对数据解密Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");cipher.init(Cipher.DECRYPT_MODE, privateKey);// 先Base64解密byte[] decoded = Base64.decode(data);result = new String(cipher.doFinal(decoded));} catch (Exception e) {e.printStackTrace();}return result;}/*** 获取公钥*/public static String getPublicKey(Map<String, Object> map) {String str = "";try {Key key = (Key) map.get(KEY_RSA_PUBLICKEY);str = encryptBase64(key.getEncoded());} catch (Exception e) {e.printStackTrace();}return str;}/*** 获取私钥*/public static String getPrivateKey(Map<String, Object> map) {String str = "";try {Key key = (Key) map.get(KEY_RSA_PRIVATEKEY);str = encryptBase64(key.getEncoded());} catch (Exception e) {e.printStackTrace();}return str;}/*** 用私钥对信息生成数字签名** @param data加密数据* @param privateKey 私钥*/public static String sign(byte[] data, String privateKey) {String str = "";try {// 解密由base64编码的私钥byte[] bytes = decryptBase64(privateKey);// 构造PKCS8EncodedKeySpec对象PKCS8EncodedKeySpec pkcs = new PKCS8EncodedKeySpec(bytes);// 指定的加密算法KeyFactory factory = KeyFactory.getInstance(KEY_RSA);// 取私钥对象PrivateKey key = factory.generatePrivate(pkcs);// 用私钥对信息生成数字签名Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE);signature.initSign(key);signature.update(data);str = encryptBase64(signature.sign());} catch (Exception e) {e.printStackTrace();}return str;}/*** 校验数字签名** @param data加密数据* @param publicKey 公钥* @param sign数字签名* @return 校验成功返回true,失败返回false*/public static boolean verify(byte[] data, String publicKey, String sign) {boolean flag = false;try {// 解密由base64编码的公钥byte[] bytes = decryptBase64(publicKey);// 构造X509EncodedKeySpec对象X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);// 指定的加密算法KeyFactory factory = KeyFactory.getInstance(KEY_RSA);// 取公钥对象PublicKey key = factory.generatePublic(keySpec);// 用公钥验证数字签名Signature signature = Signature.getInstance(KEY_RSA_SIGNATURE);signature.initVerify(key);signature.update(data);flag = signature.verify(decryptBase64(sign));} catch (Exception e) {e.printStackTrace();}return flag;}/*** BASE64 解密** @param key 需要解密的字符串* @return 字节数组*/public static byte[] decryptBase64(String key) throws Exception {return Base64.decode(key);}/*** BASE64 加密** @param key 需要加密的字节数组* @return 字符串*/public static String encryptBase64(byte[] key) throws Exception {return new String(Base64.encode(key));}/*** 按照红黑树(Red-Black tree)的 NavigableMap 实现* 按照字母大小排序*/public static Map<String, Object> sort(Map<String, Object> map) {if (map == null) {return null;}Map<String, Object> result = new TreeMap<>((Comparator<String>) (o1, o2) -> {return o1.compareTo(o2);});result.putAll(map);return result;}/*** 组合参数** @param map* @return 如:key1Value1Key2Value2....*/public static String groupStringParam(Map<String, Object> map) {if (map == null) {return null;}StringBuffer sb = new StringBuffer();for (Map.Entry<String, Object> item : map.entrySet()) {if (item.getValue() != null) {sb.append(item.getKey());if (item.getValue() instanceof List) {sb.append(JSON.toJSONString(item.getValue()));} else {sb.append(item.getValue());}}}return sb.toString();}/*** bean转map* @param obj* @return*/public static Map<String, Object> bean2Map(Object obj) {if (obj == null) {return null;}Map<String, Object> map = new HashMap<>();try {BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();for (PropertyDescriptor property : propertyDescriptors) {String key = property.getName();// 过滤class属性if (!key.equals("class")) {// 得到property对应的getter方法Method getter = property.getReadMethod();Object value = https://www.isolves.com/it/cxkf/sf/2021-07-04/getter.invoke(obj);if (StringUtils.isEmpty(value)) {continue;}map.put(key, value);}}} catch (Exception e) {e.printStackTrace();}return map;}/*** 按照红黑树(Red-Black tree)的 NavigableMap 实现* 按照字母大小排序*/public static Map
推荐阅读
- 电脑微信如何实现多开?
- 高校|1076万“打工人”即将进职场,如何实现就业?这个方向值得考虑
- 华为S5700设置acl,实现vlan三层隔离,让你小白变大神,转发收藏
- 百度C++工程师如何实现极致并发优化
- 教程 在浏览器中实现IPFS连接的指引
- Vue中使用v-viewer组件实现图片预览功能,支持Vue3
- jenkins+Acunetix实现自动化安全测试
- mac如何安装sz,rz,实现本地和服务器文件传输「开发效率工具」
- 一文看懂智慧城市建设,AI算法如何实现赋能?
- django 编写数据接口
