初识密码学
密码学初识
首先要区分的是编码法和加密法,虽然两者都是用来加密信息的方法,但是他们是以完全不同的方式进行的。编码法就是用字、短语或数字来代替明文。例如,“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)
二 关键词加密法
关键词加密法主要通过两步实现:
- 选择一个关键词,如果该关键词有重复的字母,去除除第一次出现之外的所有相同的字母。例如,若选定的关键词为“success”,则使用“suces”。
- 将该关键词写在字母表的下方,并用字母表的其他字母按标准的顺序填写余下的空间。
例如,对于关键词“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这个工具
内含自带的多个关键词,也可以自己添加。
通过关键词列出对应项,从而找出明文。
- 【编程基础】C++初学者需掌握的10个C++特性(中)
- 一步步教你弹性框架-中篇
- 细说ReactiveCocoa的冷信号与热信号系列(2)
- 谈谈个人网站的建立(三)—— 定时任务
- 细说ReactiveCocoa的冷信号与热信号系列(1)
- 【美团技术团队博客】前端组件化开发实践
- Spring中Bean
- 跟Google学写代码--Chromium/base--windows_version源码学习及应用
- 一步步教你弹性框架-下篇
- R语言与机器学习(分类算法)朴素贝叶斯算法
- 【美团技术团队博客】RACSignal的Subscription深入分析
- 谈谈个人网站的建立(八)—— 缓存的使用
- 【编程基础】System.arraycopy()和 Arrays.copyOf()
- 移动端 模拟手机联系人触摸A~Z导航
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法