網上都說簡單,但是我覺得這個過程事實上還是挺複雜的,這個論述不陳述原因,只陳述過程。
首先明確我們的根本目的:我們是要加密乙個資訊,再解密乙個資訊。
加密這個資訊的方法
找到兩個質數p和q,把他們倆乘起來得到n=pq;
隨便找乙個數字e,這個數字要滿足(e,
ϕ(n)
)=
1(e,\phi (n))=1
(e,ϕ(n
))=1
,這個原因我們之後說。
我們得到了乙個需要加密的資訊m
我們把這個加密的資訊m進行如下的操作mem
odn=
cm^e \; mod\; n = c
memodn
=c這個c就是我們得到的加密資訊。
非常建議手寫演示演示這個過程。
加密完了之後,我們就需要解密
首先整理我們能夠獲得的資訊有n,c。關於m,我們一無所知。
我們可以知道c由這一條方程得來: mem
odn=
cm^e \; mod\; n = c
memodn
=c我們的目標是通過這個方程獲得m
這個方程可以改寫成me≡
cmod
nm^e \equiv c \mod n
me≡cmo
dn顯然c和m^e 可以互換:c≡m
emod
nc\equiv m^e \mod n
c≡memo
dn顯然c和m^e 新增乙個冪次,對結果沒有影響:cd≡
medm
od
nc^d\equiv m^ \mod n
cd≡med
modn
在這一步中,我們的目標是把m^ed 消掉變成乙個m,我們就可以計算出模乙個m的值了。
回想尤拉定理mϕ(
n)≡1
modn
m^\equiv 1 \mod n
mϕ(n)≡
1mod
n,如果ed=
ϕ(n)
ed=\phi(n)
ed=ϕ(n
),那麼m就會變成1,如果ed=
ϕ(n)
+1
ed=\phi(n)+1
ed=ϕ(n
)+1,那麼med
=mϕ(
n)+1
m^=m^
med=mϕ
(n)+
1就可以化成m了。
所以我們就可以得到一條方程,ed=
k∗ϕ(
n)+1
ed=k*\phi(n)+1
ed=k∗ϕ
(n)+
1,這條式子移項ed−
k∗ϕ(
n)=1
ed-k*\phi(n)=1
ed−k∗ϕ
(n)=
1得到乙個丟番圖方程,d和k是未知數,我們可以通過歐幾里得演算法解得d和k。
將d帶回5式,則有cdm
odn=
mc^d \; mod \; n = m
cdmodn
=m,m就被解出來了。
大體的感知,還有實際的案例,可以參見知乎的這篇
RSA演算法簡單例項
1 選擇一對不同的 足夠大的素數p,q。2 計算n pq。3 計算f n p 1 q 1 同時對p,q嚴加保密,不讓任何人知道。4 找乙個與f n 互質的數e,且1 取p 3 q 11 則 n pq 33 f n p 1 q 1 20,在1到20中取e與20互質,取e 3 也可以取其他 d 3 1 ...
詳細介紹匈牙利演算法步驟
這篇部落格介紹了匈牙利演算法的操作步驟,不討論原理。作用解決指派問題。所謂的指派問題就比如 甲乙丙三個人去做abc三件事情。每個人做每件事情所花的時間可能不一樣。每個人只能安排一件事情,問怎樣安排才能使三個人所工作的時間之和最小?擴充套件成 n 個人 n 件事也可以,但要求是 例項 甲乙丙中第i i...
A 演算法計算步驟總結
a 演算法計算步驟總結 1,從點a開始,並且把它作為待處理點存入乙個 開啟列表 儘管現在列表裡只有乙個元素,但以後就會多起來。你的路徑可能會通過它包含的方格,也可能不會,這是乙個待檢查方格的列表。2,尋找a點周圍所有可到達或者可通過的方格,跳過有牆,水,或其他無法通過地形的方格。也把他們加入開啟列表...