加密解密RSA+AES。(一)

數據加密技術的介紹及實踐過程。

1.背景

1.1 數據加密

指利用密碼技術信息進行加密,實現信息隱蔽,從而達到保證信息安全的目的。按照作用的不同,數據加密的技術分爲數據傳輸加密技術,數據存儲加密技術,數據完整性鑑別技術和密鑰管理技術。

1.1.1數據傳輸加密技術:

有線路加密和端對端加密兩種。

端對端加密指信息由發送端自動加密,並且由TCP/IP進行數據包封裝,然後作爲不可閱讀和不可識別的數據穿過互聯網,當這些信息到達目的地,將被自動重組、解密,而成爲可讀的數據。

1.1.2數據存儲加密技術:

有密文存儲和存取控制兩種。前者一般是通過加密算法轉換、附加密碼、加密模塊等方法實現;後者則是對用戶資格、權限加以審查和限制,防止非法用戶存取數據或合法用戶越權存取數據。

1.1. 3數據完整性鑑別技術

目的是對介入信息傳送、存取和處理的人的身份和相關數據內容進行驗證,一般包括口令、密鑰、身份、數據等項的鑑別。系統通過對比驗證對象輸入的特徵值是否符合預先設定的參數,實現對數據的安全保護。

2.算法基本介紹

2.1 加密算法

2.1.1 對稱加密

兩個用戶之間進行信息交流,約定好使用相同的某個密鑰。一方將傳輸的報文用私鑰加密,得到密文。另一方接收到密文,用密鑰解密,得到明文。這個算法中最重要的就是兩人之間的密鑰要保密好。同時,由於每兩個用戶之間就需要一個約定的密鑰,因而N個用戶之間,就需要N*(N-1)個密鑰,這對企業的密鑰管理是個難題。

2.1.2 非對稱加密

   需要一對密鑰,分別是公鑰和私鑰。如果用公鑰加密明文,需要用對應的私鑰才能解密明文。如果用私鑰對明文加密,則需要用對應的公鑰進行解密。當然,因爲公鑰和私鑰是有不同的要求標準的,私鑰是比公鑰要遠遠符合密碼學安全標準的。所以私鑰應當保密並用來解密文件,而公鑰可以公佈並加密,不應當將二者互換使用。

   甲方生成一對密鑰,將公鑰通知乙方,乙方利用公鑰加密報文,然後發給甲方,甲方接收到密文然後再用私鑰解密,得到報文。

因爲加密和解密用的是不同的密鑰,所以被叫做非對稱加密算法。

3.使用場景

3.1 對稱加密算法的使用場景。

3.1.1 當客戶端與服務器端之間傳遞數據時,可以使用對稱加密算法AES。比對在客戶端對用戶輸入的敏感信息加密傳輸到服務器端,或者在服務器端加密token傳遞到客戶端。

3.2 非對稱加密算法的使用場景。

3.2.1 RSA公鑰加密體制

包含如下3個算法:KeyGen(密鑰生成算法),Encrypt(加密算法)以及Decrypt(解密算法)。

RSA公鑰加密算法邏輯如下:

① (PK,SK)ßKeyGen(λ) 密鑰生成算法以安全常數λ作爲輸入,輸出一個公鑰PK,和一個私鑰SK。安全常數用於確定這個加密算法的安全性有多高,一般以加密算法使用的質數p的大小有關。 λ越大,質數p一般越大,保證密鑰有更高的安全性。

在RSA中,密鑰生成算法如下:算法首先隨機產生兩個不同大質數p和q,計算N=pq。隨後,計算歐拉函數N0= (p-1)(q-1)。接下來,算法隨機選擇一個小於N0的整數e,並計算e關於的模反元素d。最後,公鑰爲PK=(N, e),私鑰爲SK=(N,
d)。

② (CT) ßEncrypt(PK,M) 加密算法以公鑰PK和待加密的消息M作爲輸入,輸出密文CT。

③ MßDecrypt(SK,CT)
解密算法以私鑰SK和密文CT作爲輸入,輸出消息M。

3.2.2 RSA簽名算法

結合非對稱加密算法和數字摘要算法。還包含如下3個算法:KeyGen(密鑰生成算法),Sign(簽名算法),Verify(驗證算法)。

(補充:數字摘要算法,例如MD5,用散列算法對報文進行摘要,得到固定長度(128位)的密文,這一串密文亦被稱作數字指紋。因爲不同的報文得到的摘要,結果不同,而相同的報文得到的摘要必定相同。因而常用於簽名驗證。)

RSA簽名算法邏輯如下:

① (PK,SK)ßKeyGen(λ)密鑰生成算法同樣以安全常數λ作爲輸入,輸出一個公鑰PK和一個私鑰SK。

② óßSign(SK,M)簽名算法以私鑰SK和待簽名的消息M作爲輸入參數,輸出簽名ó。在RSA簽名中,簽名算法直接輸出簽名爲ó。

③ bßVerify(PK,
ó,M)驗證算法以公鑰PK,簽名ó以及消息M作爲輸入,輸出一個比特值b。b=1意味着驗證通過。b=0意味着驗證不通過。在RSA簽名中,驗證算法首先計算,隨後對比M’與M,如果相等,則輸出b=1,否則輸出b=0。

在簽名算法中,私鑰用於對數據進行簽名,公鑰用於對簽名進行驗證。這也可以直觀地進行理解:對一個文件簽名,當然要用私鑰,因爲我們希望只有自己才能完成簽字。驗證過程當然希望所有人都能夠執行,大家看到簽名都能通過驗證證明確實是我自己籤的。

4.Demo

客戶端加密過程主要分爲以下三個步驟:1.客戶端隨機產生AES的密鑰;2.對身份證信息(重要信息)進行AES加密;3.通過使用RSA對AES密鑰進行公鑰加密。

這樣在傳輸的過程中,即時加密後的AES密鑰被別人截取,對其也無濟於事,因爲他並不知道RSA的私鑰,無法解密得到原本的AES密鑰,就無法解密用AES加密後的重要信息。
我們這裏模擬客戶端和服務端,對算法邏輯進行驗證。

package RSAAES;
import sun.security.krb5.internal.crypto.Aes128;
public class TestEncrypt {
    public static void main(String[] args) throws Exception {
        String key = AESUtils.generateKey();
        String name = "wujj";
        String idCard = "444200002939402";
        String encryptName = AESUtils.encryptData(key, name);
        String encryptCard = AESUtils.encryptData(key, idCard);
        String encryptKey = RSAUtils.encryptByPublicKey(key);
        System.out.println("使用RSA加密後的AES密鑰: " + encryptKey);
        System.out.println("使用AES加密後的Name " + encryptName + "  使用AES加密後的Card :" + encryptCard);
    }
}

執行結果如下:
在這裏插入圖片描述
服務端使用RSA0+ AES對重要信息進行解密

服務端解密過程主要分爲以下兩個步驟:1.對加密後的AES密鑰進行RSA私鑰解密,拿到密鑰原文;2.對加密後的重要信息進行AES解密,拿到原始內容。

package RSAAES;

public class Demo {
    public static void main(String[] args) throws Exception {
        String encryptKey = "W42a322SBoRZKTSLaczF74uUyAxGMFZSgvZWeWnEf+v7AlfTYo8Ie0JLUJpXMMfCjt3i+AlX+8M+Wd1FiEgwgkXwaObvqhqLdwYEybHdyYLE6XcUjn/vqSl/Z3jhKrYi5H+X6RZ70BVYDXki2q4vLPOfL8rECZywRPnl1+tAI7E=";
        String encryptName = "Y5zy9Pf6h8jx/xTETt/2BA==";
        String encryptCard = "7XVmAnoZsqq44aEOySVlsg==";
        //解密
        String key = RSAUtils.decryptByPrivateKey(encryptKey);
        String name = AESUtils.decryptData(key,encryptName);
        String idCard = AESUtils.decryptData(key,encryptCard);
        System.out.println("使用RSA解密後的AES密鑰: " + encryptKey);
        System.out.println("使用AES解密後的Name " + name + "  使用AES解密後的Card :" + idCard);

    }
}

在這裏插入圖片描述
這樣我們就粗略地驗證了加密解密算法,那代碼裏的算法工具類RSAUtils和AESUtils的邏輯到底是怎麼樣的呢?有興趣的可以去看下一篇博客。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章