使用替换加密法时,明文消息的字符替换成另一个字符、数字或者符号。
一、凯撒加密法
凯撒加密法是替换方法中的一个特例,消息中的每个字母替换成向后三个字母的字母,例如明文ATUL变成密文DWXO。显然凯撒加密法是一种非常脆弱的隐藏明文消息的方案,要破解凯撒加密法,只需要逆转凯撒加密过程即可,即把每个字母替换成向前三个字母的字母。其替换规律如下:
A | B | C | D | E | F | G | H | I | G | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
D | E | F | G | H | I | G | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | A | B | C |
其破解凯撒加密法的算法流程如下:
- 读取密文消息中的每个字母,查找如上表格的第二行;
- 找到匹配时,将密文消息如上方表格中第一行同一列的对应字母;
- 对密文消息中所有字符重复这个过程。
凯撒密码的加解密的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个结果中有一个正确结果: