RSA加密算法

首先還是科普一下RSA

RSA加密算法

這里有一篇文章詳解了RSA加密算法的數(shù)學(xué)理論支持

詳細(xì)解讀RSA算法

放上個(gè)RAS算法的DEMO

public class RsaUtil {

? ? public static final String CHARSET = "UTF-8";

? ? public static final String RSA_ALGORITHM = "RSA";

? ? public static Map<String, String> createKeys(int keySize){

? ? ? ? //為RSA算法創(chuàng)建一個(gè)KeyPairGenerator對(duì)象

? ? ? ? KeyPairGenerator kpg;

? ? ? ? try{

? ? ? ? ? ? kpg = KeyPairGenerator.getInstance(RSA_ALGORITHM);

? ? ? ? }catch(NoSuchAlgorithmException e){

? ? ? ? ? ? throw new IllegalArgumentException("No such algorithm-->[" + RSA_ALGORITHM + "]");

? ? ? ? }

? ? ? ? //初始化KeyPairGenerator對(duì)象,密鑰長(zhǎng)度

? ? ? ? kpg.initialize(keySize);

? ? ? ? //生成密匙對(duì)

? ? ? ? KeyPair keyPair = kpg.generateKeyPair();

? ? ? ? //得到公鑰

? ? ? ? Key publicKey = keyPair.getPublic();

? ? ? ? String publicKeyStr = Base64.encodeBase64URLSafeString(publicKey.getEncoded());

? ? ? ? //得到私鑰

? ? ? ? Key privateKey = keyPair.getPrivate();

? ? ? ? String privateKeyStr = Base64.encodeBase64URLSafeString(privateKey.getEncoded());

? ? ? ? Map<String, String> keyPairMap = new HashMap<String, String>();

? ? ? ? keyPairMap.put("publicKey", publicKeyStr);

? ? ? ? keyPairMap.put("privateKey", privateKeyStr);

? ? ? ? return keyPairMap;

? ? }

? ? /**

? ? * 得到公鑰

? ? * @param publicKey 密鑰字符串(經(jīng)過base64編碼)

? ? * @throws Exception

? ? */

? ? public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {

? ? ? ? //通過X509編碼的Key指令獲得公鑰對(duì)象

? ? ? ? KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);

? ? ? ? X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));

? ? ? ? RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);

? ? ? ? return key;

? ? }

? ? /**

? ? * 得到私鑰

? ? * @param privateKey 密鑰字符串(經(jīng)過base64編碼)

? ? * @throws Exception

? ? */

? ? public static RSAPrivateKey getPrivateKey(String privateKey) throws NoSuchAlgorithmException, InvalidKeySpecException {

? ? ? ? //通過PKCS#8編碼的Key指令獲得私鑰對(duì)象

? ? ? ? KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);

? ? ? ? PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));

? ? ? ? RSAPrivateKey key = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);

? ? ? ? return key;

? ? }

? ? /**

? ? * 公鑰加密

? ? * @param data

? ? * @param publicKey

? ? * @return

? ? */

? ? public static String publicEncrypt(String data, RSAPublicKey publicKey){

? ? ? ? try{

? ? ? ? ? ? Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);

? ? ? ? ? ? cipher.init(Cipher.ENCRYPT_MODE, publicKey);

? ? ? ? ? ? return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), publicKey.getModulus().bitLength()));

? ? ? ? }catch(Exception e){

? ? ? ? ? ? throw new RuntimeException("加密字符串[" + data + "]時(shí)遇到異常", e);

? ? ? ? }

? ? }

? ? /**

? ? * 私鑰解密

? ? * @param data

? ? * @param privateKey

? ? * @return

? ? */

? ? public static String privateDecrypt(String data, RSAPrivateKey privateKey){

? ? ? ? try{

? ? ? ? ? ? Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);

? ? ? ? ? ? cipher.init(Cipher.DECRYPT_MODE, privateKey);

? ? ? ? ? ? return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), privateKey.getModulus().bitLength()), CHARSET);

? ? ? ? }catch(Exception e){

? ? ? ? ? ? throw new RuntimeException("解密字符串[" + data + "]時(shí)遇到異常", e);

? ? ? ? }

? ? }

? ? /**

? ? * 私鑰加密

? ? * @param data

? ? * @param privateKey

? ? * @return

? ? */

? ? public static String privateEncrypt(String data, RSAPrivateKey privateKey){

? ? ? ? try{

? ? ? ? ? ? Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);

? ? ? ? ? ? cipher.init(Cipher.ENCRYPT_MODE, privateKey);

? ? ? ? ? ? return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), privateKey.getModulus().bitLength()));

? ? ? ? }catch(Exception e){

? ? ? ? ? ? throw new RuntimeException("加密字符串[" + data + "]時(shí)遇到異常", e);

? ? ? ? }

