成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

教你用Java實現(xiàn)RSA非對稱加密算法

瀏覽:8日期:2022-08-12 11:43:28
目錄一、非對稱加密二、RSA算法三、RSA算法Java語言實現(xiàn)一、非對稱加密

非對稱加密算法是一種密鑰的保密方法。

非對稱加密算法需要兩個密鑰:公開密鑰(publickey:簡稱公鑰)和私有密鑰(privatekey:簡稱私鑰)。公鑰與私鑰是一對,如果用公鑰對數(shù)據(jù)進行加密,只有用對應(yīng)的私鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。 非對稱加密算法實現(xiàn)機密信息交換的基本過程是:甲方生成一對密鑰并將公鑰公開,需要向甲方發(fā)送信息的其他角色(乙方)使用該密鑰(甲方的公鑰)對機密信息進行加密后再發(fā)送給甲方;甲方再用自己私鑰對加密后的信息進行解密。甲方想要回復(fù)乙方時正好相反,使用乙方的公鑰對數(shù)據(jù)進行加密,同理,乙方使用自己的私鑰來進行解密。

另一方面,甲方可以使用自己的私鑰對機密信息進行簽名后再發(fā)送給乙方;乙方再用甲方的公鑰對甲方發(fā)送回來的數(shù)據(jù)進行驗簽。

甲方只能用其私鑰解密由其公鑰加密后的任何信息。 非對稱加密算法的保密性比較好,它消除了最終用戶交換密鑰的需要。

非對稱密碼體質(zhì)的特點:算法強度復(fù)雜、安全性依賴于算法與密鑰但是由于其算法復(fù)雜,而使得加密解密速度沒有對稱加密解密的速度快。對稱密碼體制中只有一種密鑰,并且是非公開的,如果要解密就得讓對方知道密鑰。所以保證其安全性就是保證密鑰的安全,而非對稱密鑰體制有兩種密鑰,其中一個是公開的,這樣就可以不需要像對稱密碼那樣傳輸對方的密鑰了。這樣安全性就大了很多。

二、RSA算法

簡介:

RSA公開密鑰密碼體質(zhì)是一種使用不同的加密密鑰與解密密鑰,“由已知加密密鑰推導(dǎo)出解密密鑰在計算上是不可行的”密碼體制 。

在公開密鑰密碼體制中,加密密鑰(即公開密鑰)PK是公開信息,而解密密鑰(即秘密密鑰)SK是需要保密的。加密算法E和解密算法D也都是公開的。雖然解密密鑰SK是由公開密鑰PK決定的,但卻不能根據(jù)PK計算出SK 。

正是基于這種理論,1978年出現(xiàn)了著名的RSA算法,它通常是先生成一對RSA密鑰,其中之一是保密密鑰,由用戶保存;另一個為公開密鑰,可對外公開,甚至可在網(wǎng)絡(luò)服務(wù)器中注冊。為提高保密強度,RSA密鑰至少為500位長,一般推薦使用1024位。這就使加密的計算量很大。為減少計算量,在傳送信息時,常采用傳統(tǒng)加密方法與公開密鑰加密方法相結(jié)合的方式,即信息采用改進的DES或IDEA對話密鑰加密,然后使用RSA密鑰加密對話密鑰和信息摘要。對方收到信息后,用不同的密鑰解密并可核對信息摘要 。

RSA是被研究得最廣泛的公鑰算法,從提出到現(xiàn)在已近三十年,經(jīng)歷了各種攻擊的考驗,逐漸為人們接受,普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之一。1983年麻省理工學(xué)院在美國為RSA算法申請了專利。

算法原理:

RSA公開密鑰密碼體制的原理是:根據(jù)數(shù)論,尋求兩個大素數(shù)比較簡單,而將它們的乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰 。

算法描述:

(1)任意選取兩個不同的大素數(shù)p和q計算乘積

教你用Java實現(xiàn)RSA非對稱加密算法

(2)任意選取一個大整數(shù)e,滿足

教你用Java實現(xiàn)RSA非對稱加密算法

整數(shù)e用做加密鑰(注意:e的選取是很容易的,例如,所有大于p和q的素數(shù)都可用)

(3)確定的解密鑰d,滿足

教你用Java實現(xiàn)RSA非對稱加密算法

教你用Java實現(xiàn)RSA非對稱加密算法

是一個任意的整數(shù);所以,若知道e和則很容易計算出d

