Шифрование и дешифррвание данных в питоне
Алисия хочет отправить Богумилу сообщение. Они знают, что Сесилия будет их подслушивать. общение, поэтому они соглашаются использовать следующий метод шифрования. Богумил выбирает известную только ему последовательность натуральных чисел (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.
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()
Большие числа не работают. И весь процесс занимает слишком много времени. Помогите найти причину проблемы.