? ? }

? ? /**

? ? * 公鑰解密

? ? * @param data

? ? * @param publicKey

? ? * @return

? ? */

? ? public static String publicDecrypt(String data, RSAPublicKey publicKey){

? ? ? ? try{

? ? ? ? ? ? Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);

? ? ? ? ? ? cipher.init(Cipher.DECRYPT_MODE, publicKey);

? ? ? ? ? ? return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(data), publicKey.getModulus().bitLength()), CHARSET);

? ? ? ? }catch(Exception e){

? ? ? ? ? ? throw new RuntimeException("解密字符串[" + data + "]時(shí)遇到異常", e);

? ? ? ? }

? ? }

? ? private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize){

? ? ? ? int maxBlock = 0;

? ? ? ? if(opmode == Cipher.DECRYPT_MODE){

? ? ? ? ? ? maxBlock = keySize / 8;

? ? ? ? }else{

? ? ? ? ? ? maxBlock = keySize / 8 - 11;

? ? ? ? }

? ? ? ? ByteArrayOutputStream out = new ByteArrayOutputStream();

? ? ? ? int offSet = 0;

? ? ? ? byte[] buff;

? ? ? ? int i = 0;

? ? ? ? try{

? ? ? ? ? ? while(datas.length > offSet){

? ? ? ? ? ? ? ? if(datas.length-offSet > maxBlock){

? ? ? ? ? ? ? ? ? ? buff = cipher.doFinal(datas, offSet, maxBlock);

? ? ? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? ? ? buff = cipher.doFinal(datas, offSet, datas.length-offSet);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? out.write(buff, 0, buff.length);

? ? ? ? ? ? ? ? i++;

? ? ? ? ? ? ? ? offSet = i * maxBlock;

? ? ? ? ? ? }

? ? ? ? }catch(Exception e){

? ? ? ? ? ? throw new RuntimeException("加解密閥值為["+maxBlock+"]的數(shù)據(jù)時(shí)發(fā)生異常", e);

? ? ? ? }

? ? ? ? byte[] resultDatas = out.toByteArray();

? ? ? ? IOUtils.closeQuietly(out);

? ? ? ? return resultDatas;

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市愧口,隨后出現(xiàn)的幾起案子纱控,更是在濱河造成了極大的恐慌雷猪,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件警检,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)池磁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楷兽,“玉大人地熄,你說我怎么就攤上這事⌒旧保” “怎么了端考?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)揭厚。 經(jīng)常有香客問我却特,道長(zhǎng),這世上最難降的妖魔是什么筛圆? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任裂明,我火速辦了婚禮,結(jié)果婚禮上太援,老公的妹妹穿的比我還像新娘闽晦。我一直安慰自己扳碍,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布仙蛉。 她就那樣靜靜地躺著笋敞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荠瘪。 梳的紋絲不亂的頭發(fā)上夯巷,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音哀墓,去河邊找鬼趁餐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛麸祷,可吹牛的內(nèi)容都是我干的澎怒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼阶牍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼喷面!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起走孽,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤惧辈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后磕瓷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體盒齿,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年困食,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了边翁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡硕盹,死狀恐怖符匾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘩例,我是刑警寧澤啊胶,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站垛贤,受9級(jí)特大地震影響焰坪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜聘惦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一某饰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦露乏、人聲如沸碧浊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至比勉,卻和暖如春劳较,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浩聋。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工观蜗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人衣洁。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓墓捻,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親坊夫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子砖第,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • 1. ASCII 編碼 ASCII(American Standard Code for Information ...
    s酸菜閱讀 8,684評(píng)論 0 8
  • Base64.java public final class Base64 { static private ...
    BUG弄潮兒閱讀 795評(píng)論 0 0
  • 概述 之前一直對(duì)加密相關(guān)的算法知之甚少,只知道類似DES环凿、RSA等加密算法能對(duì)數(shù)據(jù)傳輸進(jìn)行加密梧兼,且各種加密算法各有...
    Henryzhu閱讀 3,016評(píng)論 0 14
  • 這是一個(gè)故事,一個(gè)簡(jiǎn)單的小人物在這大城市要活得精彩的故事智听。 遇見你羽杰,你像嘰嘰喳喳的小鳥一樣說個(gè)不停,有趣的是到推,我被...
    涂菇?jīng)?/span>閱讀 785評(píng)論 0 1
  • 2019年1月10日 星期四 晴 對(duì)于學(xué)生來說考赛,兩天的收獲主要有三個(gè)方面。 第一莉测,從被動(dòng)學(xué)習(xí)到主動(dòng)學(xué)習(xí)颜骤。 第二,背...
    宜可老師閱讀 326評(píng)論 0 0