电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

java RSAUtils 加密工具類操作

瀏覽:3日期:2022-08-26 18:38:45

1.RSA加密算法是一種非對稱加密算法。在公開密鑰加密和電子商業中RSA被廣泛使用。RSA公開密鑰密碼體制。所謂的公開密鑰密碼體制就是使用不同的加密密鑰與解密密鑰,是一種“由已知加密密鑰推導出解密密鑰在計算上是不可行的”密碼體制。在公開密鑰密碼體制中,加密密鑰(即公開密鑰)PK是公開信息,而解密密鑰(即秘密密鑰)SK是需要保密的。加密算法E和解密算法D也都是公開的。雖然解密密鑰SK是由公開密鑰PK決定的,但卻不能根據PK計算出SK。

2.本工具類涉及到BASE64編碼,所以先展示出BASE64Utils:

package com.example.springboottest.common.util; import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;import java.security.MessageDigest; /** * BASE64的加解密 * @author Neo * @date 2018-4-15 22:21:51 * */@SuppressWarnings('restriction')public class Base64Utils { public static final String KEY_SHA = 'SHA'; public static final String KEY_MD5 = 'MD5'; /** * BASE64解密 * * @param key * @return * @throws Exception */ public static byte[] decryptBASE64(String key) throws Exception { return (new BASE64Decoder()).decodeBuffer(key); } /** * BASE64加密 * * @param key * @return * @throws Exception */ public static String encryptBASE64(byte[] key) throws Exception { return (new BASE64Encoder()).encodeBuffer(key); } /** * MD5加密 * * @param data * @return * @throws Exception */ public static byte[] encryptMD5(byte[] data) throws Exception { MessageDigest md5 = MessageDigest.getInstance(KEY_MD5); md5.update(data); return md5.digest(); } /** * SHA加密 * * @param data * @return * @throws Exception */ public static byte[] encryptSHA(byte[] data) throws Exception { MessageDigest sha = MessageDigest.getInstance(KEY_SHA); sha.update(data); return sha.digest(); } }

3.然后我們展示RSAUtils:

package com.example.springboottest.common.util; import javax.crypto.Cipher;import java.security.*;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;import java.util.Map; /** * RSA安全編碼組件 * * @version 1.0 * @desc 公鑰和私鑰存放在properties文件的時候每行的末尾加上“rn” <br/> * “rn” 起到換行的作用,最后的“”在properties在里表示連接 * * @author Neo * @date 2018-4-15 22:23:19 * @since 1.0 */public class RSAUtils extends Base64Utils { public static final String KEY_ALGORITHM = 'RSA'; public static final String SIGNATURE_ALGORITHM = 'MD5withRSA'; private static final String PUBLIC_KEY = 'RSAPublicKey'; private static final String PRIVATE_KEY = 'RSAPrivateKey'; /** * 用私鑰對信息生成數字簽名 * * @param data 加密數據 * @param privateKey 私鑰 * @return * @throws Exception */ public static String sign(String data, String privateKey) throws Exception { return sign(data.getBytes(), privateKey); } /** * 用私鑰對信息生成數字簽名 * * @param data 加密數據 * @param privateKey 私鑰 * @return * @throws Exception */ public static String sign(byte[] data, String privateKey) throws Exception { // 解密由base64編碼的私鑰 byte[] keyBytes = decryptBASE64(privateKey); // 構造PKCS8EncodedKeySpec對象 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); // KEY_ALGORITHM 指定的加密算法 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); // 取私鑰匙對象 PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec); // 用私鑰對信息生成數字簽名 Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initSign(priKey); signature.update(data); return encryptBASE64(signature.sign()); } /** * 校驗數字簽名 * * @param data 加密數據 * @param publicKey 公鑰 * @param sign 數字簽名 * @return 校驗成功返回true 失敗返回false * @throws Exception */ public static boolean verify(String data, String publicKey, String sign) throws Exception { return verify(data.getBytes(), publicKey, sign); } /** * 校驗數字簽名 * * @param data 加密數據 * @param publicKey 公鑰 * @param sign 數字簽名 * @return 校驗成功返回true 失敗返回false * @throws Exception */ public static boolean verify(byte[] data, String publicKey, String sign) throws Exception { // 解密由base64編碼的公鑰 byte[] keyBytes = decryptBASE64(publicKey); // 構造X509EncodedKeySpec對象 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes); // KEY_ALGORITHM 指定的加密算法 KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); // 取公鑰匙對象 PublicKey pubKey = keyFactory.generatePublic(keySpec); Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); signature.initVerify(pubKey); signature.update(data); // 驗證簽名是否正常 return signature.verify(decryptBASE64(sign)); } /** * 解密<br> * 用私鑰解密 * * @param data * @param key * @return * @throws Exception */ public static String decryptByPrivateKey(String data, String key) throws Exception { return new String(decryptByPrivateKey(Base64Utils.decryptBASE64(data), key)); } /** * 解密<br> * 用私鑰解密 * * @param data * @param key * @return * @throws Exception */ public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception { // 對密鑰解密 byte[] keyBytes = decryptBASE64(key); // 取得私鑰 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec); // 對數據解密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, privateKey); return cipher.doFinal(data); } /** * 解密<br> * 用私鑰解密 * * @param data * @param key * @return * @throws Exception */ public static String decryptByPublicKey(String data, String key) throws Exception { return new String(decryptByPublicKey(Base64Utils.decryptBASE64(data), key)); } /** * 解密<br> * 用私鑰解密 * * @param data * @param key * @return * @throws Exception */ public static byte[] decryptByPublicKey(byte[] data, String key) throws Exception { // 對密鑰解密 byte[] keyBytes = decryptBASE64(key); // 取得公鑰 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key publicKey = keyFactory.generatePublic(x509KeySpec); // 對數據解密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, publicKey); return cipher.doFinal(data); } /** * 加密<br> * 用公鑰加密 * * @param data * @param key * @return * @throws Exception */ public static String encryptByPublicKey(String data, String key) throws Exception { return Base64Utils.encryptBASE64(encryptByPublicKey(data.getBytes(), key)); } /** * 加密<br> * 用公鑰加密 * * @param data * @param key * @return * @throws Exception */ public static byte[] encryptByPublicKey(byte[] data, String key) throws Exception { // 對公鑰解密 byte[] keyBytes = decryptBASE64(key); // 取得公鑰 X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key publicKey = keyFactory.generatePublic(x509KeySpec); // 對數據加密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, publicKey); return cipher.doFinal(data); } /** * 加密<br> * 用私鑰加密 * * @param data * @param key * @return * @throws Exception */ public static String encryptByPrivateKey(String data, String key) throws Exception { return Base64Utils.encryptBASE64(encryptByPrivateKey(data.getBytes(), key)); } /** * 加密<br> * 用私鑰加密 * * @param data * @param key * @return * @throws Exception */ public static byte[] encryptByPrivateKey(byte[] data, String key) throws Exception { // 對密鑰解密 byte[] keyBytes = decryptBASE64(key); // 取得私鑰 PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec); // 對數據加密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, privateKey); return cipher.doFinal(data); } /** * 取得私鑰 * * @param keyMap * @return * @throws Exception */ public static String getPrivateKey(Map<String, Object> keyMap) throws Exception { Key key = (Key) keyMap.get(PRIVATE_KEY); return encryptBASE64(key.getEncoded()); } /** * 取得公鑰 * * @param keyMap * @return * @throws Exception */ public static String getPublicKey(Map<String, Object> keyMap) throws Exception { Key key = (Key) keyMap.get(PUBLIC_KEY); return encryptBASE64(key.getEncoded()); } /** * 初始化密鑰 * * @return * @throws Exception */ public static Map<String, Object> initKey() throws Exception { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); keyPairGen.initialize(1024); KeyPair keyPair = keyPairGen.generateKeyPair(); // 公鑰 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 私鑰 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); Map<String, Object> keyMap = new HashMap<String, Object>(2); keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); return keyMap; } public static void main(String[] args) { try { Map<String, Object> map = RSAUtils.initKey(); String publicKey = RSAUtils.getPublicKey(map); String privateKey = RSAUtils.getPrivateKey(map); System.out.println('公鑰:' + publicKey); System.out.println('私鑰:' + privateKey); String data = 'Java是世界上最好的編程語言'; String encryptData = RSAUtils.encryptByPublicKey(data, publicKey); System.out.println('加密后:' + encryptData); String decryptData = RSAUtils.decryptByPrivateKey(encryptData, privateKey); System.out.println('解密后:' + decryptData); } catch (Exception e) { e.printStackTrace(); } }}

4.最后展示測試結果:

java RSAUtils 加密工具類操作

補充知識:java使用RSA生成公鑰和私鑰,并進行加解密

廢話不多說,上代碼:

import javax.crypto.Cipher;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder; import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.SecureRandom;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;import java.util.Map; /** * Java RSA 加密工具類 */public class RSAUtils { /** * 密鑰長度 于原文長度對應 以及越長速度越慢 */ private final static int KEY_SIZE = 1024; /** * 用于封裝隨機產生的公鑰與私鑰 */ private static Map<Integer, String> keyMap = new HashMap<Integer, String>(); /** * 隨機生成密鑰對 * @throws Exception */ public static void genKeyPair() throws Exception { // KeyPairGenerator類用于生成公鑰和私鑰對,基于RSA算法生成對象 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance('RSA'); // 初始化密鑰對生成器 keyPairGen.initialize(KEY_SIZE, new SecureRandom()); // 生成一個密鑰對,保存在keyPair中 KeyPair keyPair = keyPairGen.generateKeyPair(); // 得到私鑰 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // 得到公鑰 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); String publicKeyString = encryptBASE64(publicKey.getEncoded()); // 得到私鑰字符串 String privateKeyString = encryptBASE64(privateKey.getEncoded()); // 將公鑰和私鑰保存到Map //0表示公鑰 keyMap.put(0, publicKeyString); //1表示私鑰 keyMap.put(1, privateKeyString); } //編碼返回字符串 public static String encryptBASE64(byte[] key) throws Exception { return (new BASE64Encoder()).encodeBuffer(key); } //解碼返回byte public static byte[] decryptBASE64(String key) throws Exception { return (new BASE64Decoder()).decodeBuffer(key); } /** * RSA公鑰加密 * * @param str 加密字符串 * @param publicKey 公鑰 * @return 密文 * @throws Exception 加密過程中的異常信息 */ public static String encrypt(String str, String publicKey) throws Exception { //base64編碼的公鑰 byte[] decoded = decryptBASE64(publicKey); RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance('RSA').generatePublic(new X509EncodedKeySpec(decoded)); //RSA加密 Cipher cipher = Cipher.getInstance('RSA'); cipher.init(Cipher.ENCRYPT_MODE, pubKey); String outStr = encryptBASE64(cipher.doFinal(str.getBytes('UTF-8'))); return outStr; } /** * RSA私鑰解密 * * @param str 加密字符串 * @param privateKey 私鑰 * @return 明文 * @throws Exception 解密過程中的異常信息 */ public static String decrypt(String str, String privateKey) throws Exception { //64位解碼加密后的字符串 byte[] inputByte = decryptBASE64(str); //base64編碼的私鑰 byte[] decoded = decryptBASE64(privateKey); RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance('RSA').generatePrivate(new PKCS8EncodedKeySpec(decoded)); //RSA解密 Cipher cipher = Cipher.getInstance('RSA'); cipher.init(Cipher.DECRYPT_MODE, priKey); String outStr = new String(cipher.doFinal(inputByte)); return outStr; } public static void main(String[] args) throws Exception { long temp = System.currentTimeMillis(); //生成公鑰和私鑰 genKeyPair(); //加密字符串 System.out.println('公鑰:' + keyMap.get(0)); System.out.println('私鑰:' + keyMap.get(1)); System.out.println('生成密鑰消耗時間:' + (System.currentTimeMillis() - temp) / 1000.0 + '秒'); String message = 'RSA測試aaa'; System.out.println('原文:' + message); temp = System.currentTimeMillis(); String messageEn = encrypt(message, keyMap.get(0)); System.out.println('密文:' + messageEn); System.out.println('加密消耗時間:' + (System.currentTimeMillis() - temp) / 1000.0 + '秒'); temp = System.currentTimeMillis(); String messageDe = decrypt(messageEn, keyMap.get(1)); System.out.println('解密:' + messageDe); System.out.println('解密消耗時間:' + (System.currentTimeMillis() - temp) / 1000.0 + '秒'); }}

以上這篇java RSAUtils 加密工具類操作就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 光环国际-新三板公司_股票代码:838504 | 防水试验机_防水测试设备_防水试验装置_淋雨试验箱-广州岳信试验设备有限公司 | 氟氨基酮、氯硝柳胺、2-氟苯甲酸、异香兰素-新晨化工 | 山东信蓝建设有限公司官网 | 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | 无机纤维喷涂棉-喷涂棉施工工程-山东华泉建筑工程有限公司▲ | 森旺-A级防火板_石英纤维板_不燃抗菌板装饰板_医疗板 | 高温高压釜(氢化反应釜)百科| 焦作网 WWW.JZRB.COM| 电缆隧道在线监测-智慧配电站房-升压站在线监测-江苏久创电气科技有限公司 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 合肥钣金加工-安徽激光切割加工-机箱机柜加工厂家-合肥通快 | 知企服务-企业综合服务(ZiKeys.com)-品优低价、种类齐全、过程管理透明、速度快捷高效、放心服务,知企专家! | 健康管理师报考条件,考试时间,报名入口—首页 | 电车线(用于供电给电车的输电线路)-百科 | 高压互感器,电流互感器,电压互感器-上海鄂互电气科技有限公司 | 九州网址_专注于提供网址大全分享推广中文网站导航服务 | 北京工业设计公司-产品外观设计-产品设计公司-千策良品工业设计 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | 便民信息网_家电维修,家电清洗,开锁换锁,本地家政公司 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 智能家居全屋智能系统多少钱一套-小米全套价格、装修方案 | 湖南印刷厂|长沙印刷公司|画册印刷|挂历印刷|台历印刷|杂志印刷-乐成印刷 | 岩棉板|岩棉复合板|聚氨酯夹芯板|岩棉夹芯板|彩钢夹芯板-江苏恒海钢结构 | 合肥白癜风医院_[治疗白癜风]哪家好_合肥北大白癜风医院 | 南京技嘉环保科技有限公司-杀菌除臭剂|污水|垃圾|厕所|橡胶厂|化工厂|铸造厂除臭剂 | 不锈钢/气体/液体玻璃转子流量计(防腐,选型,规格)-常州天晟热工仪表有限公司【官网】 | 板材品牌-中国胶合板行业十大品牌-环保板材-上海声达板材 | 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 合肥白癜风医院_[治疗白癜风]哪家好_合肥北大白癜风医院 | 开云(中国)Kaiyun·官方网站 - 登录入口| 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | 焊接减速机箱体,减速机箱体加工-淄博博山泽坤机械厂 | 地埋式垃圾站厂家【佳星环保】小区压缩垃圾中转站转运站 | 送料机_高速冲床送料机_NC伺服滚轮送料机厂家-东莞市久谐自动化设备有限公司 | 废旧物资回收公司_广州废旧设备回收_报废设备物资回收-益美工厂设备回收公司 | 超声波焊接机,振动摩擦焊接机,激光塑料焊接机,超声波焊接模具工装-德召尼克(常州)焊接科技有限公司 | 石家庄装修设计_室内家装设计_别墅装饰装修公司-石家庄金舍装饰官网 | 石家庄救护车出租_重症转院_跨省跨境医疗转送_活动赛事医疗保障_康复出院_放弃治疗_腾康26年医疗护送转诊团队 | 楼承板设备-楼承板成型机-免浇筑楼承板机器厂家-捡来 | 风淋室生产厂家报价_传递窗|送风口|臭氧机|FFU-山东盛之源净化设备 |