教你用Java實現(xiàn)RSA非對稱加密算法

(4)公開整數(shù)n和e,秘密保存d

(5)將明文m(m<n是一個整數(shù))加密成密文c,加密算法為

教你用Java實現(xiàn)RSA非對稱加密算法

(6)將密文c解密為明文m,解密算法為

教你用Java實現(xiàn)RSA非對稱加密算法

RSA允許你選擇公鑰的大小。512位的密鑰被視為不安全的;768位的密鑰不用擔(dān)心受到除了國家安全管理(NSA)外的其他事物的危害;1024位的密鑰幾乎是安全的。RSA在一些主要產(chǎn)品內(nèi)部都有嵌入,像 Windows、網(wǎng)景 Navigator、 Quicken和 Lotus Notes 。

三、RSA算法Java語言實現(xiàn)

RSA算法工具類源碼:

package com.ljt.rsa.util;import org.apache.commons.codec.binary.Base64;import org.apache.commons.io.IOUtils;import javax.crypto.Cipher;import java.io.ByteArrayOutputStream;import java.security.*;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec.InvalidKeySpecException;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;import java.util.Map;/** * @ClassName: RSAUtil * @Description: RSA非對稱加密算法工具類 * @Author: 寒山月初°C * @Date 2021/5/16 17:47 * @Version 1.0 */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)建一個KeyPairGenerator對象(KeyPairGenerator,密鑰對生成器,用于生成公鑰和私鑰對)KeyPairGenerator kpg;try{ kpg = KeyPairGenerator.getInstance(RSA_ALGORITHM);}catch(NoSuchAlgorithmException e){ throw new IllegalArgumentException('No such algorithm-->[' + RSA_ALGORITHM + ']');}//初始化KeyPairGenerator對象,密鑰長度kpg.initialize(keySize);//生成密匙對KeyPair keyPair = kpg.generateKeyPair();//得到公鑰Key publicKey = keyPair.getPublic();String publicKeyStr = Base64.encodeBase64URLSafeString(publicKey.getEncoded()); //返回一個publicKey經(jīng)過二次加密后的字符串//得到私鑰Key privateKey = keyPair.getPrivate();String privateKeyStr = Base64.encodeBase64URLSafeString(privateKey.getEncoded()); 返回一個privateKey經(jīng)過二次加密后的字符串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指令獲得公鑰對象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指令獲得私鑰對象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 + ']時遇到異常', 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 + ']時遇到異常', 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 + ']時遇到異常', 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 + ']時遇到異常', 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ù)時發(fā)生異常', e);}byte[] resultDatas = out.toByteArray();IOUtils.closeQuietly(out);return resultDatas; }}

編寫測試類:

class Test{ public static void main (String[] args) throws Exception {Map<String, String> keyMap = RSAUtil.createKeys(1024);String publicKey = keyMap.get('publicKey');String privateKey = keyMap.get('privateKey');System.out.println('公鑰: nr' + publicKey);System.out.println('私鑰: nr' + privateKey);System.out.println('公鑰加密——私鑰解密');String str = '寒山月初℃';System.out.println('r明文:rn' + str);System.out.println('r明文大小:rn' + str.getBytes().length);String encodedData = RSAUtil.publicEncrypt(str, RSAUtil.getPublicKey(publicKey));System.out.println('密文:rn' + encodedData);String decodedData = RSAUtil.privateDecrypt(encodedData, RSAUtil.getPrivateKey(privateKey));System.out.println('解密后文字: rn' + decodedData); }}

運行結(jié)果:

