Рубрики

Rail Fence Cipher — Шифрование и дешифрование

Получив текстовое сообщение и цифровой ключ, зашифруйте / расшифруйте данный текст с помощью алгоритма Rail Fence.
Шифр ограждения рельса (также называемый зигзагообразным шифром) является разновидностью шифра транспонирования. Он получает свое имя от того, как он закодирован.
Примеры:

Encryption
Input :  "GeeksforGeeks "
Key = 3
Output : GsGsekfrek eoe
Decryption
Input : GsGsekfrek eoe
Key = 3
Output :  "GeeksforGeeks "

Encryption
Input :  "defend the east wall"
Key = 3
Output : dnhaweedtees alf  tl
Decryption
Input : dnhaweedtees alf  tl
Key = 3
Output : defend the east wall

Encryption
Input : "attack at once"
Key = 2 
Output : atc toctaka ne 
Decryption
Input : "atc toctaka ne"
Key = 2
Output : attack at once

шифрование

В шифре транспонирования порядок алфавитов переупорядочен, чтобы получить зашифрованный текст.

  • В шифре рельсового забора простой текст написан вниз и по диагонали на последовательных рельсах воображаемого забора.
  • Когда мы достигаем нижнего рельса, мы движемся по диагонали вверх, после достижения верхнего рельса направление снова меняется. Таким образом, алфавиты сообщения написаны зигзагообразно.
  • После написания каждого алфавита отдельные строки объединяются для получения зашифрованного текста.

Например, если сообщение «GeeksforGeeks» и число рельсов = 3, то шифр готовится так:

Дешифрирование

Как мы видели ранее, количество столбцов в шифре ограждения остается равным длине текстового сообщения. И ключ соответствует количеству рельсов.

  • Следовательно, рельсовая матрица может быть построена соответственно. После того, как мы получили матрицу, мы можем определить места, где должны быть размещены тексты (используя тот же способ перемещения по диагонали вверх и вниз поочередно).
  • Затем заполняем строку зашифрованного текста. Заполнив его, мы проходим матрицу зигзагообразно, чтобы получить исходный текст.

Реализация:
Пусть cipher-text = «GsGsekfrek eoe», а Key = 3

  • Количество столбцов в матрице = len (шифр-текст) = 12
  • Количество рядов = ключ = 3

Следовательно, исходная матрица будет иметь размер 3 * 12, теперь помечая места текстом как '*', мы получаем

* _ _ _ * _ _ _ * _ _ _ *
_ * _ * _ * _ * _ * _ * 
_ _ * _ _ _ *  _ _ _ * _ 

Ниже приведена программа для шифрования / дешифрования сообщения с использованием вышеуказанного алгоритма.

C ++

// C ++ программа для иллюстрации Rail Fence Cipher
// Шифрование и дешифрование
#include <bits/stdc++.h>

using namespace std;

  
// функция для шифрования сообщения

string encryptRailFence(string text, int key)

{

    // создаем матрицу для шифрования простого текста

    // ключ = строки, длина (текст) = столбцы

    char rail[key][(text.length())];

  

    // заполнение рельсовой матрицы для различения заполненных

    // пробелы из пустых

    for (int i=0; i < key; i++)

        for (int j = 0; j < text.length(); j++)

            rail[i][j] = '\n';

  

    // найти направление

    bool dir_down = false;

    int row = 0, col = 0;

  

    for (int i=0; i < text.length(); i++)

    {

        // проверяем направление потока

        // изменить направление, если мы только что

        // заполнил верхний или нижний рельс

        if (row == 0 || row == key-1)

            dir_down = !dir_down;

  

        // заполнить соответствующий алфавит

        rail[row][col++] = text[i];

  

        // найти следующую строку, используя флаг направления

        dir_down?row++ : row--;

    }

  

    // теперь мы можем построить шифр с использованием матрицы рельсов

    string result;

    for (int i=0; i < key; i++)

        for (int j=0; j < text.length(); j++)

            if (rail[i][j]!='\n')

                result.push_back(rail[i][j]);

  

    return result;

}

  
// Эта функция получает зашифрованный текст и ключ
// и возвращает исходный текст после расшифровки

string decryptRailFence(string cipher, int key)

{

    // создаем матрицу для шифрования простого текста

    // ключ = строки, длина (текст) = столбцы

    char rail[key][cipher.length()];

  

    // заполнение рельсовой матрицы для различения заполненных

    // пробелы из пустых

    for (int i=0; i < key; i++)

        for (int j=0; j < cipher.length(); j++)

            rail[i][j] = '\n';

  

    // найти направление

    bool dir_down;

  

    int row = 0, col = 0;

  

    // помечаем места знаком '*'

    for (int i=0; i < cipher.length(); i++)

    {

        // проверяем направление потока

        if (row == 0)

            dir_down = true;

        if (row == key-1)

            dir_down = false;

  

        // разместить маркер

        rail[row][col++] = '*';

  

        // найти следующую строку, используя флаг направления

        dir_down?row++ : row--;

    }

  

    // теперь мы можем построить заполнение матрицы рельса

    int index = 0;

    for (int i=0; i<key; i++)

        for (int j=0; j<cipher.length(); j++)

            if (rail[i][j] == '*' && index<cipher.length())

                rail[i][j] = cipher[index++];

  

  

    // теперь читаем матрицу зигзагообразно для построения

    // результирующий текст

    string result;

  

    row = 0, col = 0;

    for (int i=0; i< cipher.length(); i++)

    {

        // проверяем направление потока

        if (row == 0)

            dir_down = true;

        if (row == key-1)

            dir_down = false;

  

        // разместить маркер

        if (rail[row][col] != '*')

            result.push_back(rail[row][col++]);

  

        // найти следующую строку, используя флаг направления

        dir_down?row++: row--;

    }

    return result;

}

  
// программа драйвера для проверки вышеуказанных функций

