Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python生成和使用RSA密钥_Python_Cryptography_Rsa - Fatal编程技术网

使用Python生成和使用RSA密钥

使用Python生成和使用RSA密钥,python,cryptography,rsa,Python,Cryptography,Rsa,我正在从事一个Python项目,该项目应该使用RSA加密、发送和解密消息。(我认为这不是一个专业项目) 我已经写了一个小程序来创建这些密钥,我认为它会工作,但是我认为我的密钥有问题 关键点的创建方式如下: def generate_integer (): i = 0 number = "" number += str(randrange(1,10)) while i < 1: number += str(randrange(0,10))

我正在从事一个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
这里,
decrypted_message
应该等于
message
,也就是说,64。为什么它不起作用?在创建密钥时是否存在问题,或者这是另一个问题

编辑: 谢谢@BurningKarl,我确实忘记了检查p和q是否是素数。这是一个新函数,它取代了
generate\u integer()

def generate_prime_integer():
素数=假
虽然不是质数:
数字=随机范围(10100)
平方根=int(sqrt(nombre))
如果平方根

使用该代码,它似乎工作正常。

以下是我的评论作为答案:

在查看这些信息时,它指出:

RSA用户基于两个大素数以及一个辅助值创建并发布公钥


因此,加密工作需要素数,而扩展欧几里德(p,q,False)
只检查p和q是否为压缩数,即它们的最大公约数是否为1

我认为只有当p和q是素数时,RSA才有效
extended_euclide(p,q,False)
检查p和q是否是互质(即最大公约数为1),而不是两个数是否都是素数。另外,您可以使用
randrange(10100)
A flame war,而不是
generate\u integer()
,真的@MaartenBodewes?我只是说Python不是计算大量运算的最有效语言,也不是发动语言大战。我改变了:)@BurningKarl你可能是对的,当我添加扩展的欧几里德函数时,我删除了我创建的前一个函数,忘了检查p和q是否是素数。。。我会试着告诉你汉克斯这是有效的。我应该如何将问题标记为已解决?最好的办法是让@BurningKarl将他的评论转换为答案,这样你就可以投票赞成/接受答案。您还可以编辑该答案并包含最终代码。如果BurningKarl不想添加答案,您可以自己回答,并在2天后接受您的答案。没错,正如我说过的,在测试p和q是否为相对素数之前,我忘了检查它们是否为素数,谢谢您的帮助
>>> 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
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