亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java-web中利用RSA進行加密解密操作的方法示例

2024-07-14 08:41:58
字體:
來源:轉載
供稿:網友

前言

最近在看,網絡安全方面的問題,我們可以使用RSA進行非對稱加密防止,獲取用戶信息。首先我們看下java下操作RSA進行加密解密算法,代碼如下:

package com.jb.test; import java.security.InvalidKeyException;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.NoSuchAlgorithmException;import java.security.PrivateKey;import java.security.PublicKey;import java.security.SecureRandom; import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException; import org.apache.commons.codec.binary.Hex; public class RSAEntry {  /** * @Title: main * @Description: RSA加密算法,解密算法 * @param args * void * @throws NoSuchAlgorithmException  * @throws NoSuchPaddingException  * @throws InvalidKeyException  * @throws BadPaddingException  * @throws IllegalBlockSizeException  *  * @throws */ public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {// Security.getProviders();//獲取所有支持的加密算法 //采用非對稱加密解密算法 //生成密鑰實例 KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA"); SecureRandom random = new SecureRandom(); random.setSeed(System.currentTimeMillis());//設置隨機種子 keygen.initialize(512, random);//設置密鑰長度,應為64的整數倍 //生成密鑰公鑰對 KeyPair keyPair = keygen.generateKeyPair(); //獲取公鑰 PublicKey pubkey = keyPair.getPublic(); //獲取私鑰 PrivateKey prikey = keyPair.getPrivate(); //測試數據 String data = "測試數據"; //使用公鑰進行加密 //構建加密解密類 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pubkey);//設置為加密模式 byte[] jmdata = cipher.doFinal(data.getBytes()); //打印加密后數據 System.out.println(new String(Hex.encodeHex(jmdata))); //改為解密模式進行解密 cipher.init(Cipher.DECRYPT_MODE, prikey);//會用私鑰解密 jmdata = cipher.doFinal(jmdata); System.out.println(new String(jmdata));  }}

在web應用中,我們可以通過js進行前端加密,java進行后臺解密,已達到我們的目的。這里需要注意的是,要想實現正確的加密解密算法,需要使用bcprov-ext-jdk15on-147.jar。

首先創建系統的密鑰提供者:

package com.jb.test; import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.SecureRandom; import org.apache.commons.codec.binary.Hex;import org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPublicKey;import org.bouncycastle.jce.provider.BouncyCastleProvider; /** * RSA初始化類 * @author nmm * 結合前臺的js使用的話,主要需要指定密鑰提供者,即引入bcprov-ext-jdk15on-147.jar并使用其中的提供者 */public class RsaInitUtil {  private static KeyPair keyPair;  private static RsaInitUtil util;  private RsaInitUtil(){ try { if(keyPair == null) { //如果想要能夠解密js的加密文件,使用此提供者是必須的 KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA", new BouncyCastleProvider()); SecureRandom random = new SecureRandom(); random.setSeed(System.currentTimeMillis()); keygen.initialize(512, random);//設置512位長度 keyPair = keygen.generateKeyPair(); } } catch (Exception e) { e.printStackTrace(); } }  public static RsaInitUtil getInstance(){ synchronized ("rsa") { if(util == null) { util = new RsaInitUtil(); } } return util; }  /** *  * 功能說明:[獲取公鑰] * @return * 創建者:Nmm, Aug 19, 2013 */ public PublicKey getPublicKey(){ return keyPair.getPublic(); }  public PrivateKey getPrivateKey(){ return keyPair.getPrivate(); }  /** *  * 功能說明:[獲取公鑰字符串] * @return * 創建者:Nmm, Aug 19, 2013 */ public String getPublicKeyStr(){ //根據我們的提供者,這里獲取的是該類型公鑰 BCRSAPublicKey pk = (BCRSAPublicKey) getPublicKey(); String str = new String(Hex.encodeHex(pk.getModulus().toByteArray())); System.out.println(str); //獲取入口10001一般都為這個 String ss = new String(Hex.encodeHex(pk.getPublicExponent().toByteArray())); //獲取轉換字符串 System.out.println(b2Hex(pk.getModulus().toByteArray())); return ss + str; } /** *  * 功能說明:[手動轉換] * @param byteArray * @return * 創建者:Nmm, Aug 19, 2013 */ private String b2Hex(byte[] byteArray) { StringBuilder sb = new StringBuilder(); for(int i = 0; i < byteArray.length; i++ ) { int zhz = byteArray[i]; if(zhz < 0) { zhz += 256; } if(zhz < 16) { sb.append("0"); } sb.append(Integer.toHexString(zhz)); } return sb.toString(); }}

前臺引入RSA.js,BigInt.js和Barrett.js并采用如下方法加密:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@page import="com.jb.test.RsaInitUtil"%><%  RsaInitUtil rsa = RsaInitUtil.getInstance(); String my = rsa.getPublicKeyStr(); String exp = my.substring(0,6); String mou = my.substring(6);%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html> <head> <title>RSA測試</title> <script type="text/javascript" src="RSA.js"></script> <script type="text/javascript" src="BigInt.js"></script> <script type="text/javascript" src="Barrett.js"></script> </head>  <body> </body></html><script type="text/javascript">  var m = '<%=mou%>'; var e = '<%=exp%>';  var key = ''; setMaxDigits(128); alert(e); key = new RSAKeyPair(e,'',m); var res = encryptedString(key,encodeURIComponent('測試數據'));  window.location.href = 'rsaDecTry.do?res=' + res; </script>

后臺解密算法為:

package com.jb.test; import java.net.URLDecoder;import java.security.NoSuchAlgorithmException; import javax.crypto.Cipher;import javax.crypto.NoSuchPaddingException; import org.apache.commons.codec.binary.Hex;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping; /** * Rsa加密的控制層 * @author nmm * */@Controller("rsaController")public class RsaController {  private RsaInitUtil rsaUtil = RsaInitUtil.getInstance();  /** *  * 功能說明:[解密方法] * @param res * 創建者:Nmm, Aug 19, 2013 * @throws NoSuchPaddingException  * @throws NoSuchAlgorithmException  */ @RequestMapping("rsaDecTry.do") public void decodeTry(String res) throws Exception { Cipher cipher = Cipher.getInstance("RSA",new BouncyCastleProvider());//必須指定此提供者 cipher.init(Cipher.DECRYPT_MODE, rsaUtil.getPrivateKey()); System.out.println(res); byte[] buff = cipher.doFinal(Hex.decodeHex(res.toCharArray())); //將字符串轉為字符 StringBuilder sb = new StringBuilder(new String(buff,"UTF-8")); //解密后的內容是倒敘的 sb.reverse(); //進行URL解密,主要是為了中文亂碼問題 String result = URLDecoder.decode(sb.toString(), "UTF-8"); System.out.println(result);  }}

至此可完成,整個加密解密過程,下面大家可以把rsa相關的內容全部整合到一個工具類中,不用想這里處理。

下面為RSA加密解密工具類:

package com.jb.framework.filter; import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.math.BigInteger;import java.net.URLDecoder;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.NoSuchAlgorithmException;import java.security.PrivateKey;import java.security.PublicKey;import java.security.SecureRandom;import java.security.spec.RSAPrivateKeySpec;import java.security.spec.RSAPublicKeySpec;import java.util.Calendar; import javax.crypto.Cipher; import org.apache.commons.codec.binary.Hex;import org.bouncycastle.jcajce.provider.asymmetric.rsa.BCRSAPublicKey;import org.bouncycastle.jce.provider.BouncyCastleProvider; /** *  * @Package: com.jb.framework.filter<br> * @ClassName: RSAUtil<br> * @Description: RSA加密工具類,這里我們是每次系統啟動時聲稱一套公鑰,私鑰,因此不能將加密串存入數據庫中,如果要這么做可以預先生成密鑰隊寫入到文件中<br> */public class RSAUtil {  private RSAUtil(){}  public static final String keyPubFile = "rsaPubKey.bin"; public static final String keyPriFile = "rsaPriKey.bin";  private static RSAUtil rsa; //密鑰生成器 private PublicKey publicKey; //密鑰隊 private PrivateKey privateKey;    public static RSAUtil getInstance(){ synchronized ("rsa") { if(rsa == null) { rsa = new RSAUtil(); rsa.init(); } } return rsa; } /** *  * @Title: init * @Description: 初始化方法 * void * @throws */ private void init() { //構建RSA算法 try { KeyPairGenerator kengen = KeyPairGenerator.getInstance("RSA",new BouncyCastleProvider()); //構建隨機種子 SecureRandom random = new SecureRandom(); random.setSeed(Calendar.getInstance().getTimeInMillis()); kengen.initialize(512, random);//采用512位加密 KeyPair keyPair = kengen.generateKeyPair(); publicKey = keyPair.getPublic(); privateKey = keyPair.getPrivate(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } /** *  * @Title: getPublicKey * @Description: 獲取公鑰 * @return * PublicKey * @throws */ public PublicKey getPublicKey(){ return this.publicKey; } /** *  * @Title: getPrivateKey * @Description: 獲取私鑰 * @return * PrivateKey * @throws */ public PrivateKey getPrivateKey(){ return this.privateKey; } /** *  * @Title: getPublicKeyStr * @Description: 獲取系統公鑰字符串,前6位為exponentk,后面為modlus * @return * String * @throws */ public String getPublicKeyStr(){ BCRSAPublicKey pk = (BCRSAPublicKey) getPublicKey(); String pubStr = ""; pubStr += b2hex(pk.getPublicExponent().toByteArray()); pubStr += b2hex(pk.getModulus().toByteArray()); return pubStr; } /** *  * @Title: entryText * @Description: 使用默認公鑰進行加密 * @param text * @return * String * @throws */ public String encryText(String text) { return encryText(text,getPublicKey()); } /** *  * @Title: entryText * @Description: 使用指定公鑰進行加密,解決長字符串加密 * @param text * @param publicKey2 * @return * String * @throws */ public String encryText(String text, PublicKey pk) { try { Cipher cipher = Cipher.getInstance("RSA",new BouncyCastleProvider()); cipher.init(Cipher.ENCRYPT_MODE, pk); int block = cipher.getBlockSize();//獲取最大加密塊 int j = 0; StringBuilder sb = new StringBuilder(); byte[] targetData = text.getBytes("UTF-8"); while (targetData.length - j*block > 0) { byte[] jmdata = cipher.doFinal(targetData,j*block,Math.min(targetData.length - j*block, block)); sb.append(b2hex(jmdata)); j++; } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return null; } /** *  * @Title: decryText * @Description: 使用默認的私鑰進行解密解密算法 * @param text * @return * String * @throws */ public String decryText(String text) { return decryText(text,getPrivateKey()); } /** *  * @Title: decryText * @Description: 指定私鑰進行解密,增加對于大字符串的解密操作 * @param text * @param privateKey2 * @return * String * @throws */ public String decryText(String text, PrivateKey pk) { try { Cipher cipher = Cipher.getInstance("RSA", new BouncyCastleProvider()); cipher.init(Cipher.DECRYPT_MODE, pk); byte[] targetBuff = Hex.decodeHex(text.replace(" ", "").toCharArray()); int block = cipher.getBlockSize(); int j = 0; StringBuilder sb = new StringBuilder(); while (targetBuff.length - j * block > 0) { byte[] jmdata = cipher.doFinal(targetBuff,j*block,block); sb.append(new String(jmdata,"UTF-8")); j++; } return sb.toString();  } catch (Exception e) { e.printStackTrace(); } return null; } /** *  * @Title: decryTextByUrl * @Description: 解密前臺傳遞的加密串,為防止中文亂碼,前臺字符串最好使用encodeURIComponent方法進行url編碼 * @param text * @return * String * @throws */ public String decryTextByUrl(String text) { try { Cipher cipher = Cipher.getInstance("RSA", new BouncyCastleProvider()); cipher.init(Cipher.DECRYPT_MODE, getPrivateKey()); byte[] targetBuff = Hex.decodeHex(text.replace(" ", "").toCharArray()); int block = cipher.getBlockSize(); int j = 0; StringBuilder sb = new StringBuilder(); while (targetBuff.length - j * block > 0) {//處理大字符串的加密解密處理 byte[] jmdata = cipher.doFinal(targetBuff,j*block,block); sb.append(new StringBuilder(new String(jmdata,"UTF-8")).reverse()); j++; } String res = URLDecoder.decode(sb.toString(), "UTF-8"); return res;  } catch (Exception e) { e.printStackTrace(); } return null; } /** *  * @Title: createPubKey * @Description: 根據指定的冪和模式生成公鑰 * @param exponent * @param modules * @return * PublicKey * @throws */ public PublicKey createPubKey(byte[] exponent,byte[]modules) { try { KeyFactory keyFactory = KeyFactory.getInstance("RSA", new BouncyCastleProvider()); RSAPublicKeySpec rsaKs = new RSAPublicKeySpec(new BigInteger(modules),new BigInteger(exponent)); return keyFactory.generatePublic(rsaKs);  } catch (Exception e) { e.printStackTrace(); }  return null; } /** *  * @Title: createPubKey * @Description: 根據指定的冪和模式生成公鑰 * @param exponent * @param modules * @return * PublicKey * @throws */ public PrivateKey createPriKey(byte[] exponent,byte[]modules) { try { KeyFactory keyFactory = KeyFactory.getInstance("RSA", new BouncyCastleProvider()); RSAPrivateKeySpec rsaKs = new RSAPrivateKeySpec(new BigInteger(modules),new BigInteger(exponent)); return keyFactory.generatePrivate(rsaKs);  } catch (Exception e) { e.printStackTrace(); } return null; } /** *  * @Title: saveKeyToFile * @Description: 保存公鑰和私鑰到文件中 * void * @throws */ public void saveKeyToFile() { PublicKey pk = getPublicKey(); PrivateKey prik = getPrivateKey();  String path = RSAUtil.class.getClassLoader().getResource("").getPath(); ObjectOutputStream outPub = null; ObjectOutputStream outPri = null; try { System.out.println(path + keyPubFile); outPub = new ObjectOutputStream(new FileOutputStream(path + keyPubFile)); outPri = new ObjectOutputStream(new FileOutputStream(path + keyPriFile)); outPub.writeObject(pk); outPri.writeObject(prik); } catch (Exception e) { e.printStackTrace(); }finally { try { outPub.close(); outPri.close(); } catch (IOException e) { e.printStackTrace(); }  } } /** *  * @Title: readKey * @Description: 讀取密鑰 * @param isPub * @return * Object * @throws */ public Object readKey(boolean isPub) { String path = RSAUtil.class.getClassLoader().getResource("").getPath(); ObjectInputStream in = null; try { if(isPub) { path += keyPubFile; in = new ObjectInputStream(new FileInputStream(path)); PublicKey pk = (PublicKey) in.readObject(); return pk; }else { path += keyPriFile; in = new ObjectInputStream(new FileInputStream(path)); PrivateKey pk = (PrivateKey) in.readObject(); return pk; } } catch (Exception e) { e.printStackTrace(); }finally { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } return null; }   /** *  * @Title: b2hex * @Description: 將二進制轉為16進制字符串 * @param buff * @return * String * @throws */ public String b2hex(byte[] buff) { StringBuilder sb = new StringBuilder(); for(int i = 0; i < buff.length; i++) { int z = buff[i]; if(z < 0) { z+= 256; } if(z < 16) { sb.append("0"); } sb.append(Integer.toHexString(z)); } return sb.toString(); }}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精品人久久电影| 久久久亚洲天堂| 日韩在线视频一区| 精品视频中文字幕| 最近2019中文字幕一页二页| 久久综合国产精品台湾中文娱乐网| 亚洲色图欧美制服丝袜另类第一页| 亚洲第一福利视频| 欧美性色视频在线| 成人h视频在线观看播放| 在线观看国产精品91| 国产精品入口免费视频一| 国产日韩亚洲欧美| 中文字幕亚洲无线码在线一区| 久久97久久97精品免视看| 日韩中文字幕欧美| 亚洲日韩中文字幕在线播放| 日韩亚洲欧美成人| 中文字幕日韩av电影| 国产性猛交xxxx免费看久久| 亚洲成人黄色网址| 欧美大片免费观看| 91精品视频观看| 成人午夜激情免费视频| 高跟丝袜欧美一区| 美女视频黄免费的亚洲男人天堂| 欧美孕妇孕交黑巨大网站| 成人春色激情网| 91av视频在线观看| 国产91在线播放精品91| 国产精品久久久久影院日本| 久久精品久久久久久国产 免费| 这里只有精品视频在线| 亚洲成人精品久久久| 国产精品综合网站| 久久91亚洲人成电影网站| 国产一区二区三区网站| 日本精品免费一区二区三区| 亚洲精品国产拍免费91在线| 欧美激情一二三| 欧美在线播放视频| 欧美性极品少妇精品网站| 亚洲国产91精品在线观看| 欧美一级电影免费在线观看| 国产999在线| 九九热这里只有精品6| 国产午夜精品视频| 欧美猛交ⅹxxx乱大交视频| 欧美激情久久久| 成人午夜在线视频一区| 久久香蕉国产线看观看av| 91亚洲午夜在线| 欧美成人在线免费视频| 国产精品吊钟奶在线| 欧美日韩美女在线观看| 欧美特黄级在线| 欧美另类极品videosbestfree| 美女撒尿一区二区三区| 久久久久免费精品国产| 国产一区二区av| 欧美激情三级免费| 亚洲欧美第一页| 欧洲中文字幕国产精品| 久久久av电影| 中文字幕在线日韩| 亚洲精品一区在线观看香蕉| 国产色婷婷国产综合在线理论片a| 成人深夜直播免费观看| 一本色道久久综合亚洲精品小说| 国产精品狼人色视频一区| 91人成网站www| 国产精品久久久91| 国产精品视频导航| 精品国产一区av| 亚洲第一精品夜夜躁人人爽| 成人福利网站在线观看| 久久人人看视频| 久久亚洲国产成人| 欧美日本黄视频| 久久久国产91| 精品亚洲一区二区三区在线观看| 日韩在线观看高清| 亚洲欧美一区二区三区久久| 久久精品国产91精品亚洲| 最近2019年中文视频免费在线观看| 91在线精品视频| 久久精品99国产精品酒店日本| 国产一区二区三区高清在线观看| zzijzzij亚洲日本成熟少妇| 成人淫片在线看| 日本午夜精品理论片a级appf发布| 欧洲亚洲在线视频| 日韩在线免费视频| 久久久97精品| 欧美日韩国产精品专区| 麻豆乱码国产一区二区三区| 欧美日韩免费区域视频在线观看| 亚洲自拍偷拍区| 亚洲精品小视频在线观看| 日韩成人av在线| 中文字幕亚洲第一| 亚洲精品色婷婷福利天堂| 国产日韩精品电影| 成人久久一区二区三区| 日韩高清av一区二区三区| 日韩成人在线免费观看| 欧美性生交xxxxx久久久| 免费成人高清视频| 日韩精品高清在线观看| 97精品视频在线| 97超级碰碰人国产在线观看| 精品视频在线播放色网色视频| 国产在线观看不卡| 91免费看国产| 国产欧美一区二区三区四区| 亚洲久久久久久久久久久| 国产精品视频中文字幕91| 超碰精品一区二区三区乱码| 日韩av在线不卡| 91极品视频在线| 亚洲精品福利视频| 黑人精品xxx一区| 亚洲一区二区少妇| 国产精品久久久久久av下载红粉| 亚洲美女福利视频网站| 国产午夜一区二区| 久久99视频精品| 欧美另类老女人| 中文字幕精品久久| 精品视频中文字幕| 欧美国产日韩一区二区在线观看| 亚洲天堂男人的天堂| 久久露脸国产精品| 日韩亚洲精品视频| 5252色成人免费视频| 亚洲午夜精品久久久久久久久久久久| 国内精品久久久久久影视8| 韩国福利视频一区| 午夜精品国产精品大乳美女| 亚洲第一区第二区| 久久久免费高清电视剧观看| www.亚洲男人天堂| 久久精品99国产精品酒店日本| 97久久精品视频| 成人福利视频在线观看| 国产欧美精品一区二区三区介绍| 亚洲欧美日韩另类| 91精品久久久久久久久久另类| 大荫蒂欧美视频另类xxxx| 日韩中文字幕国产| 日韩黄在线观看| 97在线观看免费| 黑人巨大精品欧美一区二区| 亚洲成人a级网| 日本精品久久久久影院| 亚洲男人的天堂网站| 日韩亚洲综合在线| 欧美精品成人91久久久久久久| 日韩美女激情视频| 在线观看视频99| 精品久久久999| 久久精品国产v日韩v亚洲| 久久久免费精品视频| 一个色综合导航|