序言

現代公鑰加密系統中,常用的加密演算法除了RSA還有離散對數加密和橢圓曲線加密。這兩者原理比較相似,在這裡一併介紹。

離散對數問題

我們在中學裡學的對數問題是指,

給定正實數aax,求x。也就是計算x=logaax

這是實數域上的對數問題,不是什麼難算的東西,隨便按一下計算器結果就出來了。

而離散對數問題是指這樣的問題:

給定素數p和正整數g,知道gxmodp的值,求x

對於符合特定條件的pg,這個問題是很難解的,更準確地說,是沒有多項式時間的解法。

Diffie–Hellman金鑰交換

Diffie–Hellman金鑰交換(以下簡稱DH)是用於雙方在可能被竊聽環境下安全交換金鑰的一種方法。
演算法的安全性是由上面提到的離散對數難題保證。

具體演算法流程如下:

  • 小紅和小明約定pg的值
  • 小紅生成私鑰x,計算gxmodp作為公鑰公佈出去
  • 小明生成私鑰y,計算gymodp作為公鑰公佈出去
  • 小紅得知gymodp後,計算
    s=(gymodp)xmodp=(gy)xmodp=gxymodp
  • 小明得到gxmodp後,計算
    s=(gxmodp)ymodp=(gx)ymodp=gxymodp
  • 雙方都得到了相同的金鑰的s,交換完畢

上面的流程中,xy始終由兩人自行保管的,第三方竊聽得到的只有pggxmodpgymodp這幾個值。
上面說過,離散對數是很難算的,所以第三方不能由這些資訊計算出xy,也就沒辦法計算出金鑰s了。

橢圓曲線

中學的時候我們學過圓錐曲線,比如橢圓、雙曲線和拋物線。因為描述這些曲線的方程都是二次方程,圓錐曲線又被稱為二次曲線。而橢圓曲線是則是由三次方程描述的一些曲線。更準確地說,橢圓曲線是由下面的方程描述的曲線:

y2=x3+ax+b4a3+27b20.
需要注意的是,橢圓曲線之所以叫“橢圓曲線”,是因為其曲線方程跟利用微積分計算橢圓周長的公式相似。實際上它的影象跟橢圓完全不搭邊。

下圖是橢圓曲線y2=x3x+1的影象
這裡寫圖片描述

橢圓曲線有這樣的兩個性質:

  1. 關於X軸對稱
  2. 畫一條直線跟橢圓曲線相交,它們最多有三個交點

橢圓曲線上的運算

由於橢圓曲線加密進行的運算實際上都是在橢圓曲線上進行的,所以接下來需要定義一些橢圓曲線上的運算。

必須注意的是,這裡把這些運算稱為“加法”和“乘法”僅僅是方便描述,他們跟平時認知的加法和乘法完全是兩碼事,完全可以給他們取其它名字(比如”乘法“和”冪運算“等)。

  1. 首先定義座標系中距離X軸無窮遠點為橢圓曲線上的一個特殊點,稱為0點
    那麼此時上述第二條性質可以加強為:過曲線上任意兩點(可重合)的直線必定與曲線相交於第三點。

  2. 然後定義橢圓曲線上點的加法。設橢圓曲線上有兩點,A和B點,那麼作過這兩點的直線與該曲線相交於第三點(C點),然後關於X軸對稱得到D點,則D為這兩個點的和,記作D=A+B。很明顯,D點也在該曲線上。所以橢圓曲線上兩點之和也是曲線上的點。
    A+B

    特別地,如果兩點重合,則作橢圓曲線在A點處的切線,與曲線相交於第二點(B點),然後關於X軸對稱得到C點,則C點為A點與自身的和,記作C=A+A
    A+A

    那麼關於這個加法,我們可以得到以下結論: