注意:只是我的理解,可能有不正確的地方算法
ElGamal加密算法是一種非對稱加密算法,基於Diffie-Hellman密鑰交換算法,由Taher Elgamal在1985年提出。安全
ElGamal加密算法能夠應用在任意一個循環羣(cyclic group)上。在羣中有的運算求解很困難,這些運算一般與求解離散對數(Discrete logarithm)相關,求解的困難程度決定了算法的安全性。加密
羣(Group)的定義:spa
羣是數學中的概念。.net
一些元素組成的集合,若是元素知足如下條件,則把這些元素組成的集合叫作羣:blog
在元素上能夠定義一個2元運算,運算知足封閉性、結合律、單位元和逆元。ip
羣的例子:get
全部整數構成一個羣,若是定義的2元運算爲整數加法的話。加法能夠知足上述條件:數學
封閉性:a+b以後仍然是整數it
結合率:(a + b) + c = a +(b + c)
單位元:0 + a = a + 0 = a,則整數0爲加法的單位元
逆元:a + b = b + a = 0,則整數b叫作整數a的逆元
因此能夠簡單的將羣理解爲一些元素的集合加上一個選定的運算方式。
循環羣的定義:
循環羣中的全部其它元素都是由某個元素g運用不一樣次數的選定運算方式計算出來的。
公鑰生成:
一、選取一個循環羣G,且循環羣G的階數爲q
二、選擇一個隨機數x,1<x<q-1
三、計算h=g^x
h和g,G,q就構成公鑰
x是保密的,x與h,g,G,q一塊兒構成密鑰
公鑰加密:
一、選取一個隨機數y,1<y<q-1
二、計算c1=g^y
三、計算s=h^y=(g^x)^y=g^(x*y)
四、加密數m得c2=m*s
c一、c2構成加密結果,交給私鑰解密
私鑰解密:
一、經過c1計算獲得s=c1^x=(g^y)^x=g^(x*y)
二、計算c2*(s^-1)=(m*s)*(s^-1),獲得原來數m
注意以上的運算再也不是普通的乘(*)和乘方(^)運算,並且有循環羣G對應的運算衍生出來的運算。但這些運算的意義和規律仍是和普通數字運算的規律同樣的,因此上面的等式仍然成立。
由上面看出s的計算過程和Diffie-Hellman密鑰交換算法相似。
在應用中一般使用的循環羣G爲整數模n乘法羣(Multiplicative group of integers modulo n)。
同餘:
若是整數a、b的對於整數n的模相等即a%n=b%n,則稱a和關於模n同餘。能夠記作:
a≡b (mod n)
互質(Coprime integers):
若是整數a、b的最大公因數爲1,則a、b互質。
整數模n乘法羣:由模n的互質同餘類組成一個乘法羣。
簽名和驗證算法,基於整數模n乘法羣:
私鑰,公鑰生成:
一、選取一個隨機數k,1<x<p-1
二、計算y=g^x%p
(g, p, y)爲公鑰,x爲私鑰。
用私鑰簽名:
一、選取一個隨機數k,1<k<p-1,且k和p-1互質
二、計算r,r知足:r≡g^k (mod p)
三、計算s,s知足:s≡(H(m)-xr)*(k^(-1)) (mod p-1)
m爲待簽名信息,H(m)爲m的哈希(好比sha1)結果。
(r,s)構成對m的簽名
用公鑰驗證簽名:
一、驗證:0<r<p,0<s<p-1
二、驗證:g^(H(m))≡(y^r)*(r^s) (mod p)
簽名算法正確性證實:
由簽名過程得:H(m) ≡s*k+x*r (mod p-1)
根據費馬小定理:
g^(H(m))≡g^(x*r)*g^(k*s) (mod p)≡((g^x)^r)*(g^k)^s (mod p) ≡ (y^r)*(r^s) (mod p)
費馬小定理:
若是p爲質數,則任意整數a:
a^(p-1) ≡1 (mod p)
即存在整數k使 a^(p-1) = k*p +1
再廣義化一些:
若是p爲質數,且整數m、n知足:m ≡n (mod p-1),那麼對任意整數a:
a^m ≡ a^n (mod p)
若是m=p-1,n=0,那麼上市轉換爲通常形式:a^(p-1) ≡1 (mod p)
參考:
ElGamal加密算法: http://en.wikipedia.org/wiki/ElGamal_encryption
羣: http://zh.wikipedia.org/wiki/%E7%BE%A4
循環羣: http://zh.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E7%BE%A4
同餘運算: http://zh.wikipedia.org/wiki/%E5%90%8C%E9%A4%98
互質: http://zh.wikipedia.org/wiki/%E4%BA%92%E8%B3%AA
整數模n乘法羣: http://zh.wikipedia.org/wiki/%E6%95%B4%E6%95%B0%E6%A8%A1n%E4%B9%98%E6%B3%95%E7%BE%A4
離散對數: http://en.wikipedia.org/wiki/Discrete_logarithm
Diffie-Hellman密鑰交換算法: http://my.oschina.net/u/1382972/blog/330456
費馬小定理: http://zh.wikipedia.org/wiki/%E8%B4%B9%E9%A9%AC%E5%B0%8F%E5%AE%9A%E7%90%86