Реализацией расшифровки алгоритма 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()

