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 的数学方程式:
- 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 中使用相同的密码加载它们。
更新
我有一个程序可以获取两个 public 和用于验证这些密钥的私钥。
这些密钥是否有效。
我们假设我们的密钥是有效的。
(pub , privateKey) = rsa.newkeys(1024)
但是我有 p、q 和 nlen 的关系。
这是 p 和 q 的数学方程式:
- 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 中使用相同的密码加载它们。