int main()

{

    cout << encryptRailFence("attack at once", 2) << endl;

    cout << encryptRailFence("GeeksforGeeks ", 3) << endl;

    cout << encryptRailFence("defend the east wall", 3) << endl;

  

    // Теперь расшифровка того же зашифрованного текста

    cout << decryptRailFence("GsGsekfrek eoe",3) << endl;

    cout << decryptRailFence("atc toctaka ne",2) << endl;

    cout << decryptRailFence("dnhaweedtees alf tl",3) << endl;

  

    return 0;

}

python3

# Python3 программа для иллюстрации
# Rail Fence Cipher Шифрование
# и расшифровка

  
# функция для шифрования сообщения

def encryptRailFence(text, key):

  

    # создать матрицу для шифрования

    # простой текстовый ключ = строки,

    # длина (текст) = столбцы

    # заполнение рельсовой матрицы

    # различать заполненные

    # пробелы из пустых

    rail = [['\n' for i in range(len(text))]

                  for j in range(key)]

      

    # чтобы найти направление

    dir_down = False

    row, col = 0, 0

      

    for i in range(len(text)):

          

        # проверить направление потока

        # изменить направление, если мы только что

        # заполнен верхний или нижний рельс

        if (row == 0) or (row == key - 1):

            dir_down = not dir_down

          

        # заполните соответствующий алфавит

        rail[row][col] = text[i]

        col += 1

          

        # найти следующую строку, используя

        # флаг направления

        if dir_down:

            row += 1

        else:

            row -= 1

    # теперь мы можем построить шифр

    # с использованием рельсовой матрицы

    result = []

    for i in range(key):

        for j in range(len(text)):

            if rail[i][j] != '\n':

                result.append(rail[i][j])

    return("" . join(result))

      
# Эта функция получает зашифрованный текст
# и ключ и возвращает оригинал
# текст после расшифровки

def decryptRailFence(cipher, key):

  

    # создать матрицу для шифрования

    # простой текстовый ключ = строки,

    # длина (текст) = столбцы

    # заполнение рельсовой матрицы до

    # различать заполненные пробелы

    # из пустых

    rail = [['\n' for i in range(len(cipher))] 

                  for j in range(key)]

      

    # чтобы найти направление

    dir_down = None

    row, col = 0, 0

      

    # пометьте места знаком '*'

    for i in range(len(cipher)):

        if row == 0:

            dir_down = True

        if row == key - 1:

            dir_down = False

          

        # разместить маркер

        rail[row][col] = '*'

        col += 1

          

        # найти следующую строку

        # используя флаг направления

        if dir_down:

            row += 1

        else:

            row -= 1

              

    # теперь мы можем построить

    # заполнить матрицу рельса

    index = 0

    for i in range(key):

        for j in range(len(cipher)):

            if ((rail[i][j] == '*') and

               (index < len(cipher))):

                rail[i][j] = cipher[index]

                index += 1

          

    # Теперь прочитайте матрицу в

    # зигзагообразная манера построения

    # результирующий текст

    result = []

    row, col = 0, 0

    for i in range(len(cipher)):

          

        # проверить направление потока

        if row == 0:

            dir_down = True

        if row == key-1:

            dir_down = False

              

        # разместить маркер

        if (rail[row][col] != '*'):

            result.append(rail[row][col])

            col += 1

              

        # найти следующую строку, используя

        # флаг направления

        if dir_down:

            row += 1

        else:

            row -= 1

    return("".join(result))

  
# Код драйвера

if __name__ == "__main__":

    print(encryptRailFence("attack at once", 2))

    print(encryptRailFence("GeeksforGeeks ", 3))

    print(encryptRailFence("defend the east wall", 3))

      

    # Теперь расшифровка

    # тот же зашифрованный текст

    print(decryptRailFence("GsGsekfrek eoe", 3))

    print(decryptRailFence("atc toctaka ne", 2))

    print(decryptRailFence("dnhaweedtees alf tl", 3))

  
# Этот код добавлен
# Пратиком Сомванши

Выход:

atc toctaka ne
GsGsekfrek eoe
dnhaweedtees alf  tl
GeeksforGeeks 
attack at once
delendfthe east wal


Ссылки:

https://en.wikipedia.org/wiki/Rail_fence_cipher

Эта статья пополняемая Ashutosh Кумар Если вам нравится GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Rail Fence Cipher — Шифрование и дешифрование

0.00 (0%) 0 votes