密码学 - ROT13 算法



到目前为止,您已经了解了反向密码和凯撒密码算法。现在,让我们讨论 ROT13 算法及其实现。

因此,我们将讨论 ROT13 密码算法。旋转 13 个位置被称为 ROT13。它是凯撒密码加密算法的一种特殊情况。它是最简单的加密方法之一。由于加密和解密的算法相同,因此它是一种对称密钥加密技术。

因为加密密钥将字母 A 到 Z 显示为数字 0 到 25,所以密文与明文字母相差 13 个空格。例如,A 变为 N,B 变为 O,依此类推。由于加密和解密过程相同,因此它们可以以编程方式完成。

ROT13 算法的解释

ROT13 密码指的是缩写形式旋转 13 个位置。在此特定凯撒密码中,移位始终为 13。通过将每个字母移动 13 个位置来加密或解密消息。

让我们查看下图以了解 ROT13 算法的工作原理 -

ROT13 algorithm

您可以看到,每个字母都向右移动了 13 个空格。例如,“B”将变为“O”,“D”将变为“Q”,依此类推。

ROT13 的特点

以下是 ROT13 的一些主要特征 -

  • 由于 ROT13 是对称的,因此加密和解密都使用相同的算法和密钥。

  • 它适用于每个字母,将每个字母替换为字母表中向前(或向后,基于解密)13 个位置的字母。

  • ROT13 中的旋转值为 13 是固定的。

  • 应用 ROT13 时,如果旋转超过“Z”,则返回到字母表的开头“A”。

  • ROT13 非常易于实现和使用。

  • 它无法抵御任何有决心的攻击者,因为它很容易通过简单的频率分析破解。

使用 Python 实现

因此,我们可以通过不同的方式实现此算法 -

使用 For 循环和 ord() 函数

我们首先将给定的消息加密并使用 for 循环生成 ROT13 代码。在此程序中,for 循环将用于迭代给定文本中的每个字符。如果字符是字母,我们将保留它(大写或小写)并将其移动 13 个位置。非字母字符将保持不变。我们还将使用 Python 的 ord() 函数,该函数用于将单个 Unicode 字符更改为其整数表示。

示例

以下是 ROT13 密码的简单 Python 代码。请参阅以下代码 -

# Encryption Function 
def rot13_encrypt(text):
   encrypted_text = ''
   for char in text:
      if char.isalpha():
         shifted = ord(char) + 13
         if char.islower():
            if shifted > ord('z'):
               shifted -= 26
         else:
            if shifted > ord('Z'):
               shifted -= 26
         encrypted_text += chr(shifted)
      else:
         encrypted_text += char
   return encrypted_text

# Decryption Function 
def rot13_decrypt(text):
   decrypted_text = ''
   for char in text:
      if char.isalpha():
         shifted = ord(char) - 13  # Decryption involves shifting back by 13
         if char.islower():
            if shifted < ord('a'):
               shifted += 26
         else:
            if shifted < ord('A'):
               shifted += 26
         decrypted_text += chr(shifted)
      else:
         decrypted_text += char
   return decrypted_text

# function execution
message = "Hello, Tutorialspoint!"
 encrypted_msg = rot13_encrypt(message)
print("The Encrypted message:",  encrypted_msg)  

 decrypted_msg = rot13_decrypt( encrypted_msg)
print("The Decrypted message:",  decrypted_msg)

以下是上述示例的输出 -

输入/输出
The Encrypted message: Uryyb, Ghgbevnyfcbvag!
The Decrypted message: Hello, Tutorialspoint!

使用列表推导式

在此示例中,列表推导式用于执行 ROT13 加密。使用列表,我们将使用末尾的 for char in text 部分迭代输入文本中的每个字符。对于输入文本中的每个字符,我们将使用条件表达式查找加密值。

示例

以下是 ROT13 算法的简单 Python 代码。请参阅以下程序 -

# Encryption function
def rot13_encrypt(text):
   encrypted_text = ''.join([chr(((ord(char) - 65 + 13) % 26) + 65) if 'A' <= char <= 'Z' else 
      chr(((ord(char) - 97 + 13) % 26) + 97) if 'a' <= char <= 'z' else char for char in text])
   return encrypted_text

# Decryption function
def rot13_decrypt(text):
   decrypted_text = ''.join([chr(((ord(char) - 65 - 13) % 26) + 65) if 'A' <= char <= 'Z' else 
      chr(((ord(char) - 97 - 13) % 26) + 97) if 'a' <= char <= 'z' else char for char in text])
   return decrypted_text

# Function execution
message = "Hello, Everyone!"
 encrypted_msg = rot13_encrypt(message)
print("The Encrypted message:",  encrypted_msg)

 decrypted_msg = rot13_decrypt( encrypted_msg)
print("The Decrypted message:",  decrypted_msg)

以下是上述示例的输出 -

输入/输出
The Encrypted message: Uryyb, Rirelbar!
The Decrypted message: Hello, Everyone!

