前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初识密码学

初识密码学

作者头像
安恒网络空间安全讲武堂
发布2018-02-06 15:44:34
8280
发布2018-02-06 15:44:34
举报

密码学初识

首先要区分的是编码法和加密法,虽然两者都是用来加密信息的方法,但是他们是以完全不同的方式进行的。编码法就是用字、短语或数字来代替明文。例如,“bomb”可能在消息中以数字“1508”的形式出现,从码文还原明文不存在算法或秘钥。生成码文或还原码文需要一本编码簿,它列出了所有数字(或代替字符)和与之相应的明文字、短语或字母。加密法则是使用算法或秘钥来加密信息。

一 替换加密法

先来介绍一下最简单的替换加密法:凯撒加密法

凯撒使用的秘钥是移动3位。首先按顺序写下26个字母:ABCDEFGHIJKLMNOPQRSTUVWXYZ。凯撒加密法将把明文中的每个字母用其右边的第4个字母替换,也就是说,“a”将被“d”替换,“b”将被“e”替换,以此类推。对于后面的字母,比如说字母“x”将被“a”替换,“z”将被“c”替换。CAP软件可以实现此类加密,当然也可以编程实现。

这里我用python实现,1-26位的偏移,不处理除字母之外的其它字符。

加密:

代码语言:js
复制
#-*-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 = []

运行示例:

解密:

代码语言:js
复制
#-*-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,套用加密同样的算法即可得。

具体代码如下:

代码语言:js
复制
#-*-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)

二 关键词加密法

关键词加密法主要通过两步实现:

  1. 选择一个关键词,如果该关键词有重复的字母,去除除第一次出现之外的所有相同的字母。例如,若选定的关键词为“success”,则使用“suces”。
  2. 将该关键词写在字母表的下方,并用字母表的其他字母按标准的顺序填写余下的空间。

例如,对于关键词“magicnet”,这两个字母表为:

这两个字母表就定义了关键词替换模式,对于上面的关键词,明文字母“a”总是用密文字母“m”替代,“b”则由“a”替代等。在这种情况下,一个典型的明文消息和密文消息如下所示:

明文:helpiamlost

密文:tchobmjhlrs

这种很容易被破解,一种改进的方法就是允许关键词从字母表的任意位置开始,例如,关键词“pacific”从“k”开始,则替换秘钥如下所示:

因为“pacific”的重复字母被删掉了,去除了第二个“i”和“c”,这时,明文和密文分别为:

明文:helpiamlost

密文:xuabyqcafgh

这里给出小写字母的加密脚本:

加密:

代码语言:js
复制
#-*-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)

运行示例:

对于要攻击的关键词加密法,有三个需要分析的地方:

  1. 明文是用标准英语写成的;
  2. 所用加密法为关键词加密法;
  3. 每个明文字母已被唯一的密文字母替代。

解密:

对于关键词加密法可以使用CAP工具解密。

最方便的就是使用Word Patterns这个工具

内含自带的多个关键词,也可以自己添加。

通过关键词列出对应项,从而找出明文。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 恒星EDU 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档