跳转至

Atbash密码详解

概述

Atbash密码(Atbash Cipher)是一种古老的单表替换密码,属于希伯来字母加密系统。它是最简单的对称加密方法之一,其名称来源于希伯来字母表的前两个字母(Aleph-Tav)和最后两个字母(Tav-Aleph)的组合。

历史背景

Atbash密码起源于古希伯来文化,最初用于希伯来圣经的加密: - 希伯来起源:最早出现在《耶利米书》中,用于加密地名 - 字母表对称:基于希伯来字母表的对称结构设计 - 宗教应用:主要用于圣经文本的加密和神秘解读

加密原理

基本概念

Atbash密码可以视为简单替换密码的特例,它使用字母表中的最后一个字母代表第一个字母,倒数第二个字母代表第二个字母,以此类推。

在罗马字母表中,Atbash密码的替换规则如下:

明文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
密文:Z Y X W V U T S R Q P O N M L K J I H G F E D C B A

数学表示

对于字母表中的每个字母,加密过程可以表示为:

# Atbash加密公式
def atbash_encrypt(char):
    if char.isalpha():
        base = ord('A') if char.isupper() else ord('a')
        # 计算对称位置:A(0) ↔ Z(25), B(1) ↔ Y(24), 等等
        position = ord(char) - base
        symmetric_position = 25 - position
        return chr(symmetric_position + base)
    return char

自反特性

Atbash密码的一个重要特性是 自反性 (Reflexive Property): - 加密和解密使用相同的算法 - 对密文再次应用Atbash加密会恢复原始明文 - 数学上表示为:Atbash(Atbash(text)) = text

加密示例

基础示例

明文:the quick brown fox jumps over the lazy dog
密文:gsv jfrxp yildm ulc qfnkh levi gsv ozab wlt

详细加密过程

比如 hello :

步骤1:逐个字母处理
h → s  (h是第8个字母,对称位置是第18个字母s)
e → v  (e是第5个字母,对称位置是第21个字母v)
l → o  (l是第12个字母,对称位置是第15个字母o)
l → o  (同上)
o → l  (o是第15个字母,对称位置是第12个字母l)

步骤2:组合结果
hello → svool

大小写处理示例

明文: "Hello World"
密文: "Svool Dliow"

处理过程:
H → S (大写)
e → v (小写)
l → o (小写)
l → o (小写)
o → l (小写)
W → D (大写)
o → l (小写)
r → i (小写)
l → o (小写)
d → w (小写)

代码实现

Python完整实现

class AtbashCipher:
    """Atbash密码加密解密类"""

    def __init__(self):
        # 定义字母表映射
        self.uppercase_map = {}
        self.lowercase_map = {}

        # 构建大写字母映射
        for i in range(26):
            plain = chr(ord('A') + i)
            cipher = chr(ord('Z') - i)
            self.uppercase_map[plain] = cipher
            self.uppercase_map[cipher] = plain  # 双向映射

        # 构建小写字母映射
        for i in range(26):
            plain = chr(ord('a') + i)
            cipher = chr(ord('z') - i)
            self.lowercase_map[plain] = cipher
            self.lowercase_map[cipher] = plain  # 双向映射

    def encrypt(self, text):
        """加密文本"""
        return self._process(text)

    def decrypt(self, text):
        """解密文本(Atbash加密解密相同)"""
        return self._process(text)

    def _process(self, text):
        """处理文本的核心方法"""
        result = []
        for char in text:
            if char in self.uppercase_map:
                result.append(self.uppercase_map[char])
            elif char in self.lowercase_map:
                result.append(self.lowercase_map[char])
            else:
                # 非字母字符保持不变
                result.append(char)
        return ''.join(result)

# 使用示例
if __name__ == "__main__":
    cipher = AtbashCipher()

    # 测试基本功能
    test_cases = [
        "hello",
        "HELLO",
        "Hello World",
        "the quick brown fox jumps over the lazy dog"
    ]

    for text in test_cases:
        encrypted = cipher.encrypt(text)
        decrypted = cipher.decrypt(encrypted)
        print(f"原文: {text}")
        print(f"加密: {encrypted}")
        print(f"解密: {decrypted}")
        print("-" * 40)

简化版本实现

def atbash_simple(text):
    """简化的Atbash加密函数"""
    result = []
    for char in text:
        if char.isupper():
            # 大写字母:A(65) ↔ Z(90)
            result.append(chr(155 - ord(char)))
        elif char.islower():
            # 小写字母:a(97) ↔ z(122)
            result.append(chr(219 - ord(char)))
        else:
            result.append(char)
    return ''.join(result)

# 测试简化版本
print(atbash_simple("hello"))  # 输出: svool
print(atbash_simple("HELLO"))  # 输出: SVOOL

命令行工具

import argparse

def main():
    parser = argparse.ArgumentParser(description='Atbash密码工具')
    parser.add_argument('text', help='要处理的文本')
    parser.add_argument('-d', '--decrypt', action='store_true', 
                       help='解密模式(Atbash加密解密相同)')

    args = parser.parse_args()

    cipher = AtbashCipher()

    if args.decrypt:
        result = cipher.decrypt(args.text)
        print(f"解密结果: {result}")
    else:
        result = cipher.encrypt(args.text)
        print(f"加密结果: {result}")

if __name__ == "__main__":
    main()

安全性分析

优点

  1. 简单易用:加密解密算法完全相同
  2. 对称性:自反特性使得实现简单
  3. 无密钥管理:不需要复杂的密钥交换

缺点

  1. 安全性极低:只有一种可能的"密钥"(映射关系)
  2. 频率分析易攻击:保留原文的字母频率特征
  3. 无混淆性:相同的明文字母总是加密为相同的密文字母

攻击方法

频率分析攻击

由于Atbash密码只是简单的字母替换,它完全保留了原文的字母频率特征:

def frequency_analysis_atbash(ciphertext):
    """对Atbash密文进行频率分析"""
    from collections import Counter

    # 统计字母频率
    freq = Counter(c for c in ciphertext if c.isalpha())

    # 英语字母频率表(从高到低)
    english_freq = 'ETAOINSHRDLCUMWFGYPBVKJXQZ'

    print("密文字母频率:")
    for char, count in freq.most_common():
        print(f"{char}: {count}次")

    # 由于Atbash只是简单替换,频率特征与原文相同
    return "直接应用Atbash解密即可(加密解密算法相同)"

# 示例
ciphertext = "gsv jfrxp yildm ulc qfnkh levi gsv ozab wlt"
print(frequency_analysis_atbash(ciphertext))

暴力破解

对于Atbash密码,"暴力破解"实际上就是尝试应用Atbash解密(因为只有一种可能的映射):

def break_atbash(ciphertext):
    """破解Atbash密码"""
    cipher = AtbashCipher()
    # 直接应用Atbash解密(与加密相同)
    return cipher.decrypt(ciphertext)

# 示例
ciphertext = "gsv jfrxp yildm ulc qfnkh levi gsv ozab wlt"
plaintext = break_atbash(ciphertext)
print(f"破解结果: {plaintext}")

实际应用案例

案例1:圣经加密

Atbash密码最早用于希伯来圣经的加密,特别是在《耶利米书》中:

原文地名:"Sheshach"(示沙克)
Atbash加密:"Babel"(巴比伦)

加密过程(希伯来字母):
ש (Shin) →  ב (Bet)
ש (Shin) →  ב (Bet)
כ (Kaf)  →  ל (Lamed)

案例2:现代应用

虽然Atbash密码本身安全性很低,但仍有一些现代应用:

  1. 教学演示:密码学入门教育的经典案例
  2. 简单混淆:论坛签名、游戏彩蛋等轻度隐私保护
  3. 谜题设计:解谜游戏和CTF竞赛中的基础题目

案例3:组合加密

Atbash可以与其他密码组合使用,增加安全性:

def combined_cipher(text, shift=3):
    """Atbash + 凯撒密码组合"""
    # 先应用Atbash
    atbash_text = atbash_simple(text)

    # 再应用凯撒密码
    result = []
    for char in atbash_text:
        if char.isalpha():
            base = ord('A') if char.isupper() else ord('a')
            shifted_char = chr((ord(char) - base + shift) % 26 + base)
            result.append(shifted_char)
        else:
            result.append(char)

    return ''.join(result)

# 测试组合加密
original = "hello"
encrypted = combined_cipher(original)
print(f"原文: {original}")
print(f"加密: {encrypted}")

变体与扩展

数字Atbash

Atbash原理也可以应用于数字:

def atbash_numbers(text):
    """数字Atbash:0↔9, 1↔8, 2↔7, 3↔6, 4↔5"""
    number_map = {'0':'9', '1':'8', '2':'7', '3':'6', '4':'5',
                  '5':'4', '6':'3', '7':'2', '8':'1', '9':'0'}

    result = []
    for char in text:
        if char in number_map:
            result.append(number_map[char])
        else:
            result.append(char)
    return ''.join(result)

print(atbash_numbers("12345"))  # 输出: 87654

自定义字母表Atbash

可以针对不同的字母表实现Atbash:

def custom_atbash(text, alphabet):
    """自定义字母表的Atbash密码"""
    n = len(alphabet)
    mapping = {}

    # 构建映射表
    for i in range(n):
        plain = alphabet[i]
        cipher = alphabet[n-1-i]
        mapping[plain] = cipher
        mapping[cipher] = plain

    result = []
    for char in text:
        if char in mapping:
            result.append(mapping[char])
        else:
            result.append(char)
    return ''.join(result)

# 使用自定义字母表(如仅包含元音字母)
vowel_alphabet = "AEIOU"
print(custom_atbash("AEI", vowel_alphabet))  # 输出: UOI

在线工具

在线Atbash 密码工具