NIST美國國家標準與科技機構發起的Public Key公開金鑰加解密系統競賽,RSA (Rivest–Shamir–Adleman)加密演算法由三位密碼學家共同研究出來在1973年發表,最終獲選最早為公開金鑰系統標準之一,雖然後來英國Government Communications Headquarters(GCHQ)國家通訊總部說他們的英國密碼學家早在1970年就已經研究出Non-Secret Encryption這種非對稱式加解密系統,但不管怎麼說,RSA在當時算是非常突破性的成果。
首先選擇兩個隨機的大質數p p p 和q q q ,通常教科書或老師說要取大質數
那怎樣的質數才算大?
參考整數複雜度量測 之後討論都使用多少bit長度為單位,以及p p p 和q q q 這兩個大質數的長度要很接近,用來計算n n n : n = p q n = pq n = pq 並且 φ ( n ) = ( p − 1 ) ( q − 1 ) \varphi(n) = (p-1)(q-1) φ ( n ) = ( p − 1 ) ( q − 1 ) ,如上所說挑選出來的是l e n ( p − 1 ⋅ q − 1 ) len(p-1 \cdot q-1) l e n ( p − 1 ⋅ q − 1 ) 的長度。
φ ( n ) \varphi(n) φ ( n ) 可以參考Euler’s Totient Function尤拉函數 ,目的是為了找所有與n n n 互質的數,p p p 和q q q 挑質數的原因在於在p p p 之下,每一個數都會跟p p p 互質,同樣的在q q q 之下每一個數也都會跟q q q 互質,這樣乘出來n n n 群的範圍就會是最大的。
接著隨機挑選一個e ∈ Z n e \in Z_{n} e ∈ Z n 並且e ⊥ φ ( n ) e\perp\varphi(n) e ⊥ φ ( n ) ,這個e e e 之後就會用來當作公鑰,接著使用公鑰計算私鑰d d d :
d = e − 1 m o d φ ( n ) d = e^{-1} \>\> mod \>\> \varphi(n) d = e − 1 m o d φ ( n ) ,d d d 就是e e e 的乘法反元素,如此一來,公鑰就是p k = ( e , n ) pk = (e, n) p k = ( e , n ) ,而私鑰就是s k = ( d , n ) sk = (d, n) s k = ( d , n ) 。
選一個想要加密的明文Message m ∈ Z n m \in Z_{n} m ∈ Z n :
c = E ( p k , m ) = m e m o d n c = E(pk, m) = m^{e} \>\> mod \>\> n c = E ( p k , m ) = m e m o d n : 加密時使用接收者的公鑰進行加密。
接收者收到傳輸者加密過後的密文 Ciphertext c ∈ Z n c \in Z_{n} c ∈ Z n :
m = D ( s k , c ) = c d m o d n m = D(sk, c) = c^{d} \>\> mod \>\> n m = D ( s k , c ) = c d m o d n : 解密時接者者使用只有自己知道的私鑰進行解密。
私鑰是由公鑰所計算得來的d = e − 1 m o d φ ( n ) d = e^{-1} \>\> mod \>\> \varphi(n) d = e − 1 m o d φ ( n ) ,可以調換成e d = k φ ( n ) + 1 ed = k\varphi(n)+1 e d = k φ ( n ) + 1 ,原因是使用費馬小定理Fermat’s Little Theorem:
a p − 1 ≡ 1 ( m o d p ) a^{p-1} \equiv 1 \>\> (mod \>\> p) a p − 1 ≡ 1 ( m o d p ) ,a ∈ Z p a \in Z_{p} a ∈ Z p 為非零整數,p p p 為質數。
以及中國餘式定理Chinese Remainder Theorem:
如果x = a ( m o d p ) x = a \>\> (mod\>\> p) x = a ( m o d p ) 以及x = a ( m o d q ) x = a \>\>(mod\>\> q) x = a ( m o d q ) 代表x = a ( m o d p q ) x = a \>\>(mod\>\> pq) x = a ( m o d pq ) ,p q pq pq 為互質的兩數。
所以需要證明的是m = c d ( m o d n ) = ( m e m o d n ) d m o d n = m e d m o d n m = c^{d} \>\> (mod \>\> n) = (m^{e} \>\> mod \>\> n)^{d} \>\> mod \>\> n = m^{ed} \>\> mod \>\> n m = c d ( m o d n ) = ( m e m o d n ) d m o d n = m e d m o d n
如前面中國餘式定理所述m = c d ( m o d n ) m = c^{d} \>\>(mod\>\> n) m = c d ( m o d n ) 可以拆成m = c d ( m o d p ) m = c^{d} \>\>(mod\>\> p) m = c d ( m o d p ) 以及m = c d ( m o d q ) m = c^{d} \>\>(mod\>\> q) m = c d ( m o d q ) 使得c d = m e d ( m o d p ) c^{d} = m^{ed} \>\>(mod \>\> p) c d = m e d ( m o d p ) 可以成立,再者e d = 1 ( m o d φ ( n ) ) ed = 1 \>\>(mod \>\> \varphi(n)) e d = 1 ( m o d φ ( n )) 使得e d = 1 ( m o d ( p − 1 ) ( q − 1 ) ) ed = 1 \>\>(mod \>\>(p-1)(q-1)) e d = 1 ( m o d ( p − 1 ) ( q − 1 ))
可以將e d = 1 ( m o d ( p − 1 ) ( q − 1 ) ) ed = 1 \>\>(mod \>\>(p-1)(q-1)) e d = 1 ( m o d ( p − 1 ) ( q − 1 )) 在modular運算看成e d = k ( p − 1 ) ( q − 1 ) + 1 ed = k(p-1)(q-1) + 1 e d = k ( p − 1 ) ( q − 1 ) + 1 ,k k k 必須大於0。
m e d = m k ( p − 1 ) ( q − 1 ) + 1 ( m o d p ) = m ⋅ m k ( p − 1 ) ( q − 1 ) ( m o d p ) = m ⋅ ( m ( p − 1 ) ) k ( q − 1 ) ( m o d p ) ( F e r m a t ′ s L i t t l e T h e o r e m ) = m ⋅ ( 1 ) k ( q − 1 ) ( m o d p ) = m ( m o d p ) m^{ed}\\ = m^{k(p-1)(q-1)+1} \>\>(mod\>\> p)\\ = m \cdot m^{k(p-1)(q-1)} \>\>(mod \>\>p)\\ = m \cdot (m^{(p-1)})^{k(q-1)} \>\>(mod\>\> p) \>\> \>\> (Fermat's\>\> Little \>\>Theorem)\\ = m \cdot (1)^{k(q-1)} \>\>(mod \>\>p)\\ = m \>\>(mod\>\> p) m e d = m k ( p − 1 ) ( q − 1 ) + 1 ( m o d p ) = m ⋅ m k ( p − 1 ) ( q − 1 ) ( m o d p ) = m ⋅ ( m ( p − 1 ) ) k ( q − 1 ) ( m o d p ) ( F er ma t ′ s L i ttl e T h eor e m ) = m ⋅ ( 1 ) k ( q − 1 ) ( m o d p ) = m ( m o d p )
同理在m o d q mod \>\> q m o d q 也可行:
m e d = m k ( p − 1 ) ( q − 1 ) + 1 ( m o d q ) = m ⋅ m k ( p − 1 ) ( q − 1 ) ( m o d q ) = m ⋅ ( m ( q − 1 ) ) k ( p − 1 ) ( m o d q ) ( F e r m a t ′ s L i t t l e T h e o r e m ) = m ⋅ ( 1 ) k ( p − 1 ) ( m o d p ) = m ( m o d q ) m^{ed}\\ = m^{k(p-1)(q-1)+1} \>\>(mod\>\> q)\\ = m \cdot m^{k(p-1)(q-1)} \>\>(mod \>\>q)\\ = m \cdot (m^{(q-1)})^{k(p-1)} \>\>(mod\>\> q) \>\> \>\> (Fermat's\>\> Little\>\> Theorem)\\ = m \cdot (1)^{k(p-1)} \>\>(mod \>\>p)\\ = m \>\>(mod\>\> q) m e d = m k ( p − 1 ) ( q − 1 ) + 1 ( m o d q ) = m ⋅ m k ( p − 1 ) ( q − 1 ) ( m o d q ) = m ⋅ ( m ( q − 1 ) ) k ( p − 1 ) ( m o d q ) ( F er ma t ′ s L i ttl e T h eor e m ) = m ⋅ ( 1 ) k ( p − 1 ) ( m o d p ) = m ( m o d q )
得證m e d = m ( m o d p ) m^{ed} = m \>\>(mod \>\>p) m e d = m ( m o d p ) 以及m e d = m ( m o d q ) m^{ed} = m \>\>(mod\>\> q) m e d = m ( m o d q ) 所以m e d = m ( m o d n ) = c ′ m^{ed} = m \>\>(mod \>\>n) = c' m e d = m ( m o d n ) = c ′
非對稱式加密系統的安全性都倚靠數學難題,而計算這些金鑰大多使用軟體像是openssl等,當然也有像是特殊的加解密硬體機器可以使用,一台也不便宜,所以幾乎都是企業才會去採購,故網路上的伺服器幾乎都是使用軟體的方法在計算,但在網路上每秒有多少組金鑰對正在產生,而軟體的計算速度也不能太慢,故可以使用一些小方法來提昇效率。
像是使用特殊的e e e ,通常會是$2^{x}+1$,再將e e e 轉換成二進制,使用square-multiply algorithm來加快計算速度。
舉例3 = 11(b), 17 = 10001(b), 65537 = 10000000000000001(b)使用 Square and Multiply 演算法 計算c = m e m o d n c = m^{e} \>\> mod \>\> n c = m e m o d n 只需要少量的乘法就可以。
另外就是透過中國餘式定理與同構特性 的特性計算m = c d m o d n m = c^{d} \>\> mod \>\> n m = c d m o d n :
首先設定s k = ( d 1 , d 2 , n , p , q ) sk = (d_{1}, d_{2}, n, p, q) s k = ( d 1 , d 2 , n , p , q ) 其中d 1 = d m o d p − 1 , d 2 = d m o d q − 1 d_{1} = d \>\> mod \>\> p-1, d_{2} = d \>\> mod \>\> q-1 d 1 = d m o d p − 1 , d 2 = d m o d q − 1
接著預先計算q ‾ = q ( q − 1 m o d p ) m o d n \overline{q} = q(q^{-1} \>\> mod \>\> p)\>\> mod\>\> n q = q ( q − 1 m o d p ) m o d n 以及p ‾ = p ( p − 1 m o d q ) m o d n \overline{p} = p(p^{-1} \>\> mod \>\> q)\>\> mod \>\> n p = p ( p − 1 m o d q ) m o d n
就可以計算m 1 = ( c m o d p ) d 1 m o d p m 2 = ( c m o d q ) d 2 m o d q m = ( m 1 q ‾ + m 2 p ‾ ) m o d n m_{1} = (c \>\> mod \>\> p)^{d_{1}}\>\> mod \>\> p \\ m_{2} = (c \>\> mod \>\> q)^{d_{2}} \>\> mod \>\> q \\ m = (m_{1}\overline{q} + m_{2} \overline{p}\>\>\>\>) \>\> mod \>\> n m 1 = ( c m o d p ) d 1 m o d p m 2 = ( c m o d q ) d 2 m o d q m = ( m 1 q + m 2 p ) m o d n
軟體的話可以利用平行運算分別計算m 1 m_{1} m 1 以及m 2 m_{2} m 2
是假設私鑰d d d 挑選的值: d < n 1 / 4 d < n^{1/4} d < n 1/4 以及p − 1 , p + 1 , q − 1 , q + 1 p-1, p+1, q-1, q+1 p − 1 , p + 1 , q − 1 , q + 1 沒有挑選大質數以及∣ p − q ∣ |p - q| ∣ p − q ∣ 數值很小,p p p 跟q q q 很接近的話( n = 2048 b i t s ← p = 1024 b i t s , q = 1024 b i t s ) (n = 2048\>\> bits \gets p = 1024 \>\> bits, q = 1024 \>\> bits) ( n = 2048 bi t s ← p = 1024 bi t s , q = 1024 bi t s ) 代表( p − q ) 2 / 4 {(p-q)^{2}}/{4} ( p − q ) 2 / 4 也會很小,而( p + q ) 2 / 4 {(p+q)^{2}}/{4} ( p + q ) 2 / 4 會比 n n n 再大一些,至少n = ( p + q ) 2 / 4 − ( p − q ) 2 / 4 n = {(p+q)^{2}}/{4} - {(p-q)^{2}}/{4} n = ( p + q ) 2 / 4 − ( p − q ) 2 / 4 ,所以p + q / 2 {p+q}/{2} p + q / 2 會比⌈ n ⌉ \lceil \sqrt{n} \rceil ⌈ n ⌉ 大一些。
首先我們計算z = ⌈ n ⌉ z = \lceil \sqrt{n} \rceil z = ⌈ n ⌉ 是y = z + i , i ≥ 0 y = z + i, i \geq 0 y = z + i , i ≥ 0 取得這個y y y 之後看y 2 − n y^{2} - n y 2 − n 是不是一個平方數x 2 x^{2} x 2 ,如果是的話x x x 有可能會是x = p − q / 2 x = {p-q}/{2} x = p − q / 2 ,如果x x x 是一個平方數的話,可以看成是n分解成( x − y ) ( x + y ) = p q (x-y)(x+y) = pq ( x − y ) ( x + y ) = pq
針對弱參數的對策就是p p p 的bit數應該要比q q q 在少一些,不能夠讓bit數太接近。
假設一組n = p q n = pq n = pq 用來產生兩對金鑰給兩個使用者:
( p k 1 , s k 1 ) = ( ( e 1 , n ) , ( d 1 , n ) ) ( p k 2 , s k 2 ) = ( ( e 2 , n ) , ( d 2 , n ) ) (pk_{1}, sk_{1}) = ((e_{1}, n), (d_{1}, n)) \\ (pk_{2},sk_{2}) = ((e_{2}, n), (d_{2}, n)) ( p k 1 , s k 1 ) = (( e 1 , n ) , ( d 1 , n )) ( p k 2 , s k 2 ) = (( e 2 , n ) , ( d 2 , n ))
可以使用其中一對的金鑰去搜尋另一對的金鑰,假設今天知道user1的金鑰要猜user2的私鑰:
( p k 1 , s k 1 , p k 2 ) → s k 2 ′ = ( d 2 ′ , n ) , d 2 ′ = e 2 − 1 m o d ( e 1 d 1 − 1 ) (pk_{1}, sk_{1}, pk_{2}) \to sk_{2}' = (d_{2}', n), d_{2}' = e_{2}^{-1} \>\> mod \>\> (e_{1}d_{1} -1) ( p k 1 , s k 1 , p k 2 ) → s k 2 ′ = ( d 2 ′ , n ) , d 2 ′ = e 2 − 1 m o d ( e 1 d 1 − 1 ) ,e 1 d 1 − 1 e_{1}d_{1}-1 e 1 d 1 − 1 就是k ⋅ φ ( n ) k \cdot \varphi(n) k ⋅ φ ( n )
以及假設一個M e s s a g e m Message \>\>m M ess a g e m 同時被這兩個使用者加密,竊聽者可以取得c 1 = m e 1 m o d n c_{1} = m^{e_{1}} \>\> mod \>\> n c 1 = m e 1 m o d n 跟c 2 = m e 2 m o d n c_{2} = m^{e_{2}} \>\> mod \>\> n c 2 = m e 2 m o d n ,可以計算s , t s, t s , t 用來:
c 1 s c 2 t m o d n = m s e 1 + t e 2 m o d n = m c_{1}^{s}c_{2}^{t} \>\> mod \>\> n = m^{se_{1}+te_{2}} \>\> mod \>\> n = m c 1 s c 2 t m o d n = m s e 1 + t e 2 m o d n = m ,當然先決條件是:
s e 1 + t e 2 = 1 se_{1}+te_{2} = 1 s e 1 + t e 2 = 1 ,並且e 1 ⊥ e 2 e_{1} \perp e_{2} e 1 ⊥ e 2
針對共同模數攻擊的對策是盡量不要使用同一個n n n 群產生太多把金鑰對,以及盡量不要加密同一個明文太多次。
在早期許多伺服器使用e = 3 e = 3 e = 3 當作公開金鑰,但風險就是如果m m m 只要被三個使用者用e = 3 e=3 e = 3 來加密的話,竊聽者可以取得這些密文c c c :
c 1 = m 3 m o d n 1 c 2 = m 3 m o d n 2 c 3 = m 3 m o d n 3 c_{1} = m^{3} \>\> mod \>\> n_{1} \\ c_{2} = m^{3} \>\> mod \>\> n_{2} \\ c_{3} = m^{3} \>\> mod \>\> n_{3} c 1 = m 3 m o d n 1 c 2 = m 3 m o d n 2 c 3 = m 3 m o d n 3
前面提到使用中國餘式定理CRT可以計算共同的數,c = c 1 c 2 c 3 m o d n = m 3 m o d n 1 n 2 n 3 = m 3 c = c_{1}c_{2}c_{3} \>\> mod \>\> n = m^{3} \>\> mod \>\> n_{1}n_{2}n_{3} = m^{3} c = c 1 c 2 c 3 m o d n = m 3 m o d n 1 n 2 n 3 = m 3
而m = c 1 / 3 = ( m 3 ) 1 / 3 m = c^{1/3} = (m^{3})^{1/3} m = c 1/3 = ( m 3 ) 1/3 使用三次方根演算法就能快速解開取得m m m 了,針對低指數攻個的對策就是e e e 不要挑選太小
這種攻擊方法需要倚靠Oracle讓攻擊者可以取得明文密文對,可以將oracle想成一張很大的表,系統提供一個Decryption Oracle O e , n O_{e, n} O e , n 給這oracle一個使用者自己挑選的密文c c c ,oracle會回傳一個m = c d m o d n m = c^{d} \>\> mod \>\> n m = c d m o d n ,唯一的限制就是攻擊者不能要求解開真正想知道的明文密文對,攻擊者只能挑選想破解的密文之外的其他密文,擁有解密oracle後攻擊者要如何攻擊?
透過原本的c c c 關聯性計算c ′ = c r e m o d n c' = cr^{e} \>\> mod \>\> n c ′ = c r e m o d n ,r ∈ R Z n ∗ r \in_{R} Z_{n}^{*} r ∈ R Z n ∗
詢問oracle O e , n ( c ′ ) → m ′ O_{e, n}(c') \to m' O e , n ( c ′ ) → m ′ ,這個m ′ = m ⋅ r m' = m \cdot r m ′ = m ⋅ r
最後計算m ′ r − 1 m o d n = m r r − 1 m o d n = m m'r^{-1} \>\> mod \>\> n = mrr^{-1} \>\> mod \>\> n = m m ′ r − 1 m o d n = m r r − 1 m o d n = m
透過mask掉原本的c c c 得到c ′ c' c ′ 拿去詢問oracle後再使用攻擊者自己挑選的r r r 還原得到想要攻擊的c c c 的m m m ,而這種選定密文攻擊有兩種型態:
Non-adaptive chosen ciphertext attakc(CCA1): 攻擊者把想要詢問的密文一次挑選出來,只能針對oracle詢問一次O e , n ( c i ) , 1 ≤ i ≤ s O_{e, n}(c_{i}), 1 \leq i \leq s O e , n ( c i ) , 1 ≤ i ≤ s ,無法依靠上一次詢問的結果來調整下一次詢問的選擇
Adaptive chosen ciphertext attack(CCA2): 攻擊者在多項式時間內可以一次一次的詢問oracle,不限詢問次數O e , n ( c i ) , 1 ≤ i ≤ s O_{e, n}(c_{i}), 1 \leq i \leq s O e , n ( c i ) , 1 ≤ i ≤ s ,可以透過前一次的詢問來調整下一次的詢問選擇。
如此可見CCA2的安全性等級是最高的,所以看paper在證明密碼系統的安全性時雖然作者會寫有CCA的安全性,但需要讀者再去檢查一下oracle的等級,看是達到CCA1還是CCA2的安全性
針對RSA選定密文攻擊方法是採用O A E P + OAEP^{+} O A E P + 使用random oracle model來抵抗CCA2的攻擊