【发布时间】:2015-02-28 23:37:38
【问题描述】:
我正在实现一个已在 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 结果是 116。
我做的有什么问题吗?
【问题讨论】:
-
组有什么顺序(p 或 q 或其他)?如果它应该是 q,那么你就有问题了,因为 q 不是素数。您确定 131 是该组的生成器吗?
1/x是怎么计算的? -
您的问题的编程部分在哪里?如果你没有,Crypto.SE 可能是这个问题的更好的地方。
-
@ArtjomB。该组的顺序为 p。我正在使用 NTL 进行模运算,并使用在线模计算器仔细检查了所有值。也许我在 Crypto 论坛上试一试,或者按照你的建议用源代码编辑我的问题。无论如何,谢谢。
标签: cryptography number-theory elgamal