計算機(jī)中常見的加解密技術(shù)分為兩類式镐,即對稱加密(加密和解密都使用相同的密鑰key)和非對稱加密(加密和解密使用不同的密鑰key)。對于對稱加密技術(shù)路狮,實現(xiàn)比較簡單步绸,但是由于信息傳送雙方都要接觸到這個key,所以密鑰key更加容易泄露显拜。
而對于非對稱加密(又稱為公開密鑰加密,就是RSA)中衡奥,不再只有一個密鑰key了,而是有一對(一個公鑰PK和密鑰SK)远荠,傳送過程使用PK矮固,而解密使用密鑰,相對來說更加安全譬淳。
非對稱加密的方式可以使通信雙方無須事先交換密鑰就可以建立安全通信档址,因此被廣泛應(yīng)用于身份認(rèn)證,數(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) 作為私鑰(當(dāng)然這兩者是可以互換的)揭北。
生成公鑰和私鑰之后,發(fā)送方將公鑰發(fā)送給另外一方吏颖,接收方接收到公鑰之后可以使用公鑰對數(shù)據(jù)進(jìn)行加密搔体,再將數(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));
}
}
當(dāng)然這樣的程序只能處理較小的數(shù)據(jù)梁钾,大數(shù)據(jù)時應(yīng)該自己寫大數(shù)據(jù)處理方法,來處理大數(shù)冪運(yùn)算逊抡。