使用RSA加密算法完成支付(一)

   直到今天,我纔不再認爲“RSA算法只在考試用過”,因爲最近做的支付就用到了這個算法,我纔可以有理有據地告訴我自己:“RSA不單單在考試用到啊!”。你要問我爲什麼,我只能告訴你,繼續看下去!

◔ 加密歷史

  不知道提到加密算法,正在看博客的你,最先想到的是哪種加密?

  

  我只能告訴你,我最先想到的是公鑰加密,這是一種很6的加密。因爲在公鑰加密出現之前,所有的加密都是一種模型:

 1)甲使用某種規則對文件加密,將文件和加密方式告訴乙;

 2)乙使用同一種規則對文件進行解密;

  在上述模式(也就是俗稱的“對稱加密”)中,人們不得不爲祕鑰的保存和傳遞進行擔憂,因爲在這個加密過程中,甲必須將加密的規則告訴乙,否則乙方無法完成解密;這個讓加密專家頭疼的問題一直持續到--Rivest、Shamir 和 Adleman 這三個人在1977年提出的“非對稱加密”算法。這種算法就是我們一直在說的“RSA加密算法”;

  這種算法非常可靠,因爲它使用的祕鑰越長,破解難度係數就會越高,這樣文件的傳輸過程就會越安全。據記載,目前被破解的最長RSA祕鑰是768個二進制位。也就是說,當前祕鑰長度超過768位的祕鑰,還無人能破解。所以我們基本上可以認爲:1024位的RSA祕鑰基本安全,2048位的祕鑰及其安全。

◔ RSA算法的必備知識

  要想知道RSA公鑰和私鑰的祕密,我們需要先回顧一些數學知識:素數、互質數、指數運算、模運算;下面舉一個栗子:

  主人公就是大家熟悉的:李雷和韓梅梅;

  李雷要向韓梅梅傳遞消息,但是不想輕易的被別人破解,所以對這則消息進行了加密:

  ▶ 選擇兩個不相等的比較大的質數(X,Y),並且計算出X與Y的乘積Z;

   李雷選擇的這兩個質數分別是 61和53(實際應用中,這兩個質數越大,就破解的難度係數就越高),並計算出兩個質數的乘積:Z = 61 * 53 = 3233;也就意味着當前祕鑰的長度是3233 的二進制位,也就是110010100001,一共12位,所以當前李雷使用的祕鑰就是12位;

  ▶ 使用叫 歐拉函數 的這個東西,計算出r = (X-1)(Y-1)

   計算所得:3120;

  ▶ 隨機選擇一個整數e,確保1 < e < r,而且e和r互質;

   李雷在1和3120之間隨機選擇了17,;

 ▶ 利用公式: e * d = 1(mod r)計算出一組整數解(a,b)=(2753,-15)

 ▶ 組裝私鑰和公鑰

  上述過程中,Z=3233,e=17,d=2753,所以李雷獲取到的公鑰就是(3233,17),私鑰就是(3233,2753);

 所以整個過程歸爲一張圖就是:

 

 借用一個例子給大家展示RSA算法的實例:

public class RSA {  
    /** 
     *  加密、解密算法 
     * @param key 公鑰或密鑰 
     * @param message 數據 
     * @return 
     */  
    public static long rsa(int baseNum, int key, long message){  
        if(baseNum < 1 || key < 1){  
            return 0L;  
        }  
        //加密或者解密之後的數據  
        long rsaMessage = 0L;  
          
        //加密核心算法  
        rsaMessage = Math.round(Math.pow(message, key)) % baseNum;  
        return rsaMessage;  
    }  
      
      
      
    public static void main(String[] args){  
        //基數  
        int baseNum = 3 * 11;  
        //公鑰  
        int keyE = 3;  
        //密鑰  
        int keyD = 7;  
        //未加密的數據  
        long msg = 24L;  
        //加密後的數據  
        long encodeMsg = rsa(baseNum, keyE, msg);  
        //解密後的數據  
        long decodeMsg = rsa(baseNum, keyD, encodeMsg);  
          
        System.out.println("加密前:" + msg);  
        System.out.println("加密後:" + encodeMsg);  
        System.out.println("解密後:" + decodeMsg);  
          
    }    
}  
 程序運行執行的結果爲:

加密前:24

加密後:30

解密後:24

 以上就是RSA算法加密解密的相關東西,關於支付的相關知識會在下篇中寫到,謝謝大家關注!


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