密码学初识
首先要区分的是编码法和加密法,虽然两者都是用来加密信息的方法,但是他们是以完全不同的方式进行的。编码法就是用字、短语或数字来代替明文。例如,“bomb”可能在消息中以数字“1508”的形式出现,从码文还原明文不存在算法或秘钥。生成码文或还原码文需要一本编码簿,它列出了所有数字(或代替字符)和与之相应的明文字、短语或字母。加密法则是使用算法或秘钥来加密信息。
一 替换加密法
先来介绍一下最简单的替换加密法:凯撒加密法
凯撒使用的秘钥是移动3位。首先按顺序写下26个字母:ABCDEFGHIJKLMNOPQRSTUVWXYZ。凯撒加密法将把明文中的每个字母用其右边的第4个字母替换,也就是说,“a”将被“d”替换,“b”将被“e”替换,以此类推。对于后面的字母,比如说字母“x”将被“a”替换,“z”将被“c”替换。CAP软件可以实现此类加密,当然也可以编程实现。
这里我用python实现,1-26位的偏移,不处理除字母之外的其它字符。
加密:
#-*-coding:utf-8-*-
print "请输入明文:"
cle = raw_input()
cip = []
for i in range(1,27):
for j in cle:
if j >= 'a' and j <= 'z':
cip.append(chr((ord(j) - 97 + i) % 26 + 97))
elif j >= 'A' and j<= 'Z':
cip.append(chr((ord(j) - 65 + i) % 26 + 65))
else:
cip.append(j)
print '偏移%d位的结果' % i +":" +"%s" % ''.join(cip)
cip = []
运行示例:
解密:
#-*-coding:utf-8-*-
print "请输入密文:"
cip = raw_input()
cle = []
for i in range(1,27):
for j in cip:
if j >= 'a' and j <= 'z':
cle.append(chr((ord(j) - 97 + (26 - i)) % 26 + 97))
elif j >= 'A' and j<= 'Z':
cle.append(chr((ord(j) - 65 + (26 - i)) % 26 + 65))
else:
cle.append(j)
print '偏移%d位的结果' % i +":" +"%s" % ''.join(cle)
cle = []
运行示例:
还有一种替换加密叫做ROT-13,ROT-13也是过去在古罗马开发的凯撒加密的一种变体。ROT-13是它自己本身的逆反,也就是说,要还原ROT-13,套用加密同样的算法即可得。
具体代码如下:
#-*-coding:utf-8-*-
print "请输入密文:"
cip = raw_input()
cle = []
for j in cip:
if j >= 'a' and j <= 'z':
cle.append(chr((ord(j) - 97 + 13) % 26 + 97))
elif j >= 'A' and j<= 'Z':
cle.append(chr((ord(j) - 65 + 13) % 26 + 65))
else:
cle.append(j)
print '解密结果:' + "%s" % ''.join(cle)
二 关键词加密法
关键词加密法主要通过两步实现:
例如,对于关键词“magicnet”,这两个字母表为:
这两个字母表就定义了关键词替换模式,对于上面的关键词,明文字母“a”总是用密文字母“m”替代,“b”则由“a”替代等。在这种情况下,一个典型的明文消息和密文消息如下所示:
明文:helpiamlost
密文:tchobmjhlrs
这种很容易被破解,一种改进的方法就是允许关键词从字母表的任意位置开始,例如,关键词“pacific”从“k”开始,则替换秘钥如下所示:
因为“pacific”的重复字母被删掉了,去除了第二个“i”和“c”,这时,明文和密文分别为:
明文:helpiamlost
密文:xuabyqcafgh
这里给出小写字母的加密脚本:
加密:
#-*-coding:utf-8-*-
import collections
print "请输入关键词:"
key = raw_input()
print "从哪个字母开始:"
char = raw_input()
print "请输入明文:"
cle = raw_input()
cip = []
table1 = list("abcdefghijklmnopqrstuvwxyz")
#给定26个空格用于后边的判断
table2 = list(" ")
#去除重复字母
key_res = ''.join(collections.OrderedDict.fromkeys(key))
#判断给定字母的下标
for i in range(len(table1)):
if char == table1[i]:
k = i
#先将关键词放入列表
for j in key_res:
table2[k] = j
k = k + 1
#放入剩余字母
for j in table2:
for i in table1:
if i not in key_res and ' ' in table2:
table2[k] = i
k = (k + 1) % 26
#字符比对生成密文
for i in cle:
for j in range(len(table1)):
if i == table1[j]:
cip.append(table2[j])
print "加密后的内容为:%s" % ''.join(cip)
运行示例:
对于要攻击的关键词加密法,有三个需要分析的地方:
解密:
对于关键词加密法可以使用CAP工具解密。
最方便的就是使用Word Patterns这个工具
内含自带的多个关键词,也可以自己添加。
通过关键词列出对应项,从而找出明文。