Rail Fence Cipher - шифрование и дешифрование
Учитывая текстовое сообщение и числовой ключ, зашифруйте / расшифруйте данный текст с помощью алгоритма Rail Fence.
Шифр ограждения рельсов (также называемый зигзагообразным шифром) - это форма транспозиционного шифра. Он получил свое название от способа, которым он закодирован.
Примеры:
Шифрование Ввод: "GeeksforGeeks" Ключ = 3 Выход: GsGsekfrek eoe Расшифровка Сырьё: GsGsekfrek eoe. Ключ = 3 Выход: "GeeksforGeeks" Шифрование Вход: «Защити восточную стену». Ключ = 3 Выход: dnhaweedtees alf tl Расшифровка Сырьё: dnhaweedtees alf tl. Ключ = 3 Выход: защитить восточную стену. Шифрование Ввод: "атаковать сразу" Ключ = 2 Выход: atc toctaka ne Расшифровка Ввод: "atc toctaka ne" Ключ = 2 Выход: атаковать сразу
Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.
Шифрование
В транспозиционном шифре порядок алфавитов переупорядочивается для получения зашифрованного текста.
- В шифре рельсового ограждения обычный текст записывается вниз и по диагонали на последовательных рельсах воображаемого забора.
- Когда мы достигаем нижнего рельса, мы движемся вверх по диагонали, после достижения верхнего рельса направление снова меняется. Таким образом, алфавиты сообщения написаны зигзагообразно.
- После того, как каждый алфавит был написан, отдельные строки объединяются для получения зашифрованного текста.
Например, если сообщение - «GeeksforGeeks» и количество рельсов = 3, тогда шифр готовится как:
Расшифровка
Как мы видели ранее, количество столбцов в шифре ограждения рельсов остается равным длине обычного текстового сообщения. И ключ соответствует количеству рельсов.
- Следовательно, рельсовая матрица может быть сконструирована соответствующим образом. После того, как у нас есть матрица, мы можем определить места, где следует разместить текст (используя тот же способ перемещения по диагонали вверх и вниз поочередно).
- Затем мы заполняем строку зашифрованного текста по мере необходимости. После его заполнения мы проходим по матрице зигзагообразно, чтобы получить исходный текст.
Реализация:
Пусть cipher-text = «GsGsekfrek eoe», а ключ = 3.
- Количество столбцов в матрице = len (зашифрованный текст) = 12
- Количество строк = ключ = 3
Следовательно, исходная матрица будет 3 * 12, теперь помечая места с текстом как '*', мы получаем
* _ _ _ * _ _ _ * _ _ _ * _ * _ * _ * _ * _ * _ * _ _ * _ _ _ * _ _ _ * _
Below is a program to encrypt/decrypt the message using the above algorithm.
C++
// C++ program to illustrate Rail Fence Cipher// Encryption and Decryption#include <bits/stdc++.h>using namespace std; // function to encrypt a messagestring encryptRailFence(string text, int key){ // create the matrix to cipher plain text // key = rows , length(text) = columns char rail[key][(text.length())]; // filling the rail matrix to distinguish filled // spaces from blank ones for (int i=0; i < key; i++) for (int j = 0; j < text.length(); j++) rail[i][j] = "
"; // to find the direction bool dir_down = false; int row = 0, col = 0; for (int i=0; i < text.length(); i++) { // check the direction of flow // reverse the direction if we"ve just // filled the top or bottom rail if (row == 0 || row == key-1) dir_down = !dir_down; // fill the corresponding alphabet rail[row][col++] = text[i]; // find the next row using direction flag dir_down?row++ : row--; } //now we can construct the cipher using the rail matrix string result; for (int i=0; i < key; i++) for (int j=0; j < text.length(); j++) if (rail[i][j]!="
") result.push_back(rail[i][j]); return result;} // This function receives cipher-text and key// and returns the original text after decryptionstring decryptRailFence(string cipher, int key){ // create the matrix to cipher plain text // key = rows , length(text) = columns char rail[key][cipher.length()]; // filling the rail matrix to distinguish filled // spaces from blank ones for (int i=0; i < key; i++) for (int j=0; j < cipher.length(); j++) rail[i][j] = "
"; // to find the direction bool dir_down; int row = 0, col = 0; // mark the places with "*" for (int i=0; i < cipher.length(); i++) { // check the direction of flow if (row == 0) dir_down = true; if (row == key-1) dir_down = false; // place the marker rail[row][col++] = "*"; // find the next row using direction flag dir_down?row++ : row--; } // now we can construct the fill the rail matrix 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++]; // now read the matrix in zig-zag manner to construct // the resultant text string result; row = 0, col = 0; for (int i=0; i< cipher.length(); i++) { // check the direction of flow if (row == 0) dir_down = true; if (row == key-1) dir_down = false; // place the marker if (rail[row][col] != "*") result.push_back(rail[row][col++]); // find the next row using direction flag dir_down?row++: row--; } return result;} //driver program to check the above functionsint main(){ cout << encryptRailFence("attack at once", 2) << endl; cout << encryptRailFence("GeeksforGeeks ", 3) << endl; cout << encryptRailFence("defend the east wall", 3) << endl; //Now decryption of the same cipher-text cout << decryptRailFence("GsGsekfrek eoe",3) << endl; cout << decryptRailFence("atc toctaka ne",2) << endl; cout << decryptRailFence("dnhaweedtees alf tl",3) << endl; return 0;} |
Python3
# Python3 program to illustrate # Rail Fence Cipher Encryption# and Decryption # function to encrypt a messagedef encryptRailFence(text, key): # create the matrix to cipher # plain text key = rows , # length(text) = columns # filling the rail matrix # to distinguish filled # spaces from blank ones rail = [["
" for i in range(len(text))] for j in range(key)] # to find the direction dir_down = False row, col = 0, 0 for i in range(len(text)): # check the direction of flow # reverse the direction if we"ve just # filled the top or bottom rail if (row == 0) or (row == key - 1): dir_down = not dir_down # fill the corresponding alphabet rail[row][col] = text[i] col += 1 # find the next row using # direction flag if dir_down: row += 1 else: row -= 1 # now we can construct the cipher # using the rail matrix result = [] for i in range(key): for j in range(len(text)): if rail[i][j] != "
": result.append(rail[i][j]) return("" . join(result)) # This function receives cipher-text # and key and returns the original # text after decryptiondef decryptRailFence(cipher, key): # create the matrix to cipher # plain text key = rows , # length(text) = columns # filling the rail matrix to # distinguish filled spaces # from blank ones rail = [["
" for i in range(len(cipher))] for j in range(key)] # to find the direction dir_down = None row, col = 0, 0 # mark the places with "*" for i in range(len(cipher)): if row == 0: dir_down = True if row == key - 1: dir_down = False # place the marker rail[row][col] = "*" col += 1 # find the next row # using direction flag if dir_down: row += 1 else: row -= 1 # now we can construct the # fill the rail matrix 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 # now read the matrix in # zig-zag manner to construct # the resultant text result = [] row, col = 0, 0 for i in range(len(cipher)): # check the direction of flow if row == 0: dir_down = True if row == key-1: dir_down = False # place the marker if (rail[row][col] != "*"): result.append(rail[row][col]) col += 1 # find the next row using # direction flag if dir_down: row += 1 else: row -= 1 return("".join(result)) # Driver codeif __name__ == "__main__": print(encryptRailFence("attack at once", 2)) print(encryptRailFence("GeeksforGeeks ", 3)) print(encryptRailFence("defend the east wall", 3)) # Now decryption of the # same cipher-text print(decryptRailFence("GsGsekfrek eoe", 3)) print(decryptRailFence("atc toctaka ne", 2)) print(decryptRailFence("dnhaweedtees alf tl", 3)) # This code is contributed # by Pratik Somwanshi |
Выход:
atc toctaka ne GsGsekfrek eoe dnhaweedtees alf tl GeeksforGeeks атаковать сразу Делендф восточный вал
Использованная литература:
https://en.wikipedia.org/wiki/Rail_fence_cipher
Автором этой статьи является Ашутош Кумар. Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью с помощью сайта deposit.geeksforgeeks.org или отправить ее по электронной почте на адрес deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.
Вниманию читателя! Не прекращайте учиться сейчас. Освойте все важные концепции DSA с помощью самостоятельного курса DSA по приемлемой для студентов цене и будьте готовы к работе в отрасли. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
Если вы хотите посещать живые занятия с отраслевыми экспертами, пожалуйста, обращайтесь к Geeks Classes Live и Geeks Classes Live USA.