RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 919256
Accepted
J. Doe
J. Doe
Asked:2020-12-13 04:57:36 +0000 UTC2020-12-13 04:57:36 +0000 UTC 2020-12-13 04:57:36 +0000 UTC

Schnorr方案中的快速密钥生成算法

  • 772

给定:素数测试,素数生成函数。

我们需要找到一种算法来生成公钥的质数部分,q这样:

(p - 1) % q = 0, 在哪里

p- 1024 位的质数以及密钥的生成部分,

q- 160 位。

米勒-拉宾测试:

def milrab(n, k):
    if n < 2 or n % 2 == 0:
        return 0
    d = n - 1
    r = 0
    while d % 2 == 0:
        d >>= 1
        r += 1
    for i in range(k):
        a = random.randint(2, n - 2)
        x = pow(a, d, n)
        if x == 1 or x == n - 1:
            continue
        for j in range(r - 1):
            x = pow(x, 2, n)
            if x == n - 1:
                continue
        return False  # составное
    return True  # простое

生成具有bits位大小的素数:

def pgen(bits):
    prime = False
    a = 0
    while not prime:
        a = random.randint(2**(bits - 1), 2**bits - 1)
        prime = milrab(a, 7)
    return a

部分公钥p和q:

def gen_p():
    return pgen(1024)

def gen_q(p):
    q = pgen(160)
    while (p - 1) % q != 0:
        q = pgen(160)
    return q

问题是生成q速度非常慢。有没有一种快速计算q乘数的方法p - 1?

python-3.x
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    J. Doe
    2020-12-13T05:59:21Z2020-12-13T05:59:21Z

    到目前为止,我得出的结论是,您可以生成一个素数q(160 位),然后生成另一个数,我们称之为q_p,偶数和长度为 1024-160=864 位,我们将其乘以q并加一(如果乘积的长度为1023位,则进行下一次迭代并重新生成q_p),从而得到p,其简单性经测试验证。

    此外,在测试中,当生成一个随机数(在我的例子中称为a)时,我将 n > 202 的范围设置为 2:200(而不是 2:n-2)。

    执行时间减少到 0-5 秒。

    • 0

相关问题

  • 如何使用在 Keras 生成器上训练的神经网络?

  • 如何在 tkinter 库中为 python 编程语言中的按钮制作不同的字体?

  • 通过 selenium webdriver 在打开的浏览器中删除通知窗口

  • 编写一个函数,找出所有 5 位数字等于输入值的数字之和

  • 将参数列表传递给类构造函数

  • 循环跟踪的迭代

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5