我正在实施一个已在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。
我正在做什么有什么问题?
答案 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总是正如你所期望的那样工作......