1. 程式人生 > >java 加密之RSA演算法加密與解密的例項詳解

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

前言:

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

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

RSA加密與解密

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

java.security.KeyPairGenerator來產生。以下是一個生成金鑰對的示例,該示例中還將生成的金鑰對分別儲存到了檔案中。

?
1234567891011121314151617181920private 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*/@Testpublic 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();//私鑰對應的位元組陣列byte[] publicKeyBytes = publicKey.getEncoded();//公鑰對應的位元組陣列Files.write(Paths.get(PRIVATE_KEY_PATH), privateKeyBytes);Files.write(Paths.get(PUBLIC_KEY_PATH), publicKeyBytes);}

加密

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

?
12345678910111213141516171819202122232425@Testpublic 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);//讀取公鑰對應的位元組陣列byte[] publicKeyCode = Files.readAllBytes(Paths.get(PUBLIC_KEY_PATH));//構造公鑰,儲存起來的公鑰需要使用X509EncodedKeySpec進行讀取X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyCode);KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);//根據已有的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)生成私鑰。

?
12345678910111213141516171819/*** 私鑰解密* @throws Exception*/@Test

相關推薦

java 加密RSA演算法加密解密例項

前言:  RSA是第一個比較完善的公開金鑰演算法,它既能用於加密,也能用於數字簽名。RSA以它的三個發明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,這個演算法經受住了多年深入的密碼分析,雖然密碼分析者既不能證明也不能否定R

非對稱加密RSA演算法

1977年,MIT的三位老師Rivest、Shamir 和 Adleman 設計了一種演算法,可以實現非對稱加密。這種演算法以他們三個人的名字命名為RSA。RSA演算法是使用最為廣泛的非對稱加密演算法。 RSA加密利用了單向函式正向求解很簡單,反向求解很複雜的特

java基礎JDBC一:概述及步驟

