古典密码-凯撒密码

罗马共和国凯撒大帝曾使用某种加密技术用于军事信息的加密,在<<罗马十二帝王传>>对该种加密方式进行了如下记载:“如果需要保密,信中便用暗号,也即是改变字母顺序,使局外人无法组成一个单词。如果想要读懂和理解它们的意思,得用第4个字母置换第一个字母,即以D代A,余此类推”。上述的加密方式被称为凯撒密码。

章节:

  1. 凯撒密码加解密原理
  2. 凯撒密码破解原理
  3. 凯撒密码加解密代码+应用
  4. 凯撒密码破解代码+应用

1. 凯撒密码加解密原理

罗马共和国凯撒大帝曾使用某种加密技术用于军事信息的加密,在<<罗马十二帝王传>>对该种加密方式进行了如下记载:“如果需要保密,信中便用暗号,也即是改变字母顺序,使局外人无法组成一个单词。如果想要读懂和理解它们的意思,得用第4个字母置换第一个字母,即以D代A,余此类推”。上述的加密方式被称为凯撒密码。

使用上述加密方式对消息进行加密时,每个密码字母集中的字母将被其位置的往后数第三个字母所替代,即偏移量为向右3位。使用该加密方式进行加密时首先将明文字母表按照事先约定的偏移量进行位移得到密文字母表。

以偏移量为向右3位举例。26个英语正常字母顺序如下:

将英语26个字母进行向量偏移量为3位得到密文表如表 1。

表1 加密后的密文表

假设凯撒大帝决定明天早上发起进攻,那么他将会传递一条明文内容为“ATTAACK ROMORROW MORINING”的军事信息,该条信息在发送前通过查找表 1,然后将每个明文字母替换为对应的密文。加密后的密文将显示如下:

倘若该军事信息不慎被敌军截获,基于当时的环境没有任何技术能对这种最简单的加密方式进行破解,所以内容为“SWDFN WRPRUURZ PRUQLQJ”的信息在敌军看来很是摸不着头脑。(直到公元9世纪在阿尔·肯迪的有关现频率分析的著作中出现了现存最早的破解方法)

其他部队的将军接受到密文“SWDFN WRPRUURZ PRUQLQJ”后,为了正确阅读密文中的内容,首先需要进行的便是解密操作。已经知道密钥为3(偏移量为3)的前提下,对接收到的密文进行反向位移3位或直接查找表 1中密文对应的明文,即可进行解密工作。过程如下:

成功对密文进行解密后,得知真正命令为“ATTAACK ROMORROW MORINING”的将军们将会在明天上午配合凯撒大帝发起进攻。

    凯撒密码这种移位加密的方式是古典密码中的一种典型的单表替代密码,也称为加法密码、变换密码等。移位密码的加密方法就是将明文中的每个字母用其在字母表后面的第 k 个字母替代,它的加密过程还能够通过同余的数学方法进行计算:

$$
c=(m+k) \bmod n
$$
公式1

其中,𝑐为明文字母在字母表中的位置数;n 为字母表中的字母总数;k 为密钥;c为密文字母在字母表中对应的位置数。相应的,移位密码的解密过程可以表示为:

$$
m=(c-k) \text { mod } n
$$
公式2

以26个英语字母进行举例,首先将字母用数字替代,A=0、B=1、……、Z=25,n=26,k=3。对字母A进行加密,通过公式1进行计算如下,可以得出(0)A字母加密后为(3)D。

$$
(0+3) \bmod 26=3
$$

对加密后的D进行解密,通过公式2进行计算如下,可以得出(3)D字母加密后为(0)A。

$$
(3-3) \bmod 26=0
$$

2 凯撒密码破解原理

在确定加密方式属于凯撒加密的情况下,破解方法十分简单。凯撒加密通常用于文字的加密,因此使用的密钥有限。以26个英文字母的加密为例,加密者能使用的密钥最大数量为25(偏移量26等同于偏移量0,即明文;偏移量超过26,等同于偏移量1-25),因此使用穷举的手段即可暴力破解加密。

3 凯撒密码应用

python实现加解密函数如下:

# 凯撒加解密 
def caesarCipher(text, key = 0, mode = 1):  
    """
    Args:
        text (str, optional): [加解密字符串].
        key (int, optional): [密钥].
        mode (int, optional): [加解:1,,解密:0].
    """  
    resultText =""   
    # 字典:被加密的符号
    symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"+"abcdefghijklmnopqrstuvwxyz"+"1234567890"
    # key为负数则反向计算
    if key < 0:
        key = key % len(symbols) + len(symbols)
    # key过长则取余
    if key >= len(symbols):
        key = key % len(symbols)
     
    # 遍历每个字符
    for item in text:
        # 当前字符在字典中则进行加解密
        if item in symbols:
            # 获取当前字符在字典中的字符序号
            itemIndex = symbols.find(item)
            # 获取加密后的字符序号
            if mode == 1:
                resultIndex = itemIndex + key
            # 获取解密后的字符序号
            elif mode == 0:
                resultIndex = itemIndex - key
            
            # 回环
            if resultIndex >= len(symbols):
                resultIndex = resultIndex - len(symbols)
            elif resultIndex < 0:
                resultIndex = resultIndex + len(symbols)
            
            # 添加加解密后的字符
            resultText = resultText + symbols[resultIndex]
        # 字典外的字符不进行处理,直接添加
        else:
            resultText = resultText + item
    # 返回加解密后的字符
    return resultText

3.1 凯撒密码加密

3.2 凯撒密码解密

4 凯撒密码破解

python实现破解函数如下:

# 凯撒密码破解函数
def caesarHacker(text):
    # 字典:能被加密的符号
    symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"+"abcdefghijklmnopqrstuvwxyz"+"1234567890"
    # 遍历字典中所有字符进行解密
    for itemkey in range(len(symbols)):
        # 解密
        resultText = caesarCipher(text,itemkey,0)
        print("key:{},解密:{}".format(itemkey,resultText))

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注