模块化算术和半elgamal加密

时间:2015-02-28 23:37:39

标签: cryptography number-theory elgamal

我正在实施一个已在PVSS中使用的半ELGamal密码系统(来自research paper)功能。不幸的是,我无法解密,因为它已在算法中描述。

这是初始化阶段:

选择一个安全素数p,使得p-1 = 2q,其中q也是素数,然后形成一个循环群G,让g成为该群的随机生成者。在组中选择一个随机的x(私钥),然后让y = g ^ x(公钥)。我只需将算法初始化如下:

p = 233;
g = 131;
x = 139;
y = g ^ x mod 233; //y = 182

现在让s(秘密)为23,我们计算我们的es(加密秘密):

s = 23
es = y ^ s mod 233// es = 231

为了解密es,我将es提升到x(私钥)的倒数,我应该返回g ^ s,假设ds是解密值:

ds = es ^ 1/x mod 233 // 1/x = 57, ds = 116

问题在于,ds不等于g ^ s,但理论上它应该是因为:

回想一下,我们将s加密为:

es = y ^ s mod 233

我们知道

y = g ^ x mod 233

所以,

es = g ^ x ^ s mod 233

鉴于此,

ds = es ^ 1/x mod 233
// which means:
ds = g ^ x ^ s ^ 1/x mod 233

因此,我希望得到与g ^ s(131 ^ 23 mod 233)相同的结果,它必须是182,而我得到的结果是ds。

我正在做什么有什么问题?

1 个答案:

答案 0 :(得分:1)

当你有:

x * invX = 1 mod p 

以下等式通常不正确:

(g ^ x) ^ invX = g mod p

上面的表达方式意味着将g*g*....*g乘以特定次数x * invX,根据第一个模数关系也是k * p + 1

假设您的生成器的大小为n <= p-1

g ^ n = 1 mod p

这意味着x * invX必须是n ...

的倍数

在你的序言中,你断言q=(p-1)/2是素数,但在这里,事实并非如此,q=116 ...

在你的例子中,g = 131生成一个长度为58 =(p-1)/ 4的序列 然后,只有那些x具有属性g ^ x ^(1/x) = 1 mod p

58 116 132 154 174 203 229 231 232

注意,对于另一个生成器,g = 5,序列的最大长度为p-1,然后满足(g ^ x) ^ invX = 1 mod p的唯一x为x=p-1

由于y^(p-1) = 1 mod p对于任何非p的倍数,x = p-1总是正如你所期望的那样工作......