0

我正在实现已在 PVSS 中使用的半 ELGamal 密码系统(来自研究论文)功能。不幸的是,我无法解密,因为它已在算法中描述。

这是初始化阶段:

选择一个安全素数 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 结果是 116。

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

4

1 回答 1

1

当你有:

x * invX = 1 mod p 

以下等式通常不正确:

(g ^ x) ^ invX = g mod p

上式表示乘以g*g*....*g一定的次数,x * invXk * 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,那么唯一满足的 x(g ^ x) ^ invX = 1 mod px=p-1

因为y^(p-1) = 1 mod p对于任何 y 非 p 的倍数,x=p-1 总是按照你的预期工作......

于 2015-03-01T01:58:10.897 回答