密码学中的替换加密技术——前述

使用替换加密法时,明文消息的字符替换成另一个字符、数字或者符号。

一、凯撒加密法

凯撒加密法是替换方法中的一个特例,消息中的每个字母替换成向后三个字母的字母,例如明文ATUL变成密文DWXO。显然凯撒加密法是一种非常脆弱的隐藏明文消息的方案,要破解凯撒加密法,只需要逆转凯撒加密过程即可,即把每个字母替换成向前三个字母的字母。其替换规律如下:

ABCDEFGHIGKLMNOPQRSTUVWXYZ
DEFGHIGKLMNOPQRSTUVWXYZABC

其破解凯撒加密法的算法流程如下:

  1. 读取密文消息中的每个字母,查找如上表格的第二行;
  2. 找到匹配时,将密文消息如上方表格中第一行同一列的对应字母;
  3. 对密文消息中所有字符重复这个过程。
    凯撒密码的加解密的Python代码如下:
# 凯撒密码
# 要加密的/解密的字符串
message='My name is ZhInen'
# 要加密或者解密的密钥
key=3
#程序是加密还是解密
mode='encrypt' # 设置为encrypt或者decrypt
# 可能要被加密的符号
symbols1='ABCDEFGHIGKLMNOPQRSTUVWXYZ'
symbols2='abcdefghijklmnopqrstuvwxyz'
#存储消息的加密或者解密形式
translated=''
for symbol in message:
    #注意只能加解密symbols1 2字符串中的符号
    #如果为大写字母
    if symbol in symbols1:
        symbolIndex = symbols1.find(symbol)
        #执行加解密
        if mode=='encrypt':
            translatedIndex=symbolIndex+key
        elif mode=='decrypt':
            translatedIndex= symbolIndex-key
        # 如果需要执行回环
        if translatedIndex>=len(symbols1):
            translatedIndex=translatedIndex-len(symbols1)
        elif translatedIndex<0:
            translatedIndex=translatedIndex+len(symbols1)
        translated=translated+symbols1[translatedIndex]
    #如果为小写字符
    elif symbol in symbols2:
        symbolIndex = symbols2.find(symbol)
        #执行加解密
        if mode=='encrypt':
            translatedIndex=symbolIndex+key
        elif mode=='decrypt':
            translatedIndex= symbolIndex-key
        # 如果需要执行回环
        if translatedIndex>=len(symbols2):
            translatedIndex=translatedIndex-len(symbols2)
        elif translatedIndex<0:
            translatedIndex=translatedIndex+len(symbols2)
        translated=translated+symbols2[translatedIndex]
    else:
        #添加为加解密的字符
        translated=translated+symbol
#输出translated的字符串
print(translated)

其示例的结果如下图所示:
在这里插入图片描述

二、 凯撒加密法的改进版本

英语中有26个英文字母,明文中的字母,可以转换成任何的有效字母,但是换本身是没有意义的,所以,每个字母有25中替换可能。这样要破译改进的凯撒加密法,就不能用上述的算法,其改进的破解算法如下所述:
1.假设key为1;
2.读取整个密文消息;
3.将密文中每个字母转换成字母表中相隔key的字母;
4.将key增加1;
5.如果key小于26,则转第二步,否则停止。
从上述步骤可以得到25个结果,其中一个是原先的明文消息。其破解的算法如下:

# 破解凯撒密码
# 要加密的/解密的字符串
#message='My name is ZhInen'
message='Pb qdph lv CkLqhq'
# 要加密或者解密的密钥
#key=1
#程序是加密还是解密
mode='decrypt' # 设置为encrypt或者decrypt
# 可能要被加密的符号
symbols1='ABCDEFGHIGKLMNOPQRSTUVWXYZ'
symbols2='abcdefghijklmnopqrstuvwxyz'
for key in range(1,26):
    #存储消息的加密或者解密形式
    translated=''
    for symbol in message:
        #注意只能加解密symbols字符串中的符号
        #如果为大写字母
        if symbol in symbols1:
            symbolIndex = symbols1.find(symbol)
            #执行加解密
            if mode=='encrypt':
                translatedIndex=symbolIndex+key
            elif mode=='decrypt':
                translatedIndex= symbolIndex-key
            # 如果需要执行回环
            if translatedIndex>=len(symbols1):
                translatedIndex=translatedIndex-len(symbols1)
            elif translatedIndex<0:
                translatedIndex=translatedIndex+len(symbols1)
            translated=translated+symbols1[translatedIndex]
        #如果为小写字符
        elif symbol in symbols2:
            symbolIndex = symbols2.find(symbol)
            #执行加解密
            if mode=='encrypt':
                translatedIndex=symbolIndex+key
            elif mode=='decrypt':
                translatedIndex= symbolIndex-key
            # 如果需要执行回环
            if translatedIndex>=len(symbols2):
                translatedIndex=translatedIndex-len(symbols2)
            elif translatedIndex<0:
                translatedIndex=translatedIndex+len(symbols2)
            translated=translated+symbols2[translatedIndex]
        else:
            #添加为加解密的字符
            translated=translated+symbol
    #输出translated的字符串
    print(translated)

其示例的输出结果,如下图所示,发现25个结果中有一个正确结果:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhInen丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值