离散对数之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;这个密文的安全,就是依赖于这个离散对数问题的破解难度。



你可能感兴趣的:(离散对数之ElGamal 密码)