我正在开发一个应用RSA加密,发送和解密消息的Python项目。 (我确定它不是一个专业项目) 我写了一个小程序来创建这些键,我认为它会工作,但我认为我的键有问题。使用Python生成和使用RSA密钥
的密钥创建这样:
def generate_integer():
i = 0
number = ""
number += str(randrange(1,10))
while i < 1:
number += str(randrange(0,10))
i += 1
return int (number)
def generate_prime_integers():
p = generate_integer()
q = 0
premiers = False
while not prime:
q = generate_integer()
prime = extended_euclide (p, q, False)
if p == q:
prime = False
return p, q
def generate_prime_with_Euler (i_Euler):
prime_with_Euler = False
while not prime_with_Euler:
e = randrange(2,100)
prime_with_Euler = extended_euclide (e, i_Euler, False)
return e
def extended_euclide (a,b,calculate_bezout):
r = a
u = 1
v = 0
r2 = b
u2 = 0
v2 = 1
quotient = 0
while r2 != 0:
q = r // r2
(r, u, v, r2, u2, v2) = (r2, u2, v2, r - q * r2, u - q * u2, v - q * v2)
prime = False
if r == 1:
prime = True
if calculate_bezout:
return u
else:
return prime
def calculate_d (e, i_Euler):
u = extended_euclide (e, i_Euler, True)
return u
def create_keys():
d = -1
while d < 0:
p, q = generate_prime_integers()
n = p*q
i_Euler = (p-1) * (q-1)
e = generate_prime_with_ Euler (i_Euler)
d = calculate_d (e, i_Euler)
return n, e, d
几个解释:e是加密指数,d是解密指数,i_Euler是披(n)的函数。 调用的函数是create_keys()
,它使用上面的所有函数创建2个公钥和私钥。我从维基百科获得了'extended_euclide'这个函数,因为我不知道如何对欧几里德算法进行编码,并对其进行了一些修改,以便它能够给我d
(当我给出True
作为第三个参数),或者告诉我们两个整数是相对主要的(当给False
)。
所以,问题是:当我创建我的钥匙,并尝试加密/解密的任何值,它不工作
>>> n,e,d = create_keys()
n : 1634
e : 47
d : 293
>>> message = 64
>>> encrypted_message = pow (message, e, n)
>>> encrypted_message
1208
>>> decrypted_message = pow (encrypted_message, d, n)
>>> decrypted_message
140
这里,decrypted_message
应该等于message
,也就是说,64。为什么它不起作用?在创建我的密钥时是否存在问题,还是这是另一个问题?
编辑: 谢谢@BurningKarl我确实忘记检查p和q是否是素数。这是取代generate_integer()
def generate_prime_integer():
prime= False
while not prime:
number= randrange (10,100)
square_root= int (sqrt (nombre))
if square_root< sqrt (nombre):
square_root+= 1
square_root+= 1
prime= True
for i in range (2, square_root):
if number % i == 0:
prime = False
return number
这个代码,它似乎工作正常。
我认为RSA只能如果p和q是素。 'extended_euclide(p,q,False)'检查p和q是否互质(即最大公约数为1),而不是两个数是否都是质数。另外,不是'generate_integer()',你可以使用'randrange(10,100)' – BurningKarl
一场火焰战争,真的@MaartenBodewes?我只意味着Python不是计算大数字操作的最有效的语言,也不是发起语言的“战争”。我已经改变:) – Guil23
@BurningKarl你可能是对的,当我添加extended_euclide函数时,我删除了我创建的前者,并忘记检查p和q是否是素数......我会试着告诉你 – Guil23