一、原理与历史
1.1 历史背景
凯撒密码由古罗马的盖乌斯・尤利乌斯・凯撒(Gaius Julius Caesar)所创,他在军事通信中广泛使用该密码,通常采用偏移量k=3的方式,这也是 “凯撒移位” 这一名称的由来。例如,他会把命令中的字母按此规则转换,以防止敌方截获信息后轻易读懂。
1.2 安全性分析
由于凯撒密码只有 26 种可能的偏移情况,在现代计算机技术下,可通过暴力破解(即尝试所有 26 种偏移量)在极短时间内解密,所以它仅适用于对安全性要求极低的简单场景,不能用于保护敏感信息。
1.3 原理
凯撒密码又被称为凯撒变换或者叫变换密码。它是一种替换加密,通过将明文中的所有字母都在字母表上向后(或向前)移动固定的数目称为密文。
例如当偏移量为3时
ABCDEFGHIJKLMNOPQRSTUVWXYZ
DEFGHIJKLMNOPQRSTUVWXYZABC
凯撒密码看似简单,但其不仅本身就是一种加密方式,也同样作为很多加密算法的重要过程。例如,凯撒密码通常作为维吉尼亚密码中的一个步骤。
如果将凯撒密码写成数字表达式,那么加密函数将为:
解密函数即为
其中,k为偏移量。可以发现该密码只有26种不同的可能,我们要解密只需要遍历所有的可能,找到有意义的一组字符串即可。
二、代码
对于上述的公式,我们可以利用python将其实现出来。对于这个加密解密方法我们只需要解决的一个问题是,比如当密钥是1时,Z怎么变成A,这是编程的关键。所以我们可以考虑
这样子相当于将字母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 += charreturn 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 += charreturn resultdef 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 += charprint(f"密钥 {k} 的解密结果: {result}")returnwhile 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":breakelse:print("请输入正确的选择!")