Шифр ROT13

Опубликовано: 26 Января, 2022

Шифр ROT13 (читается как «повернуть на 13 позиций») - это частный случай шифра Ceaser, в котором сдвиг всегда равен 13.
Таким образом, каждая буква сдвигается на 13 позиций, чтобы зашифровать или расшифровать сообщение.
я
Вы, должно быть, думаете, что это просто еще один шифр Цезаря, так что же на этот раз изменилось? Ну разница в его реализации. Подход заключается в использовании двух отдельных словарей Python.

  1. Первый, который ищет различные буквы в соответствии с их местом в английском алфавите, чтобы получить сдвинутый номер
  2. Второй, чтобы получить буквы, соответствующие сдвинутым числам.

Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.

Code :

Python

# Python program to implement 
# ROT13 Caesar cipher
  
"""This script uses dictionaries instead of "chr()" & "ord()" function"""
  
# Dictionary to lookup the index of alphabets
dict1 = {"A" : 1, "B" : 2, "C" : 3, "D" : 4, "E" : 5,
        "F" : 6, "G" : 7, "H" : 8, "I" : 9, "J" : 10,
        "K" : 11, "L" : 12, "M" : 13, "N" : 14, "O" : 15,
        "P" : 16, "Q" : 17, "R" : 18, "S" : 19, "T" : 20,
        "U" : 21, "V" : 22, "W" : 23, "X" : 24, "Y" : 25, "Z" : 26}
  
# Dictionary to lookup alphabets 
# corresponding to the index after shift
dict2 = {0 : "Z", 1 : "A", 2 : "B", 3 : "C", 4 : "D", 5 : "E",
        6 : "F", 7 : "G", 8 : "H", 9 : "I", 10 : "J",
        11 : "K", 12 : "L", 13 : "M", 14 : "N", 15 : "O",
        16 : "P", 17 : "Q", 18 : "R", 19 : "S", 20 : "T",
        21 : "U", 22 : "V", 23 : "W", 24 : "X", 25 : "Y"}
  
# Function to encrypt the string 
# according to the shift provided
def encrypt(message, shift):
    cipher = ""
    for letter in message:
        # checking for space
        if(letter != " "):
            # looks up the dictionary and 
            # adds the shift to the index
            num = ( dict1[letter] + shift ) % 26
            # looks up the second dictionary for 
            # the shifted alphabets and adds them
            cipher += dict2[num]
        else:
            # adds space
            cipher += " "
  
    return cipher
  
# Function to decrypt the string 
# according to the shift provided
def decrypt(message, shift):
    decipher = ""
    for letter in message:
        # checks for space
        if(letter != " "):
            # looks up the dictionary and 
            # subtracts the shift to the index
            num = ( dict1[letter] - shift + 26) % 26
            # looks up the second dictionary for the 
            # shifted alphabets and adds them
            decipher += dict2[num]
        else:
            # adds space
            decipher += " "
  
    return decipher
  
# driver function to run the program
def main():
    # use "upper()" function to convert any lowercase characters to uppercase
    message = "GEEKS FOR GEEKS"
    shift = 13
    result = encrypt(message.upper(), shift)
    print (result)
  
    message = "TRRXF SBE TRRXF"
    shift = 13
    result = decrypt(message.upper(), shift)
    print (result)
  
# Executes the main function
if __name__ == "__main__":
    main()

C++

// CPP program to implement
// ROT13 Caesar Cipher
  
#include<bits/stdc++.h>
using namespace std;
  
// Map to lookup the index of alphabets
map <char,int> dict1;
  
// Map to lookup alphabets corresponding
// to the index after shift
map <int,char> dict2;
  
// Function to create map to lookup
void create_dict()
{
    for(int i = 1; i < 27; i++)
        dict1[char(64 + i)] = i;
     
    dict2[0] = "Z";
      
    for(int i = 1; i < 26; i++)
        dict2[i] = char(64 + i);
          
    return;
}
  
// Function to encrypt the string
// according to the shift provided
string encrypt(string message, int shift)
{
    string cipher = "";
    for(int i = 0; i < message.size(); i++)
    {
        // Checking for namespace
        if(message[i] != " ")
        {
            // loooks up the map and
            // adds the shift to the index
            int num = (dict1[message[i]] + shift) % 26;
              
            // looks up the second map for the
            // shifted alphabets and adds them
            cipher += dict2[num];
        }
        else
        {
            // adds space
            cipher += " ";
        }
    }
    return cipher;
}
  
// Function to decrypt the string
// according to the shift provided
string decrypt(string message, int shift)
{
    string decipher = "";
    for(int i = 0; i < message.size(); i++)
    {
        // checks for space
        if(message[i] != " ")
        {
            // looks up the map and
            // subtracts the shift to the index
            int num = (dict1[message[i]] - shift + 26) % 26;
            // looks up the second map for the
            // shifted alphabets and adds them
            decipher += dict2[num];
        }
        else
        {
            // adds space
            decipher += " ";
        }
    }
    return decipher;
}
  
// Driver code
int main()
{
    create_dict();
      
    string message = "GEEKS FOR GEEKS";
    int shift = 13;
      
    cout << encrypt(message, shift) << " ";
      
    message = "TRRXF SBE TRRXF";
    shift = 13;
      
    cout << decrypt(message, shift) << " ";
      
    return 0;
}
// This code is contributed by Sachin Bisht
Output :
TRRXF SBE TRRXF
GEEKS FOR GEEKS

Анализ: Шифр ROT13 не очень безопасен, так как это всего лишь частный случай шифра Caeser. Шифр Caeser можно взломать либо с помощью частотного анализа, либо просто перепробовав все 25 ключей, тогда как шифр ROT13 можно взломать, просто сдвинув буквы на 13 позиций. Поэтому практического применения он не имеет.

Применение: ROT13 использовался в группе новостей net.jokes к началу 1980-х годов.
Эта статья предоставлена Палашем Нигамом. Если вам нравится GeeksforGeeks, и вы хотели бы внести свой вклад, вы также можете написать статью на сайте deposit.geeksforgeeks.org или отправить свою статью по электронной почте: grant@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.

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

РЕКОМЕНДУЕМЫЕ СТАТЬИ