摘要:是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。算法基于一個(gè)十分簡(jiǎn)單的數(shù)論事實(shí)將兩個(gè)大素?cái)?shù)相乘十分容易,但那時(shí)想要對(duì)其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
在編程中,我們?yōu)榱吮WC數(shù)據(jù)安全,免不了要經(jīng)常進(jìn)行數(shù)據(jù)加密,于是產(chǎn)生了各種各樣的加密算法.無(wú)論怎樣,都還是存在被破解的風(fēng)險(xiǎn).今天就來(lái)說(shuō)說(shuō)RSA算法.背景
RSA公鑰加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美國(guó)麻省理工學(xué)院)開發(fā)的。RSA取名來(lái)自開發(fā)他們?nèi)叩拿帧SA是目前最有影響力的公鑰加密算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標(biāo)準(zhǔn)。RSA算法基于一個(gè)十分簡(jiǎn)單的數(shù)論事實(shí):將兩個(gè)大素?cái)?shù)相乘十分容易,但那時(shí)想要對(duì)其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
雖然上面的解釋很深?yuàn)W,但是你只要知道,這個(gè)算法非常安全就行了.
加密解密過(guò)程假設(shè)有兩個(gè)用戶A,B. B在它的一側(cè),生成了公鑰和私鑰,私鑰只有B自己知道,然后把公鑰分享給A,當(dāng)然不僅是A,B的公鑰只要分享給了所有他信賴的人,那么這些人都將能解密A的數(shù)據(jù).
過(guò)程1:
A使用B的公鑰加密數(shù)據(jù),然后B使用私鑰解密數(shù)據(jù).這時(shí)所有擁有公鑰的用戶是不能解密數(shù)據(jù)的,因?yàn)樗麄儧](méi)有私鑰.這個(gè)數(shù)據(jù)只有A和B能夠獲取,這就保證了數(shù)據(jù)的安全.
過(guò)程2:
B使用私鑰加密數(shù)據(jù),那么所有有公鑰的用戶都可以使用公要解密數(shù)據(jù).其他沒(méi)有公鑰的人是沒(méi)有辦法獲取到數(shù)據(jù)的,這也保證了數(shù)據(jù)的安全性.
通過(guò)上面的過(guò)程,我們可以看到這樣一個(gè)不同于以往加密算法的現(xiàn)象,那就是非對(duì)稱.什么是非對(duì)稱?
你不能通過(guò)自己的加密密鑰,反向解密,這個(gè)過(guò)程是不可逆的,正是因?yàn)槿绱瞬糯蟠筇岣吡怂陌踩裕€和私鑰都可以進(jìn)行加密解密,但他們必須配對(duì)使用.在私鑰被高度保護(hù)的情況下,永遠(yuǎn)不會(huì)出現(xiàn)被破解的可能.
java實(shí)現(xiàn)package com.mike; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.security.Key; import java.security.KeyPair; import java.security.KeyPairGenerator; import javax.crypto.Cipher; import org.apache.commons.codec.binary.Base64; /** * The class Rsa.java */ public class Rsa { private static String PUBLIC_KEY_FILE = "C:myPublicKey"; private static String PRIVATE_KEY_FILE = "C:myPrivateKey"; /** * 初始化密鑰 * * @return */ public static void productKey() { try { KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(1024); KeyPair keyPair = keyGen.generateKeyPair();// 生成密鑰對(duì) Key pubKey = keyPair.getPublic(); // 獲取公鑰 Key priKey = keyPair.getPrivate(); // 獲取私鑰 ObjectOutputStream oos1 = null; ObjectOutputStream oos2 = null; try { /** 用對(duì)象流將生成的密鑰寫入文件 */ oos1 = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE)); oos2 = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY_FILE)); oos1.writeObject(pubKey); oos2.writeObject(priKey); } catch (Exception e) { throw e; } finally { /** 清空緩存,關(guān)閉文件輸出流 */ oos1.close(); oos2.close(); } } catch (Exception e) { e.printStackTrace(); } } /** * 公鑰加密方法 私鑰加密也一樣 * * @param source * 源數(shù)據(jù) * @return * @throws Exception */ public static String encrypt(String source) throws Exception { Key publicKey; ObjectInputStream ois = null; try { /** 將文件中的公鑰對(duì)象讀出 */ ois = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE)); publicKey = (Key) ois.readObject(); } catch (Exception e) { throw e; } finally { ois.close(); } /** 得到Cipher對(duì)象來(lái)實(shí)現(xiàn)對(duì)源數(shù)據(jù)的RSA加密 */ Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte[] b = source.getBytes(); /** 執(zhí)行加密操作 */ byte[] b1 = cipher.doFinal(b); return Base64.encodeBase64String(b1); } /** * 私鑰解密算法 公鑰解密一樣 * * @param cryptograph * 密文 * @return * @throws Exception */ public static String decrypt(String cryptograph) throws Exception { Key privateKey; ObjectInputStream ois = null; try { /** 將文件中的私鑰對(duì)象讀出 */ ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE)); privateKey = (Key) ois.readObject(); } catch (Exception e) { throw e; } finally { ois.close(); } /** 得到Cipher對(duì)象對(duì)已用公鑰加密的數(shù)據(jù)進(jìn)行RSA解密 */ Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] b1 = Base64.decodeBase64(cryptograph); /** 執(zhí)行解密操作 */ byte[] b = cipher.doFinal(b1); return new String(b); } public static void main(String[] args) throws Exception { Rsa.productKey(); String msg = "我是加密信息"; String encryt = Rsa.encrypt(msg); System.out.println("加密后的字符:"+encryt); System.out.println("解密后的字符:"+Rsa.decrypt(encryt)); } }
這樣有了密鑰文件,你就可以進(jìn)行加密和簽名了.歡迎公眾我的公眾號(hào)mike啥都想搞,學(xué)習(xí)更多有趣的東西.
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73824.html
摘要:所謂對(duì)稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點(diǎn)之一。非對(duì)稱加密算法由于對(duì)稱加密在通信加密領(lǐng)域的缺陷,年和提出了非對(duì)稱加密的概念。非對(duì)稱加密,其主要缺點(diǎn)之一就是慢,適合加密少量數(shù)據(jù)。 1. 加密的目的 加密不同于密碼,加密是一個(gè)動(dòng)作或者過(guò)程,其目的就是將一段明文信息(人類或機(jī)器可以直接讀懂的信息)變?yōu)橐欢慰瓷先](méi)有任何意義的字符,必須通過(guò)事先約定的解密規(guī)則才能將...
摘要:所謂對(duì)稱加密,就是加密和解密使用同一秘鑰,這也是這種加密算法最顯著的缺點(diǎn)之一。非對(duì)稱加密算法由于對(duì)稱加密在通信加密領(lǐng)域的缺陷,年和提出了非對(duì)稱加密的概念。非對(duì)稱加密,其主要缺點(diǎn)之一就是慢,適合加密少量數(shù)據(jù)。 1. 加密的目的 加密不同于密碼,加密是一個(gè)動(dòng)作或者過(guò)程,其目的就是將一段明文信息(人類或機(jī)器可以直接讀懂的信息)變?yōu)橐欢慰瓷先](méi)有任何意義的字符,必須通過(guò)事先約定的解密規(guī)則才能將...
摘要:什么是是在原來(lái)簽名算法的基礎(chǔ)上,新增了支持的簽名算法。的簽名算法會(huì)繼續(xù)提供支持,但為了您的應(yīng)用安全,強(qiáng)烈建議使用的簽名算法。 什么是RSA2? RSA2是在原來(lái)SHA1WithRSA簽名算法的基礎(chǔ)上,新增了支持SHA256WithRSA的簽名算法。 該算法在摘要算法上比SHA1WithRSA有更強(qiáng)的安全能力。 SHA1WithRSA的簽名算法會(huì)繼續(xù)提供支持,但為了您的應(yīng)用安全,強(qiáng)烈建議...
摘要:一端用私鑰加密,另一端用公鑰解密,也確保了來(lái)源目前現(xiàn)在好像使用了數(shù)字簽名就萬(wàn)無(wú)一失了,其實(shí)還有問(wèn)題。如果公鑰被偽造了,后面的數(shù)字簽名其實(shí)就毫無(wú)意義了。具有校驗(yàn)機(jī)制,一旦被篡改,通信雙方會(huì)立刻發(fā)現(xiàn)。配備身份證書,防止身份被冒充。 一、前言 只有光頭才能變強(qiáng) HTTP博文回顧: PC端:HTTP就是這么簡(jiǎn)單 PC端:HTTP面試題都在這里 微信公眾號(hào)端:HTTP就是這么簡(jiǎn)單 微信公眾號(hào)端...
摘要:公鑰哈希和錢包地址可以通過(guò)互逆運(yùn)算進(jìn)行轉(zhuǎn)換,所以它們是等價(jià)的。使用私鑰對(duì)交易進(jìn)行簽名比特幣錢包間的轉(zhuǎn)賬是通過(guò)交易實(shí)現(xiàn)的。使用公鑰對(duì)簽名進(jìn)行驗(yàn)證交易數(shù)據(jù)被廣播到比特幣網(wǎng)絡(luò)后,節(jié)點(diǎn)會(huì)對(duì)這個(gè)交易數(shù)據(jù)進(jìn)行檢驗(yàn),其中就包括對(duì)簽名的校驗(yàn)。 一句話解釋公鑰、私鑰、地址私鑰:實(shí)際上是一組隨機(jī)數(shù),關(guān)于區(qū)塊鏈中的隨機(jī)數(shù)我們已經(jīng)介紹過(guò)了公鑰:對(duì)私鑰進(jìn)行橢圓曲線加密算法生成,但是無(wú)法通過(guò)公鑰倒推得到私鑰。公...
閱讀 3556·2021-11-22 11:59
閱讀 954·2021-09-27 13:36
閱讀 3616·2021-09-24 09:47
閱讀 2266·2021-09-01 11:39
閱讀 985·2021-08-31 09:37
閱讀 2316·2021-08-05 10:01
閱讀 1677·2019-08-30 15:55
閱讀 703·2019-08-30 15:54