в то время как l oop никогда не становится ложным для функции, которая генерирует пару publi c и секретный ключ - PullRequest
0 голосов
/ 06 апреля 2020

Я пишу программу на python, которая генерирует пару открытых c и секретных ключей. Мой код до сих пор выглядит так:

def gcd(a,b):
    while b != 0:
        a, b = b, a % b
        return(a)

    pass

def inverse(a, b):  # use extended euclidean algorithm to find inverse
    x1, x2, x3 = 1, 0, a
    y1, y2, y3 = 0, 1, b
    while y3 != 0:
        d = x3 // y3
        y1, y2, y3, x1, x2, x3 = (x1 - d * y1), (x2 - d * y2), (x3 - d * y3), y1, y2, y3

    return x1 % d

    pass

def generate_key(a, b):

    n = a * b
    p = (a-1) * (b-1)
    e = random.randrange(1,p)
    g = gcd(e, p)

    while g != 1:
        e = randrange(1,p)
        g = gcd(e,p)


    d=inverse(e,p)

    return ((e,n), (d,n))

    pass

Но когда я запускаю тестовый код, он никогда не завершается и продолжает работать, пока я не остановлю его вручную. Есть идеи, почему это может происходить?

1 Ответ

1 голос
/ 06 апреля 2020

Проблема с вашим кодом заключается в реализации gcd, возврат не должен быть внутри, потому что он будет запускаться только один раз и возвращаться, вы должны сделать что-то вроде этого:

def gcd(a,b):
    while b != 0:
        a, b = b, a % b

    return(a)

I не знаю, есть ли еще проблемы, потому что вы не предоставили обратную функцию

...