日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

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

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

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

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

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

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

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

非對稱密碼體質(zhì)的特點:算法強(qiáng)度復(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ù)器中注冊。為提高保密強(qiáng)度,RSA密鑰至少為500位長,一般推薦使用1024位。這就使加密的計算量很大。為減少計算量,在傳送信息時,常采用傳統(tǒng)加密方法與公開密鑰加密方法相結(jié)合的方式,即信息采用改進(jìn)的DES或IDEA對話密鑰加密,然后使用RSA密鑰加密對話密鑰和信息摘要。對方收到信息后,用不同的密鑰解密并可核對信息摘要 。

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

算法原理:

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

算法描述:

(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)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99久久精品费精品国产| 国产精品二区不卡| 国产日韩中文在线中文字幕| 日韩中文av| 国产精品成人自拍| 高清一区二区三区av| 欧美日韩国产欧| 日韩一区中文| 亚洲不卡av不卡一区二区| 亚洲资源av| 欧美xxxx性| 水蜜桃久久夜色精品一区的特点| 青青国产91久久久久久| 亚洲高清激情| 日本精品在线播放| 综合日韩av| 国产伦乱精品| 午夜电影一区| 日韩黄色大片网站| 中文字幕日韩亚洲| 亚洲小说欧美另类婷婷| 久久丁香四色| 久久国产精品亚洲77777| 国产+成+人+亚洲欧洲在线| 欧美伊人久久| 亚洲三级精品| 亚洲国产不卡| 高清av一区| 国产精品亚洲欧美日韩一区在线| 亚洲成人二区| 午夜影院一区| 国产成人久久精品麻豆二区| 88久久精品| 日韩精品第一| 久久国产福利| 久久国产高清| 一本一本久久| 综合国产精品| 好看不卡的中文字幕| 久久精选视频| 亚洲精品小说| 亚洲激情国产| 午夜精品一区二区三区国产| 日本久久成人网| 午夜久久影院| 黄色免费成人| 蜜桃av一区| 老司机精品久久| 日韩中文字幕一区二区三区| 日韩一区精品字幕| 亚洲精品看片| 国产伦乱精品| 久久影院午夜精品| 91精品精品| 欧美精品一区二区三区精品| 99xxxx成人网| 亚洲伊人影院| 婷婷精品在线观看| 欧美日韩亚洲三区| 精品理论电影在线| 午夜欧美精品久久久久久久| 午夜国产一区二区| 亚洲精品动态| 给我免费播放日韩视频| 国产精品美女| 国产精品蜜月aⅴ在线| 视频在线不卡免费观看| 一区二区三区视频免费观看| 亚洲三级av| 精品少妇一区| 激情综合在线| 国产日韩在线观看视频| 欧美国产美女| 综合激情一区| 黑森林国产精品av| 亚洲色诱最新| 精品视频高潮| 欧美色综合网| 亚洲夜间福利| 久久久久黄色| 亚洲免费成人av在线| 日韩成人亚洲| 麻豆久久一区| 国产精品久久久久久久久久齐齐 | 日韩黄色av| 国产欧美欧美| 亚洲最新无码中文字幕久久 | 亚洲一区二区三区中文字幕在线观看| 国产精品v亚洲精品v日韩精品| 久久久久久久欧美精品| 免费一级欧美片在线观看网站| 999国产精品永久免费视频app| 玖玖精品视频| 麻豆网站免费在线观看| 亚洲一区久久| 99久久视频| 国产精品一区二区免费福利视频| 久久久精品五月天| 国产精品激情电影| 亚洲日产av中文字幕| 国内不卡的一区二区三区中文字幕| av不卡免费看| 欧美成人国产| 在线视频观看日韩| 青青青免费在线视频| 国产日韩免费| 天海翼精品一区二区三区| 亚洲欧美日韩视频二区| 免费日本视频一区| 99视频一区| 久久精品国产久精国产| 一本一本久久| 蜜桃av.网站在线观看| 国产探花一区二区| 天使萌一区二区三区免费观看| 久久久久黄色| 国产精品久久久免费| 综合亚洲视频| 久久久影院免费| 久久久久免费| 久久99国产精品视频| 国产日产高清欧美一区二区三区 | 精品亚洲a∨一区二区三区18| 爽爽淫人综合网网站| 三级小说欧洲区亚洲区| 成人在线免费观看91| 青青青国产精品| 婷婷视频一区二区三区| 亚洲欧美网站| 亚洲色图国产| 一区二区国产在线| 日韩av一区二| 日韩高清欧美激情| 91亚洲精品视频在线观看| 日本一区二区三区视频在线看| 午夜久久av| 日韩精品一区二区三区中文| 人人爱人人干婷婷丁香亚洲| 欧美三区不卡| 麻豆国产欧美一区二区三区 | 国产图片一区| 久久69成人| 91tv亚洲精品香蕉国产一区| 婷婷综合社区| 亚洲人成网77777色在线播放| 日本中文字幕一区二区视频| 国产欧美在线| 欧美国产先锋| 久久久久99| 亚洲v天堂v手机在线| 国产精品videossex| 欧美三级网址| 免费日韩精品中文字幕视频在线| 日韩欧美中文字幕一区二区三区| 麻豆成人av在线| 国产真实久久| 日韩av一区二| 99精品在线| 日本aⅴ亚洲精品中文乱码| 久久字幕精品一区| 欧美日韩国产综合网| 欧美久久精品| 日韩电影免费在线观看| 免费人成精品欧美精品| 久久的色偷偷| 蜜臀av一区二区三区| 精品成人18| 婷婷精品久久久久久久久久不卡| 成人午夜在线| 久久国产精品免费精品3p| 精品一区在线| 国产一区日韩| 日韩成人午夜精品| 日韩午夜免费| 久久狠狠婷婷| 国产成人精品亚洲线观看| 天堂俺去俺来也www久久婷婷| 成人三级高清视频在线看| 亚洲三级精品| 免费在线成人网| 欧美一区二区三区高清视频| 麻豆国产欧美一区二区三区 | 亚洲性色av| 欧美 日韩 国产精品免费观看| 99视频精品全国免费| 日韩二区三区四区| 蜜臀精品久久久久久蜜臀| 999久久久免费精品国产| 国产精品亚洲四区在线观看| 亚洲午夜久久| 中文精品电影| 深夜日韩欧美| 涩涩涩久久久成人精品| 美女尤物久久精品| 亚洲无线观看| 国产伦精品一区二区三区千人斩| 午夜亚洲福利| 国产欧美亚洲精品a| 欧美亚洲免费| 国产欧美日韩精品一区二区三区|