通过 Python 生成和使用 RSA 密钥

Generating and using RSA keys with 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是Phi(n)函数。 调用的函数是 create_keys (),它使用上面的所有函数来创建 2 个密钥,public 和 private。我从维基百科中获取了函数 'extended_euclide',因为我不知道如何编写 Euclide 算法的代码,并对它进行了一些修改,以便它要么给我 d(当我给出 True作为第三个参数)或判断两个整数是否互质(当给出 False)时。

所以,问题是:当我创建密钥并尝试 encrypt/decrypt 任何值时,它不起作用

>>> 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 Wikipedia page 时,它指出:

A user of RSA creates and then publishes a public key based on two large prime numbers, along with an auxiliary value.

因此,要使加密工作,需要质数,而 extended_euclide (p, q, False) 仅检查 p 和 q 是否互质,即它们的最大公约数是否为 1。