1. 程式人生 > >離散對數之ElGamal 密碼

離散對數之ElGamal 密碼

   在講ElGamal 密碼之前,先溫習一下基礎的數學知識。我們在中學的時候都知道,X^y=n,則求y是很容易的,y=logy(n),但是,如果我們對這個n取模的話,要想求出這個y就是NPC問題了,很難求出了,這就是離散對數問題,因為,取模就是將連續數字離散化的過程。還需要掌握的數學知識有:群的概率,我這兒來一個百度上的解釋:在數學中,表示一個擁有滿足封閉性結合律、有單位元、有逆元二元運算代數結構,包括阿貝爾群、同態和共軛類。在來一點數學知識:原根,首先設(a,p)=1也就是a和n是互素的,則根據尤拉定理知道a^(p-1)=1 mod p,這個(p-1)就是p的尤拉函式值,如果這個(p-1)是使這個式子成立的最小的值的話,那麼我們就說a是p的原根,記作ORDp(a),這個原根有一些很好用的性質:1.ORDp(a^x)=ORDp(a)/(ORDp(a),x);證明就略了。2.如果a是p的原根,則a,a^2,a^3,,,,,,a^φ(n)(φ(n)就是n的尤拉函式值),這幾個數模n就會構成n的簡化剩餘系。那麼該如何求一個素數的原根那?有這樣的方法,首先,這個原根是與n是互素的,再者,計算φ(n),將這個φ(n)寫成素數的乘積的形式φ(n)=p1^x1+p2^x2+...,這樣,如果,與n互素的數a裡面有a^pi mod n=1,這樣的就肯定不是原根,如果不是這樣的就是原根,因為只要二個數互素就一定滿足尤拉定理,如果,可以有比n的尤拉值下的,則就不是否則就是。下來,我們就看一個群,Zp,這個群就是由p的簡單剩餘系構成的,則這個群的生成元就是p的原根,我們的ElGamal 密碼就是在一個素數群Zp中定義的。

     看一下,ElGamal 密碼的具體過程:

1.首先找一個Zp群。以及知道它的生成元G;

2隨機在小於p的正數中找一個數a,

3.計算b=G^a mod p,則公鑰就是(p,G,b);

假如有明文m,我們的加密函式設為E();則首先,我們還是找一個隨機數K,E(m,k)=(c1,c2);c1=g^k mod p;c2=m*b^k mod p;這樣在對方收到這個密文時,就可以這樣解密:

m=c2*(c1^a)^-1 mod p;這個密文的安全,就是依賴於這個離散對數問題的破解難度。