RSA算法

計算機中常見的加解密技術(shù)分為兩類,即對稱加密(加密和解密都使用相同的密鑰key)和非對稱加密(加密和解密使用不同的密鑰key)。對于對稱加密技術(shù),實現(xiàn)比較簡單,但是由于信息傳送雙方都要接觸到這個key,所以密鑰key更加容易泄露。
而對于非對稱加密(又稱為公開密鑰加密,就是RSA)中,不再只有一個密鑰key了,而是有一對(一個公鑰PK和密鑰SK),傳送過程使用PK,而解密使用密鑰,相對來說更加安全。
非對稱加密的方式可以使通信雙方無須事先交換密鑰就可以建立安全通信,因此被廣泛應(yīng)用于身份認證,數(shù)字簽名等信息交換領(lǐng)域。

1、生成公鑰和私鑰

步驟如下:

1、隨意選擇兩個比較大的素數(shù) P 和 Q ,P 不等于Q
2、將 P,Q兩個素數(shù)相乘得到一個數(shù) N,即N = PQ
3、將 P,Q 分別減一,再相乘,得到一個數(shù) T,即T = (P-1)(Q-1)
4、選擇一個整數(shù) E,作為一個密鑰,使 E與 T互質(zhì)(即 E與 T的最大公約數(shù)為1),并且E必須小于T。
5、根據(jù)公式DE mod T=1,計算出D的值,作為另外一個密鑰。
6、通過上面步驟計算出來的N,E,D這三個數(shù)據(jù),其中的(N,E)作為公鑰,(N,D) 作為私鑰(當然這兩者是可以互換的)。

生成公鑰和私鑰之后,發(fā)送方將公鑰發(fā)送給另外一方,接收方接收到公鑰之后可以使用公鑰對數(shù)據(jù)進行加密,再將數(shù)據(jù)發(fā)回原本的發(fā)送方,那么現(xiàn)在發(fā)送方就可以將數(shù)據(jù)解密得到原本的數(shù)據(jù)了。

2、用公鑰(N,E)加密數(shù)據(jù)

2、用私鑰(N,D)解密數(shù)據(jù)

3、具體的程序程序

為了計算的方便,我們?nèi)蓚€比較小的素數(shù)11和13來說明,即:

P = 11
Q = 13

    package Algorithm;
    public class RSA {

    private int N;
    private int E;
    private int D;

    public RSA(int P,int Q){
        N = P * Q;
        int T = (P-1) * (Q-1);
        //簡單的互質(zhì)方法,可以繼續(xù)優(yōu)化
        E  = T - 1;
        int i=0;
        while(true){
            if(((T * i) + 1) % E == 0){
                D = ((T * i) + 1) / E;
               break;
            }
            i++;
        }
    }

    public int addPassWord(int M){
        return Pow(M,E,N);
    }

    public int removePassWord(int C){
        return Pow(C,D,N);
    }

    private int Pow(int a,int b,int c){
        int rec = 1;
        for(int i=0;i<b;++i){
            rec = (rec * a) % c;
        }
        return rec;
    }

    public static void main(String[] args) {
        RSA rsa = new RSA(11,13);
        System.out.println("PK:(" + rsa.N + "," + rsa.E + ")");
        System.out.println("SK:(" + rsa.N + "," + rsa.D + ")");
        int M = 35;
        int C = rsa.addPassWord(M);
        System.out.println("密文:" + C);
        System.out.println("原文:" + rsa.removePassWord(C));
    }
    }

當然這樣的程序只能處理較小的數(shù)據(jù),大數(shù)據(jù)時應(yīng)該自己寫大數(shù)據(jù)處理方法,來處理大數(shù)冪運算。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容