etx fileread 操作 [] 全路徑 api mysql edi lean 1. JDBC的簡介 概述: 就是Java用來操作不同數據庫(DBMS)的類庫(技術), 本質就是一些類和接口. /* 類: Dri

C++虛函數虛繼承

類繼承 file 文件 技術分享 函數表 命令行 .com G1 mes 準備工作 1、VS2012使用命令行選項查看對象的內存布局 微軟的Visual Studio提供給用戶顯示C++對象在內存中的布局的選項:/d1reportSingleClassLayout。使用方法

#Java怎麼學?2018最新Java學習路線,技術要求專案推薦

一 基礎篇 很多人認為,java的基礎應該是C語言,這個不可否認,但是也不能說完全正確,因為兩個語言技術的內涵是不一樣的,C語言是面向語言程式設計而java語言是面向物件程式設計,打個比喻,C語言大多數是做系統應用,而java是做企業級應用的。所以,學Java不一定要學C,Java簡化了C,而在

[JVM]Java生產環境下效能監控調優_Btrace

本章關鍵詞:BTrace、攔截、注意事項 一、入門 1.做什麼的? 可以在應用程式不重啟,不修改的情況下,正在執行的情況下,動態的修改位元組碼,達到監控除錯的目的 可以動態的向目標應用程式的位元組碼注入追蹤程式碼 用到的技術 JavaComplierApi、J

Java生產環境下效能監控調優

第8章 JVM位元組碼與Java程式碼層調優 本章帶大家學習JVM的位元組碼指令,從位元組碼層面講解一些常見問題的底層原理(面試能回答上的話, 絕對加分),比如:i++和++i哪一種效率高?迴圈體中做字串+拼接為什麼效率低?然後會重點對String做講解,包括String常量池的變化、String字面

Java生產環境下效能監控調優 第6章 Nginx效能監控調優

第6章 Nginx效能監控與調優 6-1 nginx安裝 6-2 ngx_http_stub_status監控連線資訊 6-3 ngxtop監控請求資訊 6-4 nginx-rrd圖形化監控

iOS開發: Apple DeveloperProvisioning Profile(Certificate) Code Signing

所謂“免證書”真機除錯,並不是真的不需要證書,Xcode真機除錯原有的證書配置體系仍在——All iOS, tvOS, and watchOS appsmust be code signed and provisioned to launch on a device. 所以,上文囉嗦幾千字還是有點用的。自

Java安全學習筆記(十一)-RSA演算法加密解密

RSA演算法是使用整數進行加密和解密運算的, 加密:在RSA公鑰中包含了兩個資訊:公鑰對應的整數e和用於取模的整數n。對於明文數字m,計算密文的公式是: m^e mod n. 解密:跟加密類似,私鑰對應的指數e和用於取模的整數m.其中模m和加密時的加密的模

Java中利用RSA演算法進行加密解密

首先需要兩個工具類 package cnsts.common.utils; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.IOException; i

iOS常用加密RSA加密解密

pen style 工作 eight else mark 分段 load port 前言: iOS常用的加密有很多種,前兩天在工作中遇到了RSA加密,現在把代嗎分享出來。 RSA基本原理 RSA使用"秘匙對"對數據進行加密解密.在加密解密數據前,需要先生成公鑰(publi

關於JAVARSA加簽籤,私鑰加密公鑰解密和公鑰加密私鑰解密程式碼

在專案中遇到的問題百度了許久總結出來的 私鑰加密公鑰解密和公鑰加密私鑰解密。 一般為了安全採用的是私鑰加密,公鑰解密(公鑰可以用Base64轉換後公開) package com.paic.ebank.creditcard.common.util; import java.s

Java實現訊息摘要演算法加密

訊息摘要演算法: MD(Message Digest) 訊息摘要 SHA(Secure Hash Algorithm) 安全雜湊 MAC(Message Authentication Code) 訊息認證碼 作用:(驗證資料完整性、數字簽名核心演算法) 將輸入的任意長度序列資

【資料結構演算法排序全家桶(十大排序及其Java實現)---第七篇

本篇文章彙總了10種場常見的排序演算法,篇幅較長,可以通過下面的索引目錄進行定位查閱: 7、桶排序 一、排序的基本概念 1、排序的定義 排序:就是使一串記錄,按照其中的某個或者某些關鍵字的大小,遞增或遞減的排列起來

RSA演算法加密

摘錄至吳軍教授的數學之美第二版 以單詞Caesar加密和解密為例。首先,把它變成一組數,比如它的ASCII程式碼X=067097101115097114(每三位代表一個字母)做明碼。現在來設計一個密碼系統,對這個明碼加密。 1.找兩個很大的素數P Q,越大越好,比如10

jdbc 加密 DES 演算法

1.沒有加密前,我們的 jdbc.propertites 檔案的資訊上這樣的: #沒有加密的 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/o2o?useUnicode=true

Android資料加密Rsa加密

前言:      最近無意中和同事交流資料安全傳輸的問題,想起自己曾經使用過的Rsa非對稱加密演算法,閒下來總結一下。      其他幾種加密方式: 什麼是Rsa加密? RSA演算法是最流行的公鑰密碼演算法,使用長度可以變化的金鑰。RSA是第一個既能用於資料加密也能用於數字簽名的演算法。RSA演算

Android資料加密異或加密演算法

前言:       這幾天被公司臨時拉到去做Android IM即時通訊協議實現,大致看了下他們定的協議,由於之前沒有參與,據說因伺服器效能限制,只達成非明文傳遞,具體原因我不太清楚,不過這裡用的加密方式是採用異或加密。這種加密方式在之前做Android加密記事本的時候採用過這種加密方式。今天已經把客戶端心跳

Android資料加密RSA+AES混合加密

在上一篇Android資料加密 中已經介紹了Android中資料加密的情況,並且在總結中給出了RSA+AES混合加密的方案,下面就來介紹一下RSA+AES混合加密。 1.RSA+AES混合加密過程 Android端的資料加密過程: -首先生成一對