3-сабақ

Цезарь Шифры

Цезарь шифры ,вигысу шифры деп те аталады, Цезарь коды – ең қарапайым және кең таралған шифрлау әдістерінің бірі.

Цезарь шифры-бұл ашық мәтіндегі әрбір таңба алфавиттегі сол немесе оң жақтағы позициялардың тұрақты санында орналасқан таңбамен ауыстырылатын ауыстыру шифрының бір түрі. Мысалы, оңға жылжитын шифрда 3, А ауыстырылатын еді Г, Б болады Д, және т.б.

Шифр Рим генералы Гай Юлий Цезарьдың есімімен аталады, ол оны генералдарымен құпия хат алмасу үшін қолданған.

Исходный алфавит: А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
Шифрованный:      Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я А Б В 

Түпнұсқа мәтін:

Расшифруйте меня если сможете

Кілт: 5

Шифрланған мәтін түпнұсқа мәтіннің әр әрпін тиісті шифрланған алфавит әрпімен ауыстыру арқылы алынады:

Хецэнщхшочй сйты йцрн цсулйчй

Тарих және қолдану

Цезарь шифры Гай Юлий Цезарьдың есімімен аталады, ол оны сол жақ ауысыммен 3-ке қолданды

Цезарь шифры Юлий Цезарьдың есімімен аталады, ол Светонийдің “он екі Цезарьдың өмірі” бойынша оны 3-ші ауысыммен әскери хабарламаларды қорғау үшін қолданған. Цезарь бұл схеманы қолданған алғашқы тіркелген адам болғанымен, басқа ауыстыру шифрлары бұрын да қолданылғаны белгілі.

Егер оның тасымалдау үшін құпия нәрсе болса, онда ол оны шифрмен жазды, яғни алфавит әріптерінің ретін өзгертті, сондықтан бірде-бір сөзді бөлшектеу мүмкін болмады. Егер кімде-кім оның шифрын шешіп, мағынасын түсінгісі келсе, онда ол алфавиттің төртінші әрпін, атап айтқанда, D, A үшін және т.б., басқа әріптермен алмастыруы керек еді.
Гай Суетониус Транквилл он екі Цезарьдың өмірі, бірінші кітап, ч. 56

Оның жиені Август бұл шифрды да қолданды, бірақ оңға қарай жылжып, алфавиттің басында қайталанбады:

Ол шифрмен жазған сайын, ол А үшін В, В үшін С және Х үшін АА-ны қолдана отырып, сол принцип бойынша әріптердің қалған бөлігін жазды.
Гай Суетониус Транквилл он екі Цезарьдың өмірі, екінші кітап, ч. 88

Юлий Цезарьдың неғұрлым күрделі схемаларды қолданғаны туралы дәлелдер бар

Ол кезде Цезарь шифрының қаншалықты тиімді болғаны белгісіз, бірақ ол Цезарьдың жауларының көпшілігі сауатсыз болғандықтан және көбісі хабарламалар белгісіз шет тілінде жазылған деп есептегендіктен, ол ақылға қонымды қауіпсіз болған шығар. Қарапайым ауыстыру шифрларын бұзу әдістеріне қатысты Уақыт туралы ешқандай дәлел жоқ. Жиілікті талдау туралы ең алғашқы жазбалар-9 ғасырдағы Аль-Киндидің жиілікті талдауды ашу туралы еңбектері

XIX ғасырда газеттердегі жарнамалардың жеке бөлімі кейде қарапайым шифрлармен шифрланған хабарламалармен алмасу үшін қолданылған. Кан (1967) әуесқойлар “Таймс”фильмінде Цезарь шифрын пайдаланып шифрланған құпия коммуникацияларға қатысқан жағдайларды сипаттайды. Кейінірек, 1915 жылы Цезарь шифры қолданылды: Ресей армиясы оны әскерлер үшін тым күрделі болып шыққан күрделі шифрлардың орнына қолданды; неміс және австриялық криптоаналитиктер бұл хабарламаларды шешуде аз ғана қиындықтарға тап болды.

Он үш ауысымдық Цезарь шифры Rot13 алгоритмінде де қолданылады, бұл Usenet ‘ e-де кеңінен қолданылатын қарапайым мәтінді шатастыру әдісі және шифрлау әдісінен гөрі Спойлерлерді жасыру әдісі ретінде қолданылады. Vigener шифры Цезарь шифрын мәтіндегі әр позицияда әр түрлі сдысулармен қолданады; сдысу мәні қайталанатын кілт сөз арқылы анықталады. Егер кілт сөз хабарлама сияқты ұзын болса, кездейсоқ жасалса, құпия болып табылады және тек бір рет қолданылады — мұндай схема деп аталады бір реттік блокнот схемасы — және бұл абсолютті криптографиялық беріктігі дәлелденген жалғыз шифрлау жүйесі.

Кілт сөздер хабарламадан қысқа (мысалы, Конфедерация АҚШ азамат соғысы кезінде қолданған “толық жеңіс”) жиілікті талдаудың жетілдірілген нұсқасы арқылы анықталуы мүмкін циклдік үлгіні енгізеді.

