ELGamal加密算法C语言实现,ElGamal加密算法基础到实现详解

先从数学基础开始

转载请注明http://blog.csdn.net/boksic 如有疑问欢迎留言

羣是一个集合G,连同一个运算 “·”,它结合任何两个元素 a 和 b 而形成另一个元素,记为 a · b。符号 “·” 是对具体给出的运算,比如加法的一般的占位符。要具备成为羣的资格,这个集合和运算 (G, ·) 必须满足叫做羣公理的四个要求:1.封闭性。对于所有 G 中 a, b,运算 a · b 的结果也在G 中。

2.结合性。对于所有 G 中的 a, b 和 c,等式 (a ·b) ·c = a · (b · c) 成立。

3.单位元。存在 G 中的一个元素 e,使得对于所有 G 中的元素 a,等式e · a = a · e = a 成立。

4.反元素。对于每个 G 中的 a,存在 G 中的一个元素 b 使得 a ·b = b · a = e,这里的 e 是单位元。

例如整数集合 和加法运算,具有以下性质对于任何两个整数 a 和 b,它们的和 a + b 也是整数。换句话说,在任何时候,把两个整数相加都能得出整数的结果。这个性质叫做在加法下封闭。

对于任何整数 a, b 和 c,(a + b) + c =a + (b + c)。用话语来表达,先把 a 加到 b,然后把它们的和加到c,所得到的结果与把 a 加到 b 与 c 的和是相等的。这个性质叫做结合律。

如果 a 是任何整数,那么 0 + a = a + 0 = a。零叫做加法的单位元,因为把它加到任何整数都得到相同的整数。

对于任何整数 a,存在另一个整数 b 使得 a + b = b +a = 0。整数 b 叫做整数 a 的逆元,记为 −a。

一个羣被称为有限羣,如果它有有限个元素。元素的数阶叫做羣 G 的阶

例如,模19下7的阶为3,[1, 7, 49, 343, 2401, 16807, 117649, 823543, 5764801…]={1,7,11,1,7,11,1,7,11…}这里的1,7,11循环,实际只有3个元素

循环羣

循环羣是其所有元素都是特定元素 a 的幂的羣(在羣运算被写为加法的时候使用术语倍数)。在乘法符号下,羣的元素是:

…, a−3, a−2, a−1, a0 = e,a, a2, a3, …,

这个元素 a叫做这个羣的生成元或本原元。

本原元

模n下a的阶m=φ(n),m就是n的本原元,如3是19的本原元

19为质数,因此φ(19)=18(参见http://blog.csdn.net/boksic/article/details/6912381),模19下3的羣为

[1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049, 177147, 531441,1594323, 4782969,

14348907, 43046721, 129140163, 387420489, 1162261467, 3486784401L,10460353203L, 31381059609L, 94143178827L…]

用模19来表示

[1, 3, 9, 8, 5, 15, 7, 2, 6, 18, 16, 10, 11, 14, 4, 12, 17, 13, 1, 3, 9L,8L, 5L, 15L]

循环为1, 3, 9, 8, 5, 15, 7, 2, 6, 18, 16, 10, 11, 14, 4, 12, 17, 13,因此该循环羣阶为18与欧拉函数结果相等

剩下的都是简单的套公式了

ElGamal密钥生成

随机选择一个大素数p,且要求p-1有大素数因子。再选择一个模p的本原元α。将p和α公开。

随机选择一个整数d作为密钥,2≤d≤p-2 。

计算y=α^d mod p,取y为公钥。

ElGamal加密

对于明文M加密

随机地选取一个整数k,2≤k≤p-2。

C1=α^k mod  p;

C2=MY^k mod  p;

密文为(C1,C2)

ElGamal解密

由密文可得明文M

M=C2/C1^d mod p

实例

密钥生成选取素数p=150001,本原元a=7,密钥113

>>> p=150001

>>> a=7

>>> d=113

>>> a**d%p

66436L

>>> y=a**d%p

>>> print y

66436

由公式可得公钥为y=66436

加密,明文为m=809,随机整数为k=1000

>>> m=809

>>> k=1000

>>> c1=a**k%p

>>> c1

90429L

>>> c2=m*y**k%p

>>> c2

15061L

得到密文为(c1,c2)=(90429,15061)

解密

根据公式m1=c2/c1**y%p,但其中有模逆运算,不能直接计算,可以用扩展欧几里得算法(参见http://blog.csdn.net/boksic/article/details/6912381)先求c1**y的模逆

>>> extended_gcd(c1**d%p,p)

(-69199L, 2147L)

我们所需要的是正数,所以加上p,-69199+p=80802

然后就可以

>>> 80802*c2%p

809L

正是刚开始的明文809

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值