更新
我有一个程序可以获取两个公钥和私钥来验证这些密钥。
这些密钥是否有效。
我们假设我们的密钥是有效的。
(pub , privateKey) = rsa.newkeys(1024)
但是我有 p、q 和 nlen 的关系。
这是我们的 p 和 q 的数学方程:
<块引用>(a) (p–1) 和 (q–1) 应与 公共指数 e.
<块引用>(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 条件是正确的。
第二个条件成功通过。
但首先将我写的错误扔给父类。
这是我的代码:
if not 2 ** (nlen/2) < d < lcm(p-1, q-1):
return "Invalid decryption key"
但是为什么?
我认为我的问题与 nlen 有关。因为在我使用 nlen 的任何地方,我的测试都没有通过和失败。
我检查了它的值,但我不知道我能做些什么来解决这个问题。
答案 0 :(得分:1)
我认为您的文字是错误的,因为这两个主要因素仅用于计算密钥而未发布。以下答案将检查密钥是否有效,而不是它们是否安全:
为了检查两个键是否有效,您需要具有以下值:
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
答案 1 :(得分:0)
这个私钥和公钥是绝对有效的。但我们的条件适用于安全密钥。
我们可以使用 pycryptodome python 库来提高我们的关键测试安全性。
在这种情况下,我们应该使用这些密码创建一个密钥对,并在 pycryptodome 中使用相同的密码加载它们。