2006 жылдың сәуірінде мафияның қашқын бастығы Бернардо Провенцано Сицилияда ішінара Цезарь шифрының вариациясын қолдана отырып жазылған жазбаларын криптоанализдегендіктен ұсталды. Провенцано шифрында әріптер алдымен сандармен ауыстырылды-алфавиттегі әріптердің реттік нөмірлері, ал алынған сандар тізбегіне Цезарь шифры қолданылды — 3-ке ауысқан кезде “А “” 4″,” В “” 5 ” және т.б.

Көбінесе Цезарь шифрын пайдалану ыңғайлылығы үшін дискілердің жиектеріне сызылған алфавиттері бар әртүрлі диаметрлі дискінің жалпы осіне орнатылған екі диск қолданылады. Бастапқыда дискілер сыртқы диск алфавитінің әр әрпіне қарама-қарсы шағын диск алфавитінің әрпі болатындай етіп бұрылады. Егер біз қазір ішкі дискіні бірнеше таңбаға айналдырсақ, онда біз сыртқы диск пен ішкі таңбалар арасындағы сәйкестікті аламыз — Цезарь шифры. Алынған дискіні шифрлау үшін де, шифрды ашу үшін де пайдалануға болады.

Мысалы, егер ішкі доңғалақ сыртқы дискінің a таңбасы ішкі дискінің D таңбасына сәйкес келетін етіп бұрылса, онда біз 3 солға жылжитын шифр аламыз.

Төменгі жағында Мен сізге Python бағдарламасының кодын бердім, Python -ного ресми сайттан орнатыңыз және жаңа файлды ашып, осы кодты жазыңыз. Содан кейін іске қосыңыз

# Текст, который пользователь хочет ввести
text = input("Введите текст, который хотите зашифровавать: ")
# Пользователь вводит ключ
k = int(input("Укажите ключ: "))
# Пользователь вводит язык текста, который будет зашифрован
language = input("На каком языке текст, который вы ввели (русский, английский): ")


# Функция шифрования с тремя параметрами: текст, ключ, язык
def ceaser_cipher(user, key, lang):
    # Переменная результата шифрования; переменная, опредиляющая верхний и нижний регистр
    res, n = [], ""

    # Проверка пользователем выбранного языка

    # Проверка выбран ли русский язык (регистр букв, вводимых пользователем, не важен)
    if lang.lower() in ["русский", "russian"]:
        # Двум переменным присваиваются русская азбука нижнего и верхнего регистра соответственно
        dictionary, dictionary_upper = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя", "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
    # Проверка выбран ли английский язык язык (регистр букв, вводимых пользователем, не важен)
    elif lang.lower() in ["английский", "english"]:
        # Двум переменным присваиваются английской азбука нижнего и верхнего регистра соответственно
        dictionary, dictionary_upper = "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    else:
        return "Такого языка нет в опции"

    # Цикл проверки, где каждую итерацию будет обрабатываться один символ из текста последовательно
    for i in range(len(user)):
        # Проверка символа на верхний или нижний регистр

        # Принадлежит ли символ нижнему регистру
        if user[i] in dictionary:
            n = dictionary
        # Принадлежит ли символ верхнему регистру
        elif user[i] in dictionary_upper:
            n = dictionary_upper
        # Символ не принадлежит ни нижнему ни верхнему регистру (символ не является буквой)
        else:
            res.append(user[i])

        # Если символ есть в списке n (является буквой), то будет происходить его зашифровка
        if user[i] in n:
            # Цикл перебора азбуки
            for j in range(len(n)):
                # Если порядковый номер буквы + ключ находятся  в диапазоне от 0 до конца азбуки
                # и если буква из текста совпадает с буквой из азбуки, то:
                if 0 <= j + key < len(n) and user[i] == n[j]:
                    # В результат добавляется буква со сдвигом key (зашифрованная буква)
                    res.append(n[j + key])
                # Если порядковый номер буквы + ключ выходит из диапазона азбуки, превышая его
                # и если буква из текста совпадает с буквой из азбуки, то:
                elif j + key >= len(n) and user[i] == n[j]:
                    # В результат добавляеться буква со сдвигом key,
                    # при этом преводя порядковый номер буквы к диапазону азбуки (зашифрованая буква)
                    res.append(n[(1 - j - key) % (len(n) - 1)])
                # Если порядковый номер буквы + ключ выходит из диапазона азбуки, недотягивает до него
                # и если буква из текста совпадает с буквой из азбуки, то:
                elif j + key < 0 and user[i] == n[j]:
                    # В результат добавляеться буква со сдвигом key,
                    # при этом преводя порядковый номер буквы к диапазону азбуки (зашифрованая буква)
                    res.append(n[(j + key) % len(n)])

    # Функция возвращает зашифрованный текст
    return ''.join(res)


# Вывод зашифрованного текста
print(ceaser_cipher(text, k, language))