公鑰: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCyrF0HBVsYdA2fTy1iYIWh7j1OoCDzLiBWomWO3Ngn1ajl2wSPk05E7yINxLiTaQSA0H86EWv0jRJrGSdg6kwqzhWv53hza4xEXozLNgDR5L0bxEAmtv1abFALwpMHMPr8NzbpvXHwNaHer6mBrhXDVuyPdgZkWuh0kLrpvXHetQIDAQAB私鑰: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALKsXQcFWxh0DZ9PLWJghaHuPU6gIPMuIFaiZY7c2CfVqOXbBI-TTkTvIg3EuJNpBIDQfzoRa_SNEmsZJ2DqTCrOFa_neHNrjERejMs2ANHkvRvEQCa2_VpsUAvCkwcw-vw3Num9cfA1od6vqYGuFcNW7I92BmRa6HSQuum9cd61AgMBAAECgYA5KNch9d6stgPdoVDdlg9qPHM0ghnIcks6K_3ddF1acQn1btnIrNFvUClOyk5aKlCcfRcWlpg4xiDMTmHAqXPv_H2AQTqqLdhKC6cz0AZDuiv_itO40rqmvi9n0lcJWP0zq3cJyNlE8ogNsb9heHn_XdPIxD4tdl3QztZQHBfOgQJBAObDr9SBD0EsiGCeULMEj-hEOHsMh0NANpHvNdzKj9xNb28fAZ4H8reRG5frUqpCSTkxgigBwsMhYeQu_ebNoAUCQQDGNl8iVw219K0e3Awwd7TUmM8Ugt8intD1rbYObsYDZlss6rzsm0XzUgkJE9X6xcdu_O5jWZ49mgC3i-jg7HLxAkBZ9h283VdiFAdSi0VwlK25YacXKUouCIF9oODBo2I0AygXDOJnhje0Imi8b-v5HgBHwKo6CH2x7nioKT2oVa81AkByl8KedtfNZ1yjJ7LAXqSj-IhYImVgfZLvRnOnmnFOS-HQcRGydP6W8smYfuhJ6Agp6X7k30317VAWzYNgbjLxAkEAvOYGU33Ll871QFzWTW8eHg1SJMP4oTL3jKuQi5lVMrZTWoCQF_wvuHKAKgIs0AzFwh5vrkNN1fv5QASzwtIGzg公鑰加密——私鑰解密明文:寒山月初℃明文大小:15密文:pnQYCefqnlYLZ2wuMcxsbkD9feA3WFcDXShYx6HajvlsriQGWzb4Xxdwz0KTzjz3nqho9AxUc2bZmBhq05v-DCyB14u2NyabENuMXoiKft4QGKNVG3WxGps55xRHr3lVt4Rj59mDBX_manNsQDwxj7gy_Brv6Uv_NRzd6M91aGk解密后文字: 寒山月初℃ Process finished with exit code 0

到此這篇關(guān)于教你用Java實現(xiàn)RSA非對稱加密算法的文章就介紹到這了,更多相關(guān)Java實現(xiàn)RSA非對稱加密算法內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)

