我正在研究一个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是Phi(n)函数。
调用的函数是create_keys ()
,它使用上面的所有函数来创建两个密钥,public和private。我从Wikipedia得到了函数'extended\'u euclide',因为我不知道如何编写euclide的算法,并对它进行了一点修改,使它要么给我d
(当我把True
作为第三个参数时),要么告诉我这两个整数是否相对素数(当给出False
时)。在
所以,问题是:当我创建密钥并尝试加密/解密任何值时,它都不起作用
^{pr2}$这里,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 Wikipedia page时,它声明:
因此,为了使加密生效,需要质数,而
extended_euclide (p, q, False)
只检查p和q是否是compime,即它们的最大公约数是否为1。在相关问题 更多 >
编程相关推荐