【问题标题】:Modular arithmetic and semi elgamal encryption模算术和半 elgamal 加密
【发布时间】: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。

我做的有什么问题吗?

【问题讨论】:

  • 组有什么顺序(pq 或其他)?如果它应该是 q,那么你就有问题了,因为 q 不是素数。您确定 131 是该组的生成器吗? 1/x是怎么计算的?
  • 您的问题的编程部分在哪里?如果你没有,Crypto.SE 可能是这个问题的更好的地方。
  • @ArtjomB。该组的顺序为 p。我正在使用 NTL 进行模运算,并使用在线模计算器仔细检查了所有值。也许我在 Crypto 论坛上试一试,或者按照你的建议用源代码编辑我的问题。无论如何,谢谢。

标签: cryptography number-theory elgamal


【解决方案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 对于任何 y 非 p 的倍数,x=p-1 始终按您的预期工作...

【讨论】:

  • 感谢您的回答。我的坏你是对的,p是错的。尽管如此,我还没有完全理解最大长度为 p-1 的序列。但是,我尝试了新的输入,例如 p=263 和 g=2(我们知道 2 必须始终是安全素数的生成器),但我仍然未能得到正确的结果。你能再给我一个提示,我的假设到底有什么问题,我应该如何正确地做到这一点?
  • @mersad00 p = 263 应该可以工作,因为它的素数顺序为 131 (q)。这意味着 xs 必须小于组的顺序。
  • @mersad00 为什么是 n 1。
  • @mersad00 作为提示,尝试将 (g^x)^(p-s) 和 (g^x)^s 模 p 相乘,并与 (g^x) 进行比较
猜你喜欢
  • 2022-06-17
  • 2013-11-27
  • 2012-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
相关资源
最近更新 更多