java RSA加密算法

RSA是一種非對稱加密算法。現(xiàn)在俄讹,很多登陸表單的密碼的都采用RSA加密哆致,例如京東中的登陸使用公鑰對密碼進行加密绕德。

package com.qian.encoded;

import org.apache.commons.codec.binary.Base64;

public class Base64Coded {
public static void main(String[] args) {
String string = "qianyang123";
//編碼
String encode = encode(string.getBytes());
System.out.println(string + "\t編碼后的字符串為:" + encode);
//解碼
String decode = decode(encode.getBytes());
System.out.println(encode + "\t字符串解碼后為:" + decode);
}
//base64 解碼
public static String decode(byte[] bytes) {
return new String(Base64.decodeBase64(bytes));
}

//base64 編碼
public static String encode(byte[] bytes) {  
    return new String(Base64.encodeBase64(bytes));  
}  

}

程序的輸出結(jié)果為:

qianyang123 編碼后的字符串為:cWlhbnlhbmcxMjM=
cWlhbnlhbmcxMjM= 字符串解碼后為:qianyang123

RSA加密與解密
使用RSA一般需要產(chǎn)生公鑰和私鑰患膛,當(dāng)采用公鑰加密時,使用私鑰解密耻蛇;采用私鑰加密時踪蹬,使用公鑰解密。以下為Java程序:

package com.qian.encoded;

import org.apache.commons.codec.binary.Base64;
import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
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;

public class RSAEncrypt {
private static Map<Integer, String> keyMap = new HashMap<Integer, String>(); //用于封裝隨機產(chǎn)生的公鑰與私鑰
public static void main(String[] args) throws Exception {
//生成公鑰和私鑰
genKeyPair();
//加密字符串
String message = "df723820";
System.out.println("隨機生成的公鑰為:" + keyMap.get(0));
System.out.println("隨機生成的私鑰為:" + keyMap.get(1));
String messageEn = encrypt(message,keyMap.get(0));
System.out.println(message + "\t加密后的字符串為:" + messageEn);
String messageDe = decrypt(messageEn,keyMap.get(1));
System.out.println("還原后的字符串為:" + messageDe);
}

/** 
 * 隨機生成密鑰對 
 * @throws NoSuchAlgorithmException 
 */  
public static void genKeyPair() throws NoSuchAlgorithmException {  
    // KeyPairGenerator類用于生成公鑰和私鑰對臣咖,基于RSA算法生成對象  
    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");  
    // 初始化密鑰對生成器跃捣,密鑰大小為96-1024位  
    keyPairGen.initialize(1024,new SecureRandom());  
    // 生成一個密鑰對,保存在keyPair中  
    KeyPair keyPair = keyPairGen.generateKeyPair();  
    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();   // 得到私鑰  
    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  // 得到公鑰  
    String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));  
    // 得到私鑰字符串  
    String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));  
    // 將公鑰和私鑰保存到Map
    keyMap.put(0,publicKeyString);  //0表示公鑰
    keyMap.put(1,privateKeyString);  //1表示私鑰
}  
/** 
 * RSA公鑰加密 
 *  
 * @param str 
 *            加密字符串
 * @param publicKey 
 *            公鑰 
 * @return 密文 
 * @throws Exception 
 *             加密過程中的異常信息 
 */  
public static String encrypt( String str, String publicKey ) throws Exception{
    //base64編碼的公鑰
    byte[] decoded = Base64.decodeBase64(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 = Base64.encodeBase64String(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 = Base64.decodeBase64(str.getBytes("UTF-8"));
    //base64編碼的私鑰
    byte[] decoded = Base64.decodeBase64(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;
}

}

————————————————
原文鏈接:https://blog.csdn.net/qy20115549/article/details/83105736

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夺蛇,一起剝皮案震驚了整個濱河市疚漆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌刁赦,老刑警劉巖娶聘,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異甚脉,居然都是意外死亡丸升,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門牺氨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狡耻,“玉大人,你說我怎么就攤上這事猴凹∫恼” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵郊霎,是天一觀的道長沼头。 經(jīng)常有香客問我,道長歹篓,這世上最難降的妖魔是什么瘫证? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮庄撮,結(jié)果婚禮上背捌,老公的妹妹穿的比我還像新娘。我一直安慰自己洞斯,他們只是感情好毡庆,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布坑赡。 她就那樣靜靜地躺著,像睡著了一般么抗。 火紅的嫁衣襯著肌膚如雪毅否。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天蝇刀,我揣著相機與錄音螟加,去河邊找鬼。 笑死吞琐,一個胖子當(dāng)著我的面吹牛捆探,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播站粟,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼黍图,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了奴烙?” 一聲冷哼從身側(cè)響起助被,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎切诀,沒想到半個月后揩环,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡趾牧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年检盼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片翘单。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡吨枉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出哄芜,到底是詐尸還是另有隱情貌亭,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布认臊,位于F島的核電站圃庭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏失晴。R本人自食惡果不足惜剧腻,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涂屁。 院中可真熱鬧书在,春花似錦、人聲如沸拆又。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至栈源,卻和暖如春挡爵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背甚垦。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工茶鹃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人制轰。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓前计,卻偏偏與公主長得像,于是被迫代替她去往敵國和親垃杖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Base64.java public final class Base64 { static private ...
    BUG弄潮兒閱讀 802評論 0 0
  • 1. ASCII 編碼 ASCII(American Standard Code for Information ...
    s酸菜閱讀 8,694評論 0 8
  • 序 這幾個月一直在忙自己的終身大事彩库,好久不寫文章了;靜下來分析寫作中斷的原因先蒋,發(fā)現(xiàn)一半是工作太忙骇钦,一半是自己太懶...
    Daemon_Shell閱讀 2,525評論 0 1
  • /**ios常見的幾種加密方法: 普通的加密方法是講密碼進行加密后保存到用戶偏好設(shè)置( [NSUserDefaul...
    彬至睢陽閱讀 2,939評論 0 7
  • 親愛的同學(xué)們,時光在不經(jīng)意中流逝竞漾,轉(zhuǎn)眼間我們來到光華已經(jīng)快三年了眯搭。 這里我用了我們,因為我是和你們一起...
    房房_3ec4閱讀 1,241評論 0 10