Тайнопис за начинаещи
- Краен срок
- 19.11.2022 18:00
Срокът за предаване на решения е отминал
Криптографията, или както в българската Уикипедия страница пише - "Тайнопис", е много обширна наука, в която няма как да навлезем в рамките на едно предизвикателство.
Накратко - занимава се с това как се преобразува информация, така че тя да е нечетима / неразбираема (или поне за тези, без знанията да разшифрират резултата).
За целите на предизвикателството ще разгледаме няколко свръх-прости шифъра:
ROT-13
ROT-13 e прост субституционен шифър, при който всяка буква в азбуката (ние ще работим само с английската азбука от 26 букви) бива изместена с 13 позиции. Ето ви една описателна картинка, а ако искате да тествате как работи - rot13.com:
Atbash
Atbash е друг субституционен шифър, при който всяка буква в азбуката бива заместена с "огледалната" ѝ. С други думи A, първата буква, бива заместена със Z, последната буква. ABC става ZYX.
FN-XOR
FN-XOR няма... Или поне до този момент!
FN-XOR ще бъде вид XOR шифър, който се класифицира като адитивен шифър. Идеята на XOR шифрите е да използват ключ, с помощта на който да криптират даден текст, използвайки XOR операцията.
Как ще работи при нас
Ключ ще бъде вашият факултетен номер (повярвайте ми, искате да е конкретно вашият) в string формат.
ASCII кодът на всяка буква от съобщението за криптиране ще бъде XOR-нат с респективната буква (или цифра) от ключът ви. Ако съобщението е по-дълго от ключа ви (доста вероятно), "итерирането" по ключа просто започва отначало.
Резултатът от XOR операцията се интерпретира като ASCII код - взимаме символа, отговарящ на този код, и накрая получаваме криптиран низ.
Може би един пример ще е по-описателен:
Ключ - '61301'
Съобщение - 'Cryptography'
1. 'C' и '6' (първата буква на съобщението, първият символ на ключа) -> 67 ^ 54 (XOR) -> 117 (резултат от XOR - ASCII код) -> 'u' (символът, който отговаря на ASCII кода 117)
2. 'r' и '1' (втората буква на съобщението, вторият символ на ключа) -> 114 ^ 49 (XOR) -> 67 (резултат от XOR - ASCII код) -> 'C' (символът, който отговаря на ASCII кода 67)
3. ...
4. ...
5. ...
6. 'o' и '6' (шестата буква на съобщението, символите на ключа "свършиха", така че започваме от първия) -> 111 ^ 54 -> 89 -> 'Y'
И така нататък...
Накрая получаваме:
uCJ@EYVAQA^H
И след всичките тези шифри, какво?
Искаме да направим декоратор encrypt_message
, който да прилагаме върху функции, които връщат стринг като резултат от изпълнението си. Искаме декораторът да приема един от следните 3 стринга:
- 'ROT-13' - използва ROT-13 криптиране
- 'ATBASH' - използва Atbash криптиране
- 'FN-XOR' - използва нашето лично FN-XOR криптиране
Ето ви примери с код:
@encrypt_message('ROT-13')
def michael_bolton():
return 'This is the tale of Captain Jack Sparrow!'
print(michael_bolton()) # Guvf vf gur gnyr bs Pncgnva Wnpx Fcneebj!
@encrypt_message('ATBASH')
def michael_bolton(person):
return f'This is the tale of {person}!'
print(michael_bolton('Captain Jack Sparrow')) # Gsrh rh gsv gzov lu Xzkgzrm Qzxp Hkziild!
@encrypt_message('FN-XOR')
def michael_bolton(person, description):
return f'This is the tale of {person}, {description}!'
print(michael_bolton('Captain Jack Sparrow', 'pirate so brave of the Seven Seas')) # bYZC_BDYSGQ]S\VuPCDP__zPUZcAWCA_FCYCWEVBYQBP@T_WE[UeTEU_bVQB
# В горното има шибани unicode символи, не го мислете, ние ще го мислим
# Също така, при вас ще е различно, защото ще използвате друг факултетен номер :p
Беше ми обещан бонус!
Сигурно се чудите къде ви е бонусът... Ако се справите успешно с предизвикателството, в output-а на тестовете ще намерите броят точки, които имате от контролното.
Ако искате да ги знаете преди да ги качим официално (с други думи с някой друг ден пред останалите) - успех с предизвикателството!
Бележки:
- За ROT-13 и Atbash заместваме само буквите от английската азбука. Големите се заместват с големи, малките - с малки.
- За FN-XOR всичко се прекарва през XOR алгоритъма - няма значение дали са букви или други символи
- Няма да тестваме със символи извън ASCII таблицата (макар че не би следвало да има значение)
- Няма да тестваме с функции с keyword аргументи
Решения
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Виктор
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 52.33лв
Брой получени точки: голямата примоция
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.079s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Никола Михайлов
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 22
Брой получени точки: 25
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.073s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Цветелина Чакърова
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 22
Брой получени точки: 25
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.071s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Георги Събев
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 20
Брой получени точки: 23
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.070s
OK
-
Некоректно
- 4 успешни тест(а)
- 3 неуспешни тест(а)
Йордан Глигоров
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 23
Брой получени точки: 27
=======================================================================
.FFF...
======================================================================
FAIL: test_atbash_empty_args (test.TestEncryptMessage)
Test for all chars in ATBASH with a function with empty args
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
AssertionError: 'zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA' != 'zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA0123456789'
- zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA
+ zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA0123456789
? ++++++++++
======================================================================
FAIL: test_atbash_is_inverse (test.TestEncryptMessage)
Test that the ATBASH encryption is it's own inverse
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
AssertionError: 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' != 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
- abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
? ++++++++++
======================================================================
FAIL: test_atbash_with_args (test.TestEncryptMessage)
Test for all chars in ATBASH with a function with non-empty args
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
AssertionError: 'zyxwvutsrqponmlkjihgfedcba ZYXWVUTSRQPONMLKJIHGFEDCBA !' != 'zyxwvutsrqponmlkjihgfedcba, ZYXWVUTSRQPONMLKJIHGFEDCBA, 0123456789!'
- zyxwvutsrqponmlkjihgfedcba ZYXWVUTSRQPONMLKJIHGFEDCBA !
? ^
+ zyxwvutsrqponmlkjihgfedcba, ZYXWVUTSRQPONMLKJIHGFEDCBA, 0123456789!
? + ^^^^^^^^^^^^
----------------------------------------------------------------------
Ran 7 tests in 0.081s
FAILED (failures=3)
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Радостин Маринов
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 22
Брой получени точки: 25
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.073s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Петър Тодоров
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 16
Брой получени точки: 18
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.072s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Мариян Христов
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 15
Брой получени точки: 17
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.197s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Емилиан Спасов
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 18
Брой получени точки: 21
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.070s
OK
-
Некоректно
- 0 успешни тест(а)
- 0 неуспешни тест(а)
Роберт Борисов
Invalid result for FN-XOR.
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 114, in main
loaded_test = importlib.import_module('test', test_module)
File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 883, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/tmp/d20221119-4144380-r7t3l4/test.py", line 169, in <module>
raise Exception('Invalid result for FN-XOR.')
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Ивана Дончевска
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 16
Брой получени точки: 18
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.083s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Йоан Бабулков
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 25
Брой получени точки: 29
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.071s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Александър Сариков
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 16
Брой получени точки: 18
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.070s
OK
-
Некоректно
- 4 успешни тест(а)
- 3 неуспешни тест(а)
Назифе Алиджик
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 19
Брой получени точки: 22
=======================================================================
.FFF...
======================================================================
FAIL: test_atbash_empty_args (test.TestEncryptMessage)
Test for all chars in ATBASH with a function with empty args
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
AssertionError: 'zyxwvutsrqponmlkjihgfedxbaZYXWVUTSRQPONMLKJIHGFEDCBA0123456789' != 'zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA0123456789'
- zyxwvutsrqponmlkjihgfedxbaZYXWVUTSRQPONMLKJIHGFEDCBA0123456789
? ^
+ zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA0123456789
? ^
======================================================================
FAIL: test_atbash_is_inverse (test.TestEncryptMessage)
Test that the ATBASH encryption is it's own inverse
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
AssertionError: 'abxdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' != 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
- abxdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
? ^
+ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
? ^
======================================================================
FAIL: test_atbash_with_args (test.TestEncryptMessage)
Test for all chars in ATBASH with a function with non-empty args
----------------------------------------------------------------------
Traceback (most recent call last):
File "/storage/deedee/data/rails/pyfmi-2022/releases/20221115154139/lib/language/python/runner.py", line 67, in thread
raise result
AssertionError: 'zyxwvutsrqponmlkjihgfedxba, ZYXWVUTSRQPONMLKJIHGFEDCBA, 0123456789!' != 'zyxwvutsrqponmlkjihgfedcba, ZYXWVUTSRQPONMLKJIHGFEDCBA, 0123456789!'
- zyxwvutsrqponmlkjihgfedxba, ZYXWVUTSRQPONMLKJIHGFEDCBA, 0123456789!
? ^
+ zyxwvutsrqponmlkjihgfedcba, ZYXWVUTSRQPONMLKJIHGFEDCBA, 0123456789!
? ^
----------------------------------------------------------------------
Ran 7 tests in 0.081s
FAILED (failures=3)
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Харут Партамиан
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 13
Брой получени точки: 15
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.072s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Йоанна Кръстева
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 22
Брой получени точки: 25
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.075s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Стилиян Иванов
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 26
Брой получени точки: 30
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.070s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Антоан Ивайлов
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 23
Брой получени точки: 27
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.073s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Айше Джинджи
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 22
Брой получени точки: 25
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.075s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Петър Петров
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 14
Брой получени точки: 16
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.073s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Теодора Петкова
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 16
Брой получени точки: 18
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.073s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Таня Сейкова
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 16
Брой получени точки: 18
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.073s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Надежда Панделиева
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 17
Брой получени точки: 20
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.077s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Александра Павлова
Guvf vf gur gnyr bs Pncgnva Wnpx Fcneebj!
Gsrh rh gsv gzov lu Xzkgzrm Qzxp Hkziild!
gY_GZB@YVBU]VYRpPF@PZ_~PPZgARCD[FF]CRESB\TFPET[WE^Q`T@Q_bSUB
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 11
Брой получени точки: 13
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.073s
OK
-
Коректно
- 7 успешни тест(а)
- 0 неуспешни тест(а)
Ангел Марински
=======================================================================
Честито! Ти успя да видиш резултатите си преди останалите плебеи:
Брой верни отговори: 17
Брой получени точки: 20
=======================================================================
.......
----------------------------------------------------------------------
Ran 7 tests in 0.075s
OK