RSA加密
是非對稱加密,由瑞弗斯特(Ron Rivest)
,沙米爾(Adi Shamir)
和阿德來門(Len Adleeman)
于1978
年提出的,它的基礎是歐拉定理,安全性依賴于大數因子分解的困難性。整個RSA加密
運算,要了解一點數論的基礎。下面在講解的時候,需要用到的數學知識,我都會在一旁做簡單標注。此文主要包括:
-
RSA
加密算法 -
RSA
加解密舉例 -
RSA
加密的安全性 -
RSA
加密算法的正確性證明
RSA加密算法
取兩個大素數
p
和q
(p ≠ q)
,記n = pq
,?(n) = (p-1)(q-1)
。選擇正整數
w
,w
與?(n)
互素,設d
是w
的模?(n)
逆,即dw ≡ 1(mod ?(n))
。
RSA密碼
算法如下:首先將明文數字化,后把明文分成若干段,每一個明文段的值小于n
,對每一個明文段m
,
加密算法c = E(m) = m^w mod n
解密算法D(c) = c^d mod n
其中加密密鑰w
和n
是公開的p
q
?(n)
和d
是保密的。
- 素數:只能被
±1
和±自己
整除的數,比如2, 3, 5, 7, 11...
- 兩數互素:除
±1
之外,沒有其他的公因子,比如2 ~ 3,7 ~ 11...
-
?(n)
:這個是歐拉函數,是指小于n
且與n
互素的正整數的個數,習慣上?(1) = 1
。算法中用到的?(n) = (p-1)(q-1)
,p
和q
為素數,是歐拉函數的一個特殊情況。特殊情況還有n
為素數時,?(n) = n - 1
。 - 模
n
同余:形如a ≡ b(mod n)
這樣的算式稱為a b
模n
同余,即a % n = b % n
- 模逆:如果
ab ≡ 1(mod m)
,即ab % m = 1
,則稱b
是a
的模m
逆;由定義可知,a
的模m
逆就是方程ax ≡ 1(mod m)
的解,其中形如ax ≡ c(mod m)
的方程稱一次同余方程。
RSA加解密舉例
A B
兩人通信,A
要傳遞信息給 B
,這時 B
公布出來加密的公鑰,A
以此將信息加密,B
收到密文以后用私鑰解密,比如:
公鑰:w = 13, n = 2537
私鑰:p = 43, q = 59, ?(n) = 2436, d = 937(根據 w 和 ?(n) 求出)
A
要傳遞的明文信息數字化之后為:m = 2106
,用公鑰加密為密文:c = 2106^13 % 2537 = 2321
B
收到密文 c = 2321
后,用私鑰解密為明文:m = 2321^937 % 2537 = 2106
上面加解密都要涉及到模冪乘運算形如:a^b(mod n)
。這兒可以利用模運算的一個性質:(a*b) % n = [(a % n) * (b % n)] % n
比如2106^13 % 2537 = [(2106 % 2537)(2106^4 % 2537)(2106^8 % 2537)] % 2537 = [(-431) * (-988) * (-601) % 2537] = 2321
求解過程可以使用遞歸求解的方式,2106^2 % 2537
可以根據 2106 % 2537
來求,2106^4 % 2537
可以根據 2106^2 % 2537
來求。比如 2106^4 % 2537 = [(2106^2 % 2537)(2106^2 % 2537)] % 2537 = (560 * 560) % 2537 = -988
RSA加密的安全性
開頭提到,RSA加密
的安全性依賴于大數因子分解的困難性。因為 n
是公鑰公布出來的,如上例中 n = 2537
很容易就可以因為分解,求得 p = 43 q = 59
,繼而求出 ?(n) = 2436, d = 937
,這樣就攻破了。但是在實際中,n
選的值一般為 1024位
的二進制整數,這么大的一個整數因式分解以目前的技術水平是不可能因式分解的,對加密要求更高的行為,n
則選為2048位
的二進制整數。
RSA加密算法的正確性證明
正確性證明需要用到費馬小定理和歐拉定理,表述如下
- 費馬小定理:若
a p
互素,則a^(p-1) ≡ 1(mod p)
。另一種表示形式a^p ≡ a(mod p)
,這種形式則不要求a p
互素。
- 歐拉定理:若
a n
互素,則a^?(n) ≡ 1(mod n)
。另一種表示形式a^?(n) ≡ a(mod n)
,這種形式則不要求a n
互素。
因為m < n
,故解密算法 D(c) = c^d mod n ? c^d ≡ m(mod n)
,又因為加密算法 c = m^w mod n
,故 c^d ≡ m(mod n) ? m^dw ≡ m(mod n)
。又因為 dw ≡ 1(mod ?(n))
,所以存在整數 k
使得 dw = k?(n) + 1
。最終轉換為證明:m^(k?(n) + 1) ≡ m(mod n)
,其中k為整數。關于此證明可以分兩種情況討論:
m
與 n
互素
由歐拉定理 m^?(n) ≡ 1(mod n) ? m^k?(n) ≡ 1(mod n) ? m^(k?(n) + 1) ≡ m(mod n)
命題得證
m
與 n
不互素
由于 m < n
,n = pq
,p
和 q
是素數且 p ≠ q
,故 m
必含 p
和 q
中的一個為因子,且只含其中的一個為因子。設 m = cp
,由費馬小定理 m^(q - 1) ≡ 1(mod q) ? m^k?(n) ≡ m^(k(p-1)(q-1)) ≡ 1^k(p-1) ≡ 1(mod q)
,從而存在整數 h
使得 m^k?(n) = hq + 1
,兩邊同乘于 m
得,m^(k?(n) + 1) = mhq + m = cphq + m = hcn + m ? m^(k?(n) + 1) ≡ m(mod n)
命題得證
總結
RSA加密
,整個過程的計算量是很大的,只有特別敏感的信息才使用RSA加密
。此文牽扯很多的數論的知識,也沒有講解的很詳細,只是用到的地方,直接給出了結論,其他一些,比如歐拉函數的通用公式,一次同余方程求解方法,費馬小定理和歐拉定理的證明過程,計算模冪乘運算的通用公式,都沒有做過多的詳解,因為這些不是此文的重點,如果你對這些感興趣,可以參考下面我列出來的這本參考書,或者和我交流溝通。這是一系列文章的其中一篇,你可以在這兒Encode & Decode集序找到他其他的兄弟。
參考
- 屈婉玲,耿素云,張立昂. 離散數學:高等教育出版社