Шифрование и дешифррвание данных в питоне

Алисия хочет отправить Богумилу сообщение. Они знают, что Сесилия будет их подслушивать. общение, поэтому они соглашаются использовать следующий метод шифрования. Богумил выбирает известную только ему последовательность натуральных чисел (u0,...,un-1) удовлетворяющие условию (u0 + . . . + uk < uk+1), k ∈ {1, . . . , n − 2}. Более того, еще втайне от других он определяет целое число N, большее суммы всех элементов его последовательности, тоесть u0+...+un-1<N Затем он выбирает целое число Q, меньшее N и относительно простое число N (т.е. НОД(наименьший общий делитель)(Q, N) = 1). Подготовленный таким образом, он определяет последовательность (a0,...,an-1), элементы которой данные являются моделью ai = ui Q mod N.

Напишите программу, которая для открытого ключа Богумила, то есть строки (а0,...аn-1) построенный по формуле (ai = ui Q mod N) (на основе неизвестных нам (b0,...bn-1), N и Q), и, зашифрованное Алисой сообщение mˆ, поможет Сесилии прочитать сообщение m.

Более подробное описание задачи 4

import numpy as np
import math

def ToLine(priv, sym, n):
    num = 0`your text`
    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:\\Users\\Maks\\source\\repos\\RSA_BruteForce\\RSA_BruteForce\\{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:\\Users\\Maks\\source\\repos\\RSA_BruteForce\\RSA_BruteForce\\{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 шт):