古典密码之凯撒密码

一、原理与历史

1.1 历史背景

凯撒密码由古罗马的盖乌斯・尤利乌斯・凯撒(Gaius Julius Caesar)所创,他在军事通信中广泛使用该密码,通常采用偏移量k=3的方式,这也是 “凯撒移位” 这一名称的由来。例如,他会把命令中的字母按此规则转换,以防止敌方截获信息后轻易读懂。

1.2 安全性分析

由于凯撒密码只有 26 种可能的偏移情况,在现代计算机技术下,可通过暴力破解(即尝试所有 26 种偏移量)在极短时间内解密,所以它仅适用于对安全性要求极低的简单场景,不能用于保护敏感信息。

1.3 原理

凯撒密码又被称为凯撒变换或者叫变换密码。它是一种替换加密,通过将明文中的所有字母都在字母表上向后(或向前)移动固定的数目称为密文。

例如当偏移量为3时
ABCDEFGHIJKLMNOPQRSTUVWXYZ
DEFGHIJKLMNOPQRSTUVWXYZABC

凯撒密码看似简单,但其不仅本身就是一种加密方式,也同样作为很多加密算法的重要过程。例如,凯撒密码通常作为维吉尼亚密码中的一个步骤。
如果将凯撒密码写成数字表达式,那么加密函数将为:
image
解密函数即为
image
其中,k为偏移量。可以发现该密码只有26种不同的可能,我们要解密只需要遍历所有的可能,找到有意义的一组字符串即可。

二、代码

对于上述的公式,我们可以利用python将其实现出来。对于这个加密解密方法我们只需要解决的一个问题是,比如当密钥是1时,Z怎么变成A,这是编程的关键。所以我们可以考虑
image
这样子相当于将字母A作为一开始的字母,在其基础上进行加减,变成其他字母。而ord(now)-ord(a)是告诉当前字母是第几个字母,加上其偏移量后进行模运算达到计算结果。

点击查看代码
#加密部分
def casar(text,k):
    result = ""
    for char in text:
        if char.isalpha():
            # 处理大写字母
            if char.isupper():
                result += chr((ord(char) - ord("A") + k) % 26 + ord("A"))
            # 处理小写字母
            else:
                result += chr((ord(char) - ord("a") + k) % 26 + ord("a"))
        else:
            # 非字母字符保持不变
            result += char
    return result
 
#解密部分
def casar_decrypt(text,k):
    result = ""
    for char in text:
        if char.isalpha():
            # 处理大写字母
            if char.isupper():
                result += chr((ord(char) - ord("A") - k) % 26 + ord("A"))
            # 处理小写字母
            else:
                result += chr((ord(char) - ord("a") - k) % 26 + ord("a"))
        else:
            # 非字母字符保持不变
            result += char
    return result
 
def casar_decrypt_no_k(text):
    for k in range(1,26):
        result = ""
        for char in text:
            if char.isalpha():
                # 处理大写字母
                if char.isupper():
                    result += chr((ord(char) - ord("A") - k) % 26 + ord("A"))
                # 处理小写字母
                else:
                    result += chr((ord(char) - ord("a") - k) % 26 + ord("a"))
            else:
                # 非字母字符保持不变
                result += char
        print(f"密钥 {k} 的解密结果: {result}")
    return
 
while True:
    print("1.加密")
    print("2.解密")
    print("3.解密无密钥")
    print("4.退出")
    choice = input("请输入你的选择:")
    if choice == "1":
        text = input("请输入要加密的文本:")
        k = int(input("请输入加密密钥:"))
        print("加密后的文本为:" + casar(text,k))
    elif choice == "2":
        text = input("请输入要解密的文本:")
        k = int(input("请输入解密密钥:"))
        print("解密后的文本为:" + casar_decrypt(text,k))
    elif choice == "3":
        text = input("请输入要解密的文本:")
        casar_decrypt_no_k(text)
    elif choice == "4":
        break
    else:
        print("请输入正确的选择!")
posted @ 2025-10-05 15:40  困困小猫log  阅读(23)  评论(0)    收藏  举报