RSA 验证 python、python-rsa 库中的 p 和 q 密钥

RSA validate p and q keys in python, python-rsa lib

更新

我有一个程序可以获取两个 public 和用于验证这些密钥的私钥。

这些密钥是否有效。

我们假设我们的密钥是有效的。

(pub , privateKey) = rsa.newkeys(1024)

但是我有 p、q 和 nlen 的关系。

这是 p 和 q 的数学方程式:

  1. The primes p and q shall be selected with the following constraints:

(a) (p–1) and (q–1) shall be relatively prime to the public exponent e.

(b) The private prime factor p shall be selected and shall satisfy

(a) 条件成功通过。

但我无法理解 (b) 项。

另一方面我们说 len(p) = len(q) = nlen/2.

nlen 等于模块的大小。

我们来谈谈这个条件:

这些代码是 p、q、d、e 和 nlen 的定义。

p = privkey.p
q = privkey.q
d = privkey.d
e = privkey.e
nlen = privkey.n.bit_length()

我们用这段代码实现了我们的条件:

if not sqrt(2) * (2 ** ((nlen/2) - 1)) <= p <= (2 ** (nlen/2)) - 1:
     return "Invalid P prime number size"

以及使用以下代码实现的另一个条件:

检查 q len

if not sqrt(2) * (2 ** ((nlen/2) - 1)) <= q <= (2 ** (nlen/2)) - 1:
    return "Invalid Q prime number size"

以上条件不符合,他们的身体运行.

无论如何,这个问题对于解密 len 条件是正确的。

第二个条件成功通过。

不过先把我写的错误抛给parent class.

这是我的代码:


if not 2 ** (nlen/2) < d < lcm(p-1, q-1):
    return "Invalid decryption key"

但为什么呢?

我认为我的问题与 nlen 有关。因为在我使用 nlen 的所有地方,我的测试都没有通过和失败。

我检查了它的值,但我不知道我能做些什么来解决这个问题。

我认为你的文字是错误的,因为两个质因数都只用于密钥的计算而没有公布。以下答案将检查密钥是否有效,而不是它们是否安全:

为了检查两个密钥是否有效,您需要具有以下值:

  • p 和 q(已选择素数)
  • n (mod-数 = p * q)
  • key1 和 key2(public 和私钥)
def is_valid(p, q, key1, key2, n):  # assuming p and q are actually prime
    if n != p * q:  # check if n is actually p * q
        return False
    num = (p - 1) * (q - 1)
    if (key1 * key2) % num != 1:  # check if keys are valid
        return False
    return True

此私钥和 public 密钥绝对有效。但我们的条件适用于安全密钥。

我们可以使用 pycryptodome python 库来提高我们的密钥测试安全性。

在这种情况下,我们应该使用这些密码创建一个密钥对,并在 pycryptodome 中使用相同的密码加载它们。