一言以蔽之:RSA金鑰加密被廣泛地使用。
在一個公開(可能有人偷聽)的場合,對方想告訴我一個祕密,但怕別人知道,所以得要加密告訴我,RSA就是一個常用的加密方法。
RSA是一種非對稱式加密演算法,亦即用來加密的鑰匙跟用來解密的鑰匙是不同的。這個演算法是由麻省理工學院的Rivest, Shamir, Adleman在1977年提出的,所以用他們的姓氏首個字母來命名。話說英國數學家Cocks更早於1973年就提出這個方法,只是當時英國情報機構當成機密沒有公佈。
※ 設計RSA公鑰和私鑰——方法 (1) 取二個足夠大的質數p, q (2) 可以算出N=p*q, r=(p-1)*(q-1) (3) 再任選一個跟r互質的數e (4) 接著找一個d為e對同餘r的模反元素,亦即使得d*e≡1 (mod r) ➜ 得到公鑰是(N, e)、私鑰是(N, d)
※ 利用RSA公鑰和私鑰——方法 假如對方想告訴我的祕密是x (5) 我告訴對方N和e,要求對方告訴我y,其中y=x^e (mod N) (6) 我收到y以後,就可以反推出祕密是x=y^d (mod N)
※ 利用RSA公鑰和私鑰——實例 假如對方的身高是x1=175cm、體重是x2=63kg (5) 我告訴對方3和667951,要求對方告訴我x^3 (mod 667951)的編碼,對方會告訴我是身高編碼是175^3≡15767、體重編碼是63^3≡250047 (6) 我獲知15767、250047後,代入15767^444203≡175、250047^444203≡63,就知道身高是175、體重是63kg
N和e是公開的鑰匙,y在公開的頻道傳輸、可能被竊聽,所以要保護好私人的鑰匙d。
RSA加密的可靠性是來自於對極大整數N(本例中為667951)因數分解之困難,目前世界上還沒有任何有效的RSA攻擊方式,只要N的長度足夠長,被RSA加密的訊息就很難破解。發明演算法來破解RSA是數學家的工作,身為工程師得用別種方式來破臺。
從前面的敘述可以知道,只要能取得私鑰d就能破臺,所以我們要想辦法從硬體猜得d。在上例中,15767、250047可以從網路線上竊聽到,而電腦計算15767^d、250047^d是很耗電的,所以可以偷聽電源線的current profile,知道15767^d、250047^d計算的時間,多聽幾筆計算,就有機會猜出d的值。這種利用RSA physical implementation弱點的非暴力破解,被稱為旁路攻擊side-channel attack。
本來用質數p, q產生鑰匙(N, e, d)以後,應該要把p, q銷毀來避免外洩,但由於計算y^d (mod N)很費時,如果私鑰有保留p, q的話,就可以利用中國餘數定理來加速計算。這個中國餘數定理,同時也是中學很喜歡考的題目:「劉邦有士兵若干人,三人一排餘一人,五人一排餘一人,七人一排餘一人,問劉邦最多有士兵多少人?」
不大於十萬的『105*整數+1』,最大為99961,所以正確答案有士兵劉邦99961人。如果把題目的劉邦換成韓信,這題的答案就變成無限大,因為《史記·淮陰侯列傳》記載「劉邦領兵,能將十萬;韓信點兵,多多益善」。