使用字典

在此示例中,我们将使用两个字典来实现 ROT13 的程序。因此,第一个字典将字母表中的大写字母映射到它们在字母表中的索引。第二个字典将移位的索引映射回大写字母,从“Z”到“A”。加密函数在使用第一个字典识别每个字母的索引并添加移位值后,使用第二个字典将结果索引发送回字母。在解密函数中,我们将反转此过程。

示例

以下是用两个字典实现的 ROT13 算法的简单 Python 程序。查看以下代码 -

# Dictionary to lookup the index 
dictionary1 = {'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 
dictionary2 = {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'}

# Encryption Function 
def encrypt(msg, shift):
   cipher = ''
   for letter in msg:
      # check for space
      if letter != ' ':
         num = (dictionary1[letter] + shift) % 26
         cipher += dictionary2[num]
      else:
         cipher += ' '

   return cipher

# Decryption Function 
def decrypt(msg, shift):
   decipher = ''
   for letter in msg:
      # checks for space
      if letter != ' ':
         num = (dictionary1[letter] - shift + 26) % 26
         decipher += dictionary2[num]
      else:
         decipher += ' '

   return decipher

msg = "Hey Tutorialspoint"
shift = 13
result = encrypt(msg.upper(), shift)
print("The Encrypted message: ", result)

msg = "URL GHGBEVNYFCBVAG"
shift = 13
result = decrypt(msg.upper(), shift)
print("The Decrypted message: ", result)

以下是上述示例的输出 -

输入/输出
The Encrypted message:  URL GHGBEVNYFCBVAG
The Decrypted message:  HEY TUTORIALSPOINT

使用 C++ 实现

为了实现 ROT13 算法,我们将使用 C++ 编程语言。使用 rot13Func 函数,我们将加密给定的字符串消息。迭代给定输入文本中的每个字母。如果它是字母,则将其字符更改 13 个位置以获取匹配的 ROT13 字符。主函数调用 rot13Func 函数并输出加密文本。

示例

#include <iostream>
#include <string>

using namespace std;

// Function to perform rot13Func encryption
string rot13Func(string text) {
   for (char& c : text) {
      if (isalpha(c)) {
         char base = islower(c) ? 'a' : 'A';
         c = (c - base + 13) % 26 + base;
      }
   }
   return text;
}

int main() {
   string plaintext = "Hello this world is so beautiful";
   cout << "The Plaintext Message is: " << plaintext << endl;

   string encrypted_text = rot13Func(plaintext);
   cout << "Encrypted text: " << encrypted_text << endl;

   return 0;
}

以下是上述示例的输出 -

输入/输出

The Plaintext Message is: Hello this world is so beautiful
Encrypted text: Uryyb guvf jbeyq vf fb ornhgvshy

使用 Java 实现

在此实现中,我们将使用 Java 编程语言来创建 ROT13 算法。rot13Func 方法使用字符串文本作为输入,使用 ROT13 对其进行加密。迭代输入文本中的每个字符。如果它是字母,则将其字符更改 13 个位置以获取匹配的 ROT13 字符。在收到输入消息后,main 方法调用 rot13 函数并输出加密文本。

示例

public class ROT13Class {
   // Function to perform ROT13 encryption
   public static String rot13Func(String text) {
      StringBuilder result = new StringBuilder();
      for (char c : text.toCharArray()) {
         if (Character.isLetter(c)) {
            char base = Character.isLowerCase(c) ? 'a' : 'A';
            c = (char) (((c - base + 13) % 26) + base);
         }
         result.append(c);
      }
      return result.toString();
   }

   public static void main(String[] args) {
      String plaintext = "The world is so beautiful!";
      System.out.println("The Plain Text Message: " + plaintext);
      String encryptedText = rot13Func(plaintext);
      System.out.println("The Encrypted text: " + encryptedText);
   }
}

以下是上述示例的输出 -

输入/输出

The Plain Text Message: The world is so beautiful!
The Encrypted text: Gur jbeyq vf fb ornhgvshy!

缺点

由于 ROT13 密码实际上是凯撒密码的一种特殊情况应用,因此它并不安全。尽管 ROT13 密码可以通过简单地将字母移动 13 个位置来破解,但凯撒密码只能通过频率分析或尝试所有 25 个密钥来破解。因此,它在现实生活中毫无用处。

ROT13 算法分析

ROT13 密码算法被认为是凯撒密码的一种特殊情况。它不是一种非常安全的算法,可以很容易地通过频率分析或仅尝试可能的 25 个密钥来破解,而 ROT13 可以通过移动 13 个位置来破解。因此,它没有任何实际用途。

总结

在本文中,我们检查了 Python 密码学 ROT13 算法。ROT13 是一种快速有效的方法,可以通过将字母表中的每个字母移动 13 个位置来加密给定的消息。它主要用于基本加密任务。我们在本章中实现了不同的方法,因此您现在可以使用 Python 中的 ROT13 算法加密和解密消息。

广告