最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 加密之RSA算法加密與解密的實(shí)例詳解

 更新時(shí)間:2017年07月12日 10:19:39   投稿:lqh  
這篇文章主要介紹了java 加密之RSA算法加解密與解密的實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下

java 加密之RSA算法加解密與解密的實(shí)例詳解

前言:

  RSA是第一個(gè)比較完善的公開密鑰算法,它既能用于加密,也能用于數(shù)字簽名。RSA以它的三個(gè)發(fā)明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,這個(gè)算法經(jīng)受住了多年深入的密碼分析,雖然密碼分析者既不能證明也不能否定RSA的安全性,但這恰恰說明該算法有一定的可信性,目前它已經(jīng)成為最流行的公開密鑰算法。

       RSA的安全基于大數(shù)分解的難度。其公鑰和私鑰是一對大素?cái)?shù)(100到200位十進(jìn)制數(shù)或更大)的函數(shù)。從一個(gè)公鑰和密文恢復(fù)出明文的難度,等價(jià)于分解兩個(gè)大素?cái)?shù)之積(這是公認(rèn)的數(shù)學(xué)難題)。

RSA加密與解密

RSA算法的密鑰由公鑰和私鑰組成,公鑰用于加密,私鑰用于解密。顧名思義,公鑰就是可以進(jìn)行公開的密鑰,一般可以公開給你的合作伙伴;私鑰就是私有的,也就是只有你知道的,你的合作伙伴通過你提供的公鑰進(jìn)行加密的內(nèi)容只有你能進(jìn)行解密,這樣也就只有你知道他發(fā)的是什么內(nèi)容。用于加密的公鑰和私鑰是配對的。這樣的一對密鑰在Java中由

java.security.KeyPairGenerator來產(chǎn)生。以下是一個(gè)生成密鑰對的示例,該示例中還將生成的密鑰對分別保存到了文件中。

 private static final String ALGORITHM = "RSA";
 private static final String PRIVATE_KEY_PATH = "D:\\rsa_private.isa";
 private static final String PUBLIC_KEY_PATH = "D:\\rsa_public.isa";
 
 /**
 * 生成公鑰和私鑰并存儲(chǔ)到文件中
 * @throws Exception
 */
 @Test
 public void geneKeyPair() throws Exception {
 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
 keyPairGenerator.initialize(1024);
 KeyPair keyPair = keyPairGenerator.generateKeyPair();
 PrivateKey privateKey = keyPair.getPrivate();//私鑰
 PublicKey publicKey = keyPair.getPublic();//公鑰
 byte[] privateKeyBytes = privateKey.getEncoded();//私鑰對應(yīng)的字節(jié)數(shù)組
 byte[] publicKeyBytes = publicKey.getEncoded();//公鑰對應(yīng)的字節(jié)數(shù)組
 Files.write(Paths.get(PRIVATE_KEY_PATH), privateKeyBytes);
 Files.write(Paths.get(PUBLIC_KEY_PATH), publicKeyBytes);
 }

加密

加密的過程跟使用AES算法進(jìn)行加密的過程類似,唯一需要注意的是使用存儲(chǔ)起來的公鑰時(shí)需要使用X509EncodedKeySpec進(jìn)行封裝,然后通過KeyFactory.generatePublic(KeySpec)進(jìn)行生成。

@Test
 public void testEncrypt() throws Exception {
 this.encrypt("Hello RSA");
 }
 
 /**
 * 公鑰加密
 * @param value
 * @return
 * @throws Exception
 */
 private byte[] encrypt(String value) throws Exception {
 Cipher cipher = Cipher.getInstance(ALGORITHM);
 //讀取公鑰對應(yīng)的字節(jié)數(shù)組
 byte[] publicKeyCode = Files.readAllBytes(Paths.get(PUBLIC_KEY_PATH));
 //構(gòu)造公鑰,存儲(chǔ)起來的公鑰需要使用X509EncodedKeySpec進(jìn)行讀取
 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyCode);
 KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
 //根據(jù)已有的KeySpec生成對應(yīng)的公鑰
 PublicKey publicKey = keyFactory.generatePublic(keySpec);
 cipher.init(Cipher.ENCRYPT_MODE, publicKey);
 byte[] result = cipher.doFinal(value.getBytes());
 System.out.println(Base64.getEncoder().encodeToString(result));
 return result;
 }

解密

