古典密码学 (一)

古典密码学 (一)

凯撒密码

  • 恺撒密码 (Caesar Cipher) 又被称为 凯撒变换或者叫做变换密码。该密码是以凯撒大帝的名字命名的。 凯撒密码是一种替换加密,通过该明文中的所有字母都在字母表上向后或者向前移动固定数目替换为密文 例如 当偏移量为3的时候,字母A就会变成D,字母B就会被替换成E
  • 凯撒密码不仅本身是一种加密方式,同样也是作为很多加密算法的重要过程,例如凯撒密码通常会被作为维吉尼亚密码中的一个步骤。
# 示例代码
def caesar_cipher(text, shift, mode='encrypt'):
    """
    实现凯撒密码的加密或解密。

    参数:
    text : str
        需要加密或解密的文本。
    shift : int
        字符移动的位置数。
    mode : str, 可选
        操作模式,'encrypt' 为加密,'decrypt' 为解密,默认为 'encrypt'。

    返回:
    str
        加密或解密后的文本。
    """
    result = ""
    # 根据模式调整偏移量
    if mode == 'decrypt':
        shift = -shift
    for char in text:
        # 处理字母字符
        if char.isalpha():
            start = ord('a') if char.islower() else ord('A')
            offset = (ord(char) - start + shift) % 26
            result += chr(start + offset)
        else:
            # 非字母字符直接添加
            result += char
    return result


# 输入原文
text = input("")
# 输入偏移量
shift = int(input(""))

# 执行加密操作
encrypted_text = caesar_cipher(text, shift)
print("Encrypted:", encrypted_text)

# 执行解密操作
decrypted_text = caesar_cipher(encrypted_text, shift, mode='decrypt')
print("Decrypted:", decrypted_text)

Atbash 密码

  • 埃特巴什码 (Atbash Cipher)是一种简单的替换密码,与凯撒密码类型,区别在于替换的规则不通过 一般 埃特巴什码使用下面的码表
明文:ABCDEFGHIJKLMNOPRSTUVWXYZ
密文:ZYXWVUTSRPONMLKJIHGEFDCBA
  • 这是使用一种将字母表前后倒转进行替换 同样可以直接按照码表转回进行解密或者使用词频分析进行破解
# 示例代码
def atbash_cipher(text):
    """
    实现Atbash密码的加密和解密。

    参数:
    text : str
        需要加密或解密的文本。

    返回:
    str
        加密或解密后的文本。
    """
    result = ""
    for char in text:
        if char.isalpha():
            # 判断字母大小写并进行转换
            start = ord('a') if char.islower() else ord('A')
            # 使用25 - (ord(char) - start)实现Atbash密码逻辑
            result += chr(start + (25 - (ord(char) - start)))
        else:
            # 非字母字符直接添加
            result += char
    return result


# 输入原文
text = input("Enter the text: ")
# 输入要执行的操作 输入 1 执行加密 输入2 执行解密
choice = int(input("Enter 1 for encryption or 2 for decryption: "))
if choice == 1:
    # 执行加密操作
    encrypted_text = atbash_cipher(text)
    print("Encrypted:", encrypted_text)
elif choice == 2:
    # 再次执行Atbash密码将加密文本转换回原文
    decrypted_text = atbash_cipher(text)
    print("Decrypted:", decrypted_text)
else:
    print("Invalid choice. Exiting.")
    exit()

将两种 加密方式进行混合 中间再插一次 字符串反转

def caesar_cipher(text, shift, mode='encrypt'):
    """
    实现凯撒密码的加密或解密。

    参数:
    text : str
        需要加密或解密的文本。
    shift : int
        字符移动的位置数。
    mode : str, 可选
        操作模式,'encrypt' 为加密,'decrypt' 为解密,默认为 'encrypt'。

    返回:
    str
        加密或解密后的文本。
    """
    result = ""
    # 根据模式调整偏移量
    if mode == 'decrypt':
        shift = -shift
    for char in text:
        # 处理字母字符
        if char.isalpha():
            start = ord('a') if char.islower() else ord('A')
            offset = (ord(char) - start + shift) % 26
            result += chr(start + offset)
        else:
            # 非字母字符直接添加
            result += char
    return result

def atbash_cipher(text):
    """
    实现Atbash密码的加密和解密。

    参数:
    text : str
        需要加密或解密的文本。

    返回:
    str
        加密或解密后的文本。
    """
    result = ""
    for char in text:
        if char.isalpha():
            # 判断字母大小写并进行转换
            start = ord('a') if char.islower() else ord('A')
            # 使用25 - (ord(char) - start)实现Atbash密码逻辑
            result += chr(start + (25 - (ord(char) - start)))
        else:
            # 非字母字符直接添加
            result += char
    return result

# 字符串反转
def reverse_string(text):
    return text[::-1]

# 加密的文本
text = input()
# 偏移量
shift = int(input())
# 使用凯撒密码加密后,再使用Atbash密码加密,并将结果反转
print("加密:"+atbash_cipher(reverse_string(caesar_cipher(text, shift))))
加密之后的密文 = atbash_cipher(reverse_string(caesar_cipher(text, shift)))
print("解密:"+atbash_cipher(reverse_string(caesar_cipher(加密之后的密文, shift, mode='decrypt'))))

posted @ 2024-10-13 14:36  ZapcoMan  阅读(109)  评论(0编辑  收藏  举报