经典密码学和现代密码学的结构及其主要区别(1)凯撒密码——附py代码
密码学是一门通过使用代码和密码来保护信息的艺术与科学,其历史可以追溯到数千年前。古典密码学代表了这一古老学科早期的篇章。早在计算机和现代加密算法出现之前,历史上的各个文明就依靠巧妙的方法来保护机密、安全通信以及获取战略优势。
古典密码学植根于古代文化的智慧,在历史的关键时刻对保护敏感信息发挥了关键作用。从古埃及的象形文字到凯撒密码,从文艺复兴时期的创新到美国独立战争中的密码学阴谋,古典密码学构成了现代密码学原理得以建立的历史背景。
以下是古典密码学的简要历史背景:
• 古代文明: 自古以来,密码技术就被用于各种目的,包括军事通信、外交以及保护敏感信息。最早有记录的密码学使用可以追溯到古埃及,当时象形文字有时会被加密以保护陵墓和纪念碑的内容。古希腊人也为古典密码学做出了重大贡献,像尤利乌斯·恺撒就使用简单的替换密码来保护敏感的军事信息。
•中世纪欧洲: 在中世纪的欧洲,密码学的使用与君主和军事领袖开发的秘密代码和密码紧密相关。16 世纪布莱斯·德·维吉尼亚发明的维吉尼亚密码是古典密码学的一个显著进步,在数百年间都被认为是无法破解的。
• 文艺复兴和启蒙时代: 文艺复兴时期,人们对密码学的兴趣日益浓厚,学者和科学家在该领域取得了诸多进展。在启蒙时代,密码学成为外交通信和间谍活动的重要工具。
• 美国独立战争: 美国独立战争是古典密码学的一个重要历史背景。在战争期间,英美双方都使用了各种密码和密码本。像托马斯·杰斐逊这样的知名人物也开发了自己的密码系统,比如轮盘密码机。
• 19 世纪及以后: 19 世纪见证了更先进密码技术的发展,包括密码本的使用和更复杂的替换密码。在第二次世界大战期间,古典密码学发挥了重要作用,英国的“超机”计划成功破译了轴心国的通信。
在整个历史背景下,古典密码学作为一种保护敏感信息、维护机密性和在军事及外交事务中获取优势的手段不断发展。它为现代密码学的后来发展奠定了基础。
尽管古典密码在历史上具有重要意义,但它们缺乏保护现代数字通信和数据所必需的安全特性。随着技术的进步,攻击者的手段和能力也在增强,这使得古典密码无法满足当代的安全需求。基于可靠数学原理的现代密码算法和协议旨在为数字时代提供强大的安全保障。
▶
凯撒密码 是最简单且最早为人所知的加密技术之一。它以尤利乌斯·恺撒的名字命名,据说他曾用它来传递机密信息。它易于理解,但安全性不高,容易受到暴力破解和频率分析的攻击。
这种密码是一种替换密码,通过将字母表中的字母向前或向后移动固定位数来进行加密和解密。凯撒密码的密钥是“移位值”或“密钥”,它决定了移位的量。例如,如果移位值为 3,那么 ‘A’ 将被加密为 ‘D’,‘B’ 被加密为 ‘E’,依此类推。而Z会绕回到C。比如明文"HELLO",移位3位,应该得到密文"KHOOR"。解密的话,移位-3位,恢复原文。如果移位位数超过26时应该对26取模,因为移位26位相当于没有移位。
py示例代码(仅供参考):
def caesar_cipher(text, shift, mode='encrypt'):"""凯撒密码加密/解密函数:param text: 输入文本:param shift: 移位值:param mode: 'encrypt' 加密 或 'decrypt' 解密:return: 处理后的字符串"""result = []# 处理解密模式if mode == 'decrypt':shift = -shiftfor char in text:if char.isalpha():# 确定字符类型的基础ASCII码base = ord('A') if char.isupper() else ord('a')# 计算新字符new_char = chr((ord(char) - base + shift) % 26 + base)result.append(new_char)else:# 非字母字符保持不变result.append(char)return ''.join(result)# 测试示例
if __name__ == "__main__":# 加密示例plain_text = "Hello, World! 2025"shift_amount = 3encrypted = caesar_cipher(plain_text, shift_amount)print(f"加密结果: {encrypted}") # 输出: Khoor, Zruog! 2025# 解密示例decrypted = caesar_cipher(encrypted, shift_amount, 'decrypt')print(f"解密结果: {decrypted}") # 输出: Hello, World! 2025# 处理大偏移量(自动取模)big_shift = 29 # 29 % 26 = 3encrypted_big = caesar_cipher(plain_text, big_shift)print(f"大偏移加密: {encrypted_big}") # 输出: Khoor, Zruog! 2025
运行结果:
这里编写了两个函数,一个用于加密,另一个用于解密。另外,需要考虑字符的范围,比如是否只处理大写字母或小写字母,或者同时处理两者。还需要处理非字母字符,比如空格、标点符号,这些通常保持不变。
首先处理输入的字符串。对于每个字符,如果是字母,就进行移位;如果不是,就保留原样。移位的时候,需要注意大小写,因为ASCII码中大写字母和小写字母的编码不同。比如,大写字母A的ASCII码是65,小写字母a是97。移位的时候,可以使用模运算来处理绕回的情况。例如,对于一个字符char,移位shift,加密后的字符可以通过公式:new_char = chr((ord(char) - base + shift) % 26 + base),其中base是大写或小写字母的起始ASCII码。
然后需要编写加密函数,接收明文和移位位数,返回密文。解密函数则可以使用相同的逻辑,但移位位数为负数,或者直接调用加密函数并传入负的移位位数。最后,需要一个主函数来让用户输入文本和移位位数,并输出加密或解密的结果。