解密是使用的密鑰對中的私鑰,其使用方法跟AES算法進(jìn)行解密類似。 存儲(chǔ)起來的私鑰需要通過PKCS8EncodedKeySpec加載,然后通過KeyFactory.generatePrivate(KeySpec)生成私鑰。

 /**
 * 私鑰解密
 * @throws Exception
 */
 @Test
 public void testDecrypt() throws Exception {
 Cipher cipher = Cipher.getInstance(ALGORITHM);
 byte[] privateKeyCode = Files.readAllBytes(Paths.get(PRIVATE_KEY_PATH));
 //私鑰需要通過PKCS8EncodedKeySpec來讀取
 PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyCode);
 KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
 //生成私鑰
 PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
 cipher.init(Cipher.DECRYPT_MODE, privateKey);
 String content = "Java Program";
 byte[] input = this.encrypt("Java Program");
 byte[] result = cipher.doFinal(input);
 Assert.assertTrue(content.equals(new String(result)));
 }

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • 關(guān)于pytorch相關(guān)部分矩陣變換函數(shù)的問題分析

    關(guān)于pytorch相關(guān)部分矩陣變換函數(shù)的問題分析

    這篇文章主要介紹了pytorch相關(guān)部分矩陣變換函數(shù),包括tensor維度順序變換BCHW順序的調(diào)整,矩陣乘法相關(guān)函數(shù),矩陣乘,點(diǎn)乘,求取矩陣對角線元素或非對角線元素的問題,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-03-03
  • java迭代子模式詳解

    java迭代子模式詳解

    這篇文章主要為大家詳細(xì)介紹了java迭代子模式的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • Java異常處理 Throwable實(shí)現(xiàn)方法解析

    Java異常處理 Throwable實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Java異常處理 Throwable實(shí)現(xiàn)方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 你都理解創(chuàng)建線程池的參數(shù)嗎?

    你都理解創(chuàng)建線程池的參數(shù)嗎?

    這篇文章主要介紹了創(chuàng)建線程池參數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • springboot配置開發(fā)和測試環(huán)境并添加啟動(dòng)路徑方式

    springboot配置開發(fā)和測試環(huán)境并添加啟動(dòng)路徑方式

    這篇文章主要介紹了springboot配置開發(fā)和測試環(huán)境并添加啟動(dòng)路徑方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java實(shí)現(xiàn)簡單撲克牌游戲

    java實(shí)現(xiàn)簡單撲克牌游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單撲克牌游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決

    java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決

    這篇文章主要給大家介紹了關(guān)于java.io.IOException:?UT010029:?Stream?is?closed異常分析及解決辦法,文中通過代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-02-02
  • Jemalloc優(yōu)化MySQL和Nginx

    Jemalloc優(yōu)化MySQL和Nginx

    這篇文章主要介紹了Jemalloc優(yōu)化MySQL和Nginx的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Spring Boot 利用WebUploader進(jìn)行文件上傳功能

    Spring Boot 利用WebUploader進(jìn)行文件上傳功能

    本文的重點(diǎn)是給大家介紹在Spring Boot項(xiàng)目中利用WebUploader如何進(jìn)行文件上傳,本文通過示例代碼給大家介紹,需要的朋友參考下吧
    2018-03-03
  • Java數(shù)據(jù)結(jié)構(gòu)之順序表的實(shí)現(xiàn)

    Java數(shù)據(jù)結(jié)構(gòu)之順序表的實(shí)現(xiàn)

    線性表(linear?list)是n個(gè)具有相同特性的數(shù)據(jù)元素的有限序列。?線性表是一種在實(shí)際中廣泛使用的數(shù)據(jù)結(jié)構(gòu),本文將用Java實(shí)現(xiàn)順序表,感興趣的可以了解一下
    2022-09-09

最新評論

平泉县| 肥城市| 萨嘎县| 宜君县| 东乌珠穆沁旗| 仪陇县| 平度市| 洪湖市| 峨眉山市| 碌曲县| 丽水市| 右玉县| 台北市| 武义县| 大同县| 庄浪县| 西丰县| 台中市| 高要市| 宜章县| 东兴市| 民乐县| 阜平县| 额尔古纳市| 锡林浩特市| 石楼县| 嘉黎县| 镇坪县| 平乡县| 涞水县| 内黄县| 永丰县| 西城区| 监利县| 彰化市| 徐水县| 安顺市| 闻喜县| 高青县| 喀什市| 巧家县|