-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
49 lines (44 loc) · 4.39 KB
/
main.py
File metadata and controls
49 lines (44 loc) · 4.39 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#первая часть
input_data = '1001110011100111001' # строка с входящими данными
key = '1001001110111101110' # строка с ключом
input_data_bin = int(input_data, 2)
key_bin = int(key, 2)
len_data = len(input_data) # длина входящих данных
answer = str(bin(input_data_bin ^ key_bin)[2:]) #приводим к двоичному виду
len_answer = len(str(answer)) # длина ответа; может быть так, что в результате шифрования в начале числа будут незначащие нули; выводиться они не будут, поэтому добавим их вручную
delta = abs(len_data - len_answer) # разница длин входящих данных и ответа - по факту, сколько незначащих нулей надо добавить в начало
if delta > 0: # если разница длин больше нуля
answer = '0' * delta + answer # перезаписываем ответ с недостающими нулями в начале
print("Шифрование")
print("Входящие данные: " + input_data + "\n" + "Ключ: " + key + '\n' + "Результат: " + answer) # выводим ответ
#вторая часть
key = '1111001101110010110' # строка с ключом
output_data = '1001110011100111001' # строка с выходящими данными
input_data = '' # пустая строка для входящих данных
for i in range(0, len(key), 1): # цикл от 0 до длины ключа
if key[i] == '1': # если на i-том месте ключа стоит единица
input_data += '0' if output_data[i] == '1' else '1' # то добавляем i-тый обратный символ выходящих данных
else: # если на i-том месте ключа стоит 0
input_data += output_data[i] # добавляем ко входящим данным i-тый символ выходящих
print("\n\n\nРасшифрование")
print("Ключ: " + key + '\n' + "Выходящие данные: " + output_data + '\n' + "Результат: " + input_data) # выводим
print("Шифруем результат и проверяем на идентичность: ", int(input_data, 2) ^ int(key, 2) == int(output_data, 2)) # для проверки, входящие данные ксорим с ключом, получаем выходящие
#третья часть
input_data = '1111100000' # строка с входящими данными
output_data = '0101010101' # строка с выходящими данными
key = '' # пустая строка для ключа
for i in range(0, len(input_data), 1): # цикл от 0 до длины входящих данных
if input_data[i] == '1' and output_data[i] == '1': # тут чисто по таблице истинности операции xor; если во входящих данных i-тый символ 1 и в выходящих i-тый символ 1 -> добавляем к ключу 0
key += '0'
if input_data[i] == '1' and output_data[i] == '0': # если во входящих данных i-тый символ 1 и в выходящих i-тый символ 0 -> добавляем к ключу 1
key += '1'
if input_data[i] == '0' and output_data[i] == '0': # если во входящих данных i-тый символ 0 и в выходящих i-тый символ 0 -> добавляем к ключу 0
key += '0'
if input_data[i] == '0' and output_data[i] == '1': # если во входящих данных i-тый символ 0 и в выходящих i-тый символ 1 -> добавляем к ключу 1
key += '1'
print("\n\n\nУзнаеём ключ по входящим и выходящим данным")
print("Входящие данные: " + input_data + "\n" + "Выходящие данные: " + output_data + '\n' + "Ключ: " + key) # выводим
print("Шифруем результат и проверяем на идентичность: ", int(input_data, 2) ^ int(key, 2) == int(output_data, 2)) # проверям как во второй части
print("--------------Для выхода нажмите ENTER--------------")
input()
exit()