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

java 加密之RSA算法加密與解密的實例詳解

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

java 加密之RSA算法加解密與解密的實例詳解

前言:

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

       RSA的安全基于大數(shù)分解的難度。其公鑰和私鑰是一對大素數(shù)(100到200位十進制數(shù)或更大)的函數(shù)。從一個公鑰和密文恢復出明文的難度,等價于分解兩個大素數(shù)之積(這是公認的數(shù)學難題)。

RSA加密與解密

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

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

 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";
 
 /**
 * 生成公鑰和私鑰并存儲到文件中
 * @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();//私鑰對應的字節(jié)數(shù)組
 byte[] publicKeyBytes = publicKey.getEncoded();//公鑰對應的字節(jié)數(shù)組
 Files.write(Paths.get(PRIVATE_KEY_PATH), privateKeyBytes);
 Files.write(Paths.get(PUBLIC_KEY_PATH), publicKeyBytes);
 }

加密

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

@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);
 //讀取公鑰對應的字節(jié)數(shù)組
 byte[] publicKeyCode = Files.readAllBytes(Paths.get(PUBLIC_KEY_PATH));
 //構(gòu)造公鑰,存儲起來的公鑰需要使用X509EncodedKeySpec進行讀取
 X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyCode);
 KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
 //根據(jù)已有的KeySpec生成對應的公鑰
 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算法進行解密類似。 存儲起來的私鑰需要通過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)));
 }

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

相關文章

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

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

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

    java迭代子模式詳解

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

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

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

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

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

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

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

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

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

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

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

    Jemalloc優(yōu)化MySQL和Nginx

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

    Spring Boot 利用WebUploader進行文件上傳功能

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

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

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

最新評論

正蓝旗| 蒲城县| 弥渡县| 阜南县| 田林县| 万宁市| 连城县| 淮阳县| 内江市| 华容县| 泰和县| 通化市| 运城市| 云南省| 广水市| 舒城县| 西青区| 霍州市| 宕昌县| 冷水江市| 兴和县| 防城港市| 望奎县| 腾冲县| 鸡西市| 晴隆县| 平邑县| 措勤县| 遂川县| 宜黄县| 错那县| 甘南县| 株洲县| 留坝县| 邛崃市| 疏勒县| 界首市| 河津市| 右玉县| 开远市| 隆德县|