演算法描述:
(1)選擇一對不同的、足夠大的素數p,q。
(2)計算n=pq。
(3)計算f(n)=(p-1)(q-1),同時對p, q嚴加保密,不讓任何人知道。
(4)找乙個與f(n)互質的數e,且1< e < f(n)。
(5)計算d,使得de≡1 mod f(n)。這個公式也可以表達為d ≡e-1 mod f(n)
這裡要解釋一下,≡是數論中表示同餘的符號。公式中,≡符號的左邊必須和符號右邊同餘,也就是兩邊模運算結果相同。顯而易見,不管f(n)取什麼值,符號右邊1 mod f(n)的結果都等於1;符號的左邊d與e的乘積做模運算後的結果也必須等於1。這就需要計算出d的值,讓這個同餘等式能夠成立。
(6)公鑰ku=(e,n),私鑰kr=(d,n)。
(7)加密時,先將明文變換成0至n-1的乙個整數m。若明文較長,可先分割成適當的組,然後再進行交換。設密文為c,則加密過程為:
(8)解密過程為:
理論參考出處
/**@author:micro_hz
2023年8月27日
*//*
* rsa加密演算法
*/public
class
rsatest
if(i == p)}}
//已經選出了兩個質數
int n = array[0] * array[1];
int t = (array[0] - 1) * (array[1] - 1);
// n = 33;
// t = 20;
system.out.println("n: "+n+" t: "+t);
/** 選出公鑰e要去t互質,e < t
*/int e = 0;
for(int i = t - 1;i >= 2;i --)
if(q == i)
}if(e != 0)}/*
* 接下來我們來選出私鑰d,d*e mod t == 1
*/int d = 0;
while(d * e % t != 1 || e == d)
system.out.println("選出了私鑰d: "+d);
/** 都準備好了,可以加密解密了。
*///加密
// e = 3;d = 7;n = 33; t = 20;
int c = (int) (math.pow(message, e) % t);
system.out.println("加密後的資料為:"+c);
//解密
int m = (int) (math.pow(c, d) % t);
system.out.println("解密後的資料為:"+m);
return c;
}public
static
void
main(string args)}}
由於double型別的記憶體儲存空間受限,因此程式只參考作用。 RSA加密演算法
素數是這樣的整數,它除了能表示為它自己和1的乘積以外,不能表示為任何其它兩個整數的乘積。例如,15 3 5,所以15不是素數 又如,12 6 2 4 3,所以12也不是素數。另一方面,13除了等於13 1以外,不能表示為其它任何兩個整數的乘積,所以13是乙個素數。素數也稱為 質數 二 什麼是 互質數...
RSA加密演算法
演算法的描述 1.選取兩個素數p,q 2.計算n p q,fn p 1 q 1 3.選擇乙個整數e,使得e與fn的最大公約數為1,e將會用於對資料進行加密。4.計算出乙個整數d,使得d e除fn的餘數為1。d用於對密文進行解密,還原出明文。5.假設明文為m,密文為c。如果需要對原文進行加密,則進行如...
RSA加密演算法
一 rsa是公鑰加密演算法之一,該演算法的數學基礎是 1 初等數論的euler定理,即 若整數a與整數n互素,則a n 1 mod n 其中,n 為尤拉函式。2 大整數分解很困難,即給定乙個大整數n,將其分解為n p q,兩個素數乘積十分困難。二 rsa基本原理 1 金鑰的生成。選擇大素數p,q,計...