2017-03-31 25 views
1

我正在开发一个应用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 

这个代码,它似乎工作正常。

+2

我认为RSA只能如果p和q是素。 'extended_euclide(p,q,False)'检查p和q是否互质(即最大公约数为1),而不是两个数是否都是质数。另外,不是'generate_integer()',你可以使用'randrange(10,100)' – BurningKarl

+0

一场火焰战争,真的@MaartenBodewes?我只意味着Python不是计算大数字操作的最有效的语言,也不是发起语言的“战争”。我已经改变:) – Guil23

+0

@BurningKarl你可能是对的,当我添加extended_euclide函数时,我删除了我创建的前者,并忘记检查p和q是否是素数......我会试着告诉你 – Guil23

回答

1

这里是作为一个答案我的评论:

当看RSA Wikipedia page它指出:

RSA的用户创建并发布基于两个大素数的公钥,随着一个辅助值。

所以对于加密工作需要素数而extended_euclide (p, q, False)仅检查p和q是否comprime,即无论他们的最大公约数是1

+0

这是正确的,正如我所说,我忘记检查p和q是否为质数,然后再测试它们是否相对较好,谢谢您的帮助 – Guil23