阿特巴希密码

本篇文章主要分享古典密码学的阿特巴希密码

什么是阿特巴希密码?

阿特巴希密码(Atbash Cipher)是一种替换密码(Substitution Cipher),也是已知最早的密码系统之一。它的加密原理非常简单:将字母表中的第一个字母替换为最后一个字母,第二个字母替换为倒数第二个字母,以此类推,形成一种反向的映射关系。

例如,在拉丁字母表中:

  • 字母 A 会被替换成 Z
  • 字母 B 会被替换成 Y
  • 字母 M 会被替换成 N
  • 字母 N 会被替换成 M
  • 字母 Z 会被替换成 A

这种替换是固定的,不需要密钥,因为其替换规则本身就是固定的“密钥”。

加密示例:

  • 明文 (Plaintext): HELLO WORLD
  • 密文 (Ciphertext): SVOOL DLIOW

阿特巴希密码的数学表示

阿特巴希密码的数学表示也相对简单。我们将字母表中的每个字母映射为一个数字(例如,A=0, B=1, …, Z=25)。

设:

  • P 为明文字母对应的数字。
  • C 为密文字母对应的数字。

那么,加密过程可以表示为: $$ C = (25 - P) \pmod{26} $$

解密过程与加密过程相同,因为阿特巴希密码是对称的: $$ P = (25 - C) \pmod{26} $$

这里的 mod 26 (模26) 运算确保了结果在 0 到 25 之间。例如,当加密 A (0) 时: C = (25 - 0) mod 26 = 25 mod 26 = 25,对应的字母是 Z

当加密 Z (25) 时: C = (25 - 25) mod 26 = 0 mod 26 = 0,对应的字母是 A

如何破解阿特巴希密码?

阿特巴希密码的安全性极低,甚至比凯撒密码还要低。因为它没有密钥,加密规则是固定的,所以一旦知道是阿特巴希密码,就可以直接解密。

1. 直接解密

由于阿特巴希密码的加密和解密规则是相同的,且是公开的(A对Z,B对Y等),因此不需要任何密钥。攻击者一旦识别出这是阿特巴希密码,就可以直接应用其反向映射规则进行解密。

2. 频率分析 (Frequency Analysis)

尽管可以直接解密,但频率分析仍然可以用于确认是否为阿特巴希密码。在任何一种自然语言中,不同字母的出现频率是有统计规律的。通过分析密文中字母的频率分布,并将其与已知语言的字母频率分布进行比较,可以推断出密文是否由阿特巴希密码加密。例如,如果密文中出现频率最高的字母对应到明文中的字母E(英语中最常见的字母),则可以进一步确认。

C++ 代码实现

下面是一个完整的 C++ 程序,它实现了阿特巴希密码的加密和解密功能。代码结构清晰,并包含了详细的注释。

#include <iostream>
#include <string>
#include <cctype>

std::string atbashCipher(const std::string& text);

int main() {
    std::string message;

    std::cout << "=====================================" << std::endl;
    std::cout << "      阿特巴希密码加密/解密程序" << std::endl;
    std::cout << "=====================================" << std::endl;

    std::cout << "\n请输入要处理的消息: ";
    std::getline(std::cin, message);

    std::string processedMessage = atbashCipher(message);
    std::cout << "\n处理后的消息是: " << processedMessage << std::endl;

    return 0;
}

/**
 * @brief 对给定的文本进行阿特巴希加密或解密
 * @param text 要处理的文本
 * @return 处理后的文本
 */
std::string atbashCipher(const std::string& text) {
    std::string result = "";
    for (char c : text) {
        if (isalpha(c)) {
            char base = isupper(c) ? 'A' : 'a';
            // Apply Atbash formula: C = (25 - P) or P = (25 - C)
            result += static_cast<char>(base + (25 - (c - base)));
        } else {
            result += c;
        }
    }
    return result;
}
本站文章均为原创 转载请标注文章来源
使用 Hugo 构建
主题 StackJimmy 设计
本博客已稳定运行
发表了16篇文章 · 总计6.97k字