標(biāo)簽: Java
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
aa日韩免费精品视频一| 国产精品久久久久久久第一福利| 久久久久久久久97黄色工厂| 国产在线播精品第三| 久久久久久9| 一区二区三区在线免费视频| 91麻豆.com| 欧美精品一区二区精品网| 精品中文字幕一区二区| 在线日韩av片| 水野朝阳av一区二区三区| 尤物在线精品| 自拍偷拍亚洲激情| 日韩欧美电影一二三| 国产一区二区美女| 欧美久久久久久蜜桃| 久久成人久久爱| 久久综合一区| 免费看精品久久片| 91福利视频久久久久| 天堂在线一区二区| 美女成人午夜| 日本aⅴ亚洲精品中文乱码| 日本电影亚洲天堂一区| 老色鬼精品视频在线观看播放| 色偷偷久久人人79超碰人人澡| 亚洲妇女屁股眼交7| 国产偷国产偷亚洲高清97cao| 一区二区三区日韩欧美| 国产日韩欧美在线播放不卡| 一区二区日韩av| 久久综合九色综合欧美98| eeuss鲁片一区二区三区| 精品国产污网站| 95精品视频在线| 久久久www免费人成精品| 欧美久久久久久久| 亚洲欧洲无码一区二区三区| 亚洲伦理精品| 亚洲午夜羞羞片| 色播五月激情综合网| 另类小说欧美激情| 911精品产国品一二三产区| 成人福利视频网站| 国产精品麻豆一区二区| 国产偷久久久精品专区| 性做久久久久久久免费看| 欧美最新大片在线看| 看电影不卡的网站| 欧美一区中文字幕| 91在线视频免费91| 中文字幕免费一区| 一区二区av| 亚洲123区在线观看| 欧美午夜精品久久久久久超碰| 国产自产v一区二区三区c| 日韩一级免费一区| 欧美午夜免费| 午夜久久久久久久久久一区二区| 欧美三级午夜理伦三级中视频| 丁香天五香天堂综合| 国产精品乱人伦| 久久香蕉精品| 国产不卡免费视频| 国产精品高潮久久久久无| 久久精品欧美| 国产精品资源网| 中文字幕二三区不卡| 亚洲尤物在线| 国产精品一区一区| 国产欧美一区在线| 国产日本精品| 极品少妇xxxx精品少妇| 久久精品网站免费观看| 亚洲激情av| 激情欧美日韩一区二区| 国产亚洲一本大道中文在线| 伦理电影国产精品| 欧美成人免费网站| 久久综合综合久久综合| 国产三区二区一区久久| 亚洲成人777| 日韩欧美在线综合网| 一区一区视频| 久久99日本精品| 久久精品这里都是精品| 欧美日韩hd| 日本中文字幕一区| 国产亚洲成av人在线观看导航| 国产亚洲欧美另类一区二区三区| 国产一区欧美二区| 亚洲欧美福利一区二区| 在线观看视频一区| 欧美日韩在线精品| 美国十次了思思久久精品导航| 久久久久国产精品免费免费搜索| 久久99伊人| 91丨九色porny丨蝌蚪| 午夜亚洲福利老司机| 久久综合999| 狂野欧美一区| 99久久99久久免费精品蜜臀| 亚洲网友自拍偷拍| 久久久久99精品一区| 色婷婷久久久综合中文字幕| 暖暖成人免费视频| 久久精品国产精品青草| 日韩美女啊v在线免费观看| 国内成+人亚洲| 国内不卡的二区三区中文字幕 | 毛片不卡一区二区| 国产精品无码永久免费888| 欧美高清视频不卡网| 亚洲精品偷拍| 成人黄色大片在线观看| 日韩制服丝袜av| 国产精品久久久久久久久晋中| 欧美日韩精品一区二区| 一区二区av| 亚洲欧美影院| 国产精品一区二区久激情瑜伽 | 国产一区在线精品| 亚洲最大的成人av| 久久综合狠狠综合久久激情| 欧美日韩久久久一区| 久久久久高清| 国产精品theporn| 国产成人综合在线播放| 亚洲一区二区四区蜜桃| 久久久久88色偷偷免费| 欧美三电影在线| 亚洲一区二区三区色| 欧美精品不卡| 成人伦理片在线| 毛片av中文字幕一区二区| 亚洲一区二区三区四区的| 欧美国产精品一区二区三区| 日韩欧美www| 欧美日韩亚洲综合| 一本色道久久综合狠狠躁的推荐| 亚洲国产精品一区| 91香蕉视频mp4| 国产精品123区| 日韩av中文字幕一区二区| 亚洲精品国产a| 亚洲国产精品二十页| 日韩精品一区二区三区视频播放 | 国产麻豆精品theporn| 肉色丝袜一区二区| 一区二区三区中文字幕电影| 国产日韩欧美一区二区三区乱码| 91精品国产高清一区二区三区| 欧洲色大大久久| 另类图片国产| 国产精品一区二区欧美| 1000部精品久久久久久久久| 欧美1区2区| 91色porny蝌蚪| 成人黄色片在线观看| 亚洲一区在线观看网站| 日韩美女久久久| 亚洲同性gay激情无套| 国产日产欧产精品推荐色| 精品剧情v国产在线观看在线| 91精品国产免费| 欧美日韩国产色站一区二区三区| 欧美专区亚洲专区| 欧美性生交片4| 欧洲色大大久久| 日本高清无吗v一区| 久久不射网站| 免费在线播放第一区高清av| 99香蕉国产精品偷在线观看| 亚洲欧洲一区| 成人美女在线视频| 成人av网址在线| a在线欧美一区| 99视频一区二区| 99re亚洲国产精品| 牛夜精品久久久久久久99黑人 | 欧美人xxxx| 91精品国产色综合久久不卡电影| 91精品国产乱| 精品国产一区二区三区忘忧草 | 久久久精品2019中文字幕之3| 欧美精品一区二区久久婷婷| 精品国产免费一区二区三区四区| wwwwxxxxx欧美| 欧美成人精精品一区二区频| 精品美女一区二区三区| 亚洲精品一区二区三区香蕉| 久久久亚洲欧洲日产国码αv| 亚洲国产成人在线| 亚洲欧美色一区| 亚洲一线二线三线视频| 七七婷婷婷婷精品国产| 国产乱子伦一区二区三区国色天香| 懂色av一区二区三区免费观看| 99热这里都是精品| 亚洲视频久久|