Реализацией расшифровки алгоритма RSA. Проблема с расшифровкой

Код не расшифровывает слово зашифрованное в файле "zadanie_na_5".

Слово из файла "test1" может расшифровать. Содержимое файла "test1":

введите сюда описание изображения

Содержимое файла "zadanie_na_5":

введите сюда описание изображения

Этот код является реализацией алгоритма дешифрования RSA, в частности, атаки Бонеха и Дерфи.

Функция "decode_file" принимает на вход имя файла "file" и открывает файл для чтения (формат "C:\rsa_2{file}.in"). Затем он считывает значения «n», «u» и «k», которые представляют собой размер модуля RSA, максимальное значение u и k, которые используются при атаке, и количество зашифрованных текстов. Открытый ключ, состоящий из «n» значений, и зашифрованное сообщение, состоящее из «k» значений, также считываются из файла.

Затем код создает список «all_qn», в котором будут храниться все возможные значения «q» и «n». Это делается с помощью функции numpy «np.linalg.solve» для решения системы линейных уравнений, где уравнения представляют возможные значения «q» и «n». Затем эти значения добавляются в список «all_qn».

Затем функция «is_right» используется для проверки допустимости значений «q» и «n», хранящихся в «all_qn». Если найден допустимый набор «q» и «n», соответствующий закрытый ключ вычисляется и используется для расшифровки сообщения. Затем расшифрованное сообщение записывается в файл формата «C:\rsa{файл}.out». Если допустимый набор «q» и «n» не найден, функция возвращает «Нет».

Наконец, функция «main» вызывает «decode_file» для нескольких тестовых случаев, включая «zadanie_na_5».

import math

def ToLine(priv, sym, n):
    num = 0
    result = ""
    for i in range(n):
        num = priv[n - i - 1]
        if num <= sym and sym - num >= 0:
            result = result + "1"
            sym -= num
        else:
            result = result + "0"

    line = ""
    for i in [result[i: i + 8] for i in range(0, len(result), 8)]:
        line = chr(int(i[::-1], 2)) + line
    return line

def is_right(pub, n, q, p):
    p, q = int(p), int(q)
    if math.gcd(q, p) != 1:
        return None
    qn = pow(q, -1, p)
    suma = 0
    for i in pub:
        if suma > i * qn % p and suma > p:
            return None
        suma += i * qn % p
    return (q, p, qn)

def decode_file(file):
    print("======"*20)
    print(f"Opening \"{file}.in\"...")
    n, u, k = 0, 0, 0
    pub, msg, all_qn = [], [], []

    with open(f"C:\\rsa_2\\{file}.in", 'r') as fs:
        n = int(fs.readline())
        u = int(fs.readline())

        for i in range(n):
            pub.append(int(fs.readline()))

        k = int(fs.readline())

        for i in range(k):
            msg.append(int(fs.readline()))

    print("Public key: ")
    print(" | ".join(str(x) for x in pub))

    print("\n\nU: ", u, "\n")

    print("Encoded message: ")
    print(" | ".join(str(x) for x in msg))

    r = 10#n*2#//2+1
    for u0 in range(1, u+1):
        for u1 in range(u0 + 1, u+1):
            for k0 in range(0, r//2):
                for k1 in range(0, r//2):
                    try:
                        all_qn.append(np.linalg.solve([[u0, k0], [u1, k1]], [pub[0], pub[1]]))
                        all_qn.append(np.linalg.solve([[u0, k0], [u1, -k1]], [pub[0], pub[1]]))
                        all_qn.append(np.linalg.solve([[u0, -k0], [u1, -k1]], [pub[0], pub[1]]))
                        all_qn.append(np.linalg.solve([[u0, -k0], [u1, k1]], [pub[0], pub[1]]))
                    except:
                        pass 


    privfull = []
    lst = []
    for data in all_qn:
        result = is_right(pub, n, data[0], data[1])
        if result:
            lst.append(result)

    for data in lst:
        privfull = []
        for i in pub:
            privfull.append(i * data[2] % data[1]) 
        if sum(privfull) < data[1]:
            line = ""
            for sym in msg:
                line += ToLine(privfull, sym*data[2]%data[1], n)
            print(privfull)
            print("\nDeszyfrowane slowo:", line)
            with open(f"C:\\rsa\\{file}.out", 'w') as fs2:
                fs2.write(line)
            return
    print("======"*20)
        
def main():
    #decode_file("przyklad0.txt")
    #decode_file("przyklad1.txt")
    #decode_file("przyklad2.txt")
    #decode_file("przyklad3.txt")
    decode_file("test1")
    decode_file("test2")
    decode_file("test3")
    decode_file("test4")
    decode_file("test6")
    decode_file("test7")
    decode_file("test8") #--
    decode_file("zadanie_na_5")# --

if __name__ == '__main__':
    main()

Ответы (0 шт):