书接前文:《Python基础》
本文将简单从0开始分享密码学,从摩斯密码到凯撒加密法,以及常见常用的信息加密方法。学会如何对消息进行简单的加密和解密,以及破解。涉及部分编程知识需要先学习前文的Python基础。
部分知识参考: Al Sweigart 斯维加特. Python密码学编程 https://s.click.taobao.com/61N1Nhv
1-摩斯代码 morse 2-手工制作加密工具 3-凯撒加密法的信息加密、解密及过程 4-反转加密法 5-换位加密法、加密、解密及过程 6-数乘加密法 7-仿射加密法 8-简单替代加密法 9-维吉尼亚加密法——多表替代加密法 10-一次一密加密法 one time pad cipher 11-公钥密码学 12-RSA加密法 13-总结
电报原理:将英文字母转成电子脉冲(编码),另外一头将电子脉冲转换成为英文字母(解码)
-加密轮盘:明文密文同心圆中进行对照
-St.Cry滑条,对照显示
加密一个字母的步骤是 : 1 .从 1到 2 5选一个密钥 。保管好这个密钥 ! 2 .找出明文字母的数字 。 3 .把密钥加到这个明文字母的数字 。 4 .如果这个数字大于 2 6 ,则减去 2 6 。 5 .找出你计算的数字的字母 。这就是密文字母 。 6 .对明文消息里的每个字母重复步骤 2 ~ 5 。 思考?多次凯撒加密是否更安全?答案是否定的,多次加密反而无效,直接得到明文
key=3 为密钥
如果要解密,编码减去这个密钥key, 而不是加上它。
破解方法:爆破方式,逐个密钥尝试
对明文进行倒序反转,例如:“Hello world!” 反转加密变为:成“! dlrow olleH”
加密性弱,一般用于密文进行反转加密
对明文信息进行打乱顺序,例如:加密“ Common sense is not so common.” 这条 消息。 算上空格和 标点符号, 这条消息包含30个字符。利用密钥Key=8,即8列
加密过程:
将明文是行的,密文为列,即:密 文 是“ Cenoonommstmme oo snnio. s s c”
加密 的 步骤 如下: 1. 数 一下 消息 里 的 字符 个数。 2. 画 一行 个数 等于 密钥 的 格子。( 比如说, 密钥 是 12, 格子 就有 12 个。) 3. 从左到右 开始 填充 格子, 每个 格子 填 一个 字符。 4. 当你 用完 格子 还有 字符 剩下 时, 再加 一行 格子。 5. 把 最后 一行 剩下 不用 的 格子 涂成 灰色。 6. 从 最上 角 开始 往下 写出 字符。 当你 到达 这一 行的 底部 后, 移到 右边 那 一列。 跳过 任何 灰色 的 格子。 这 就是 密 文。 Al Sweigart 斯维加特. Python密码学编程(异步图书) (p. 74). 人民邮电出版社. Kindle 版本.
解密过程:
收到密 文“ Cenoonommstmme oo snnio. s s c” ,知道密钥是 8,密文长度Length / 密钥key = 30/4 =3.75,向上取整为4,将密文按列放在4列8行的表格中,如下:
得到明文“ Common sense is not so common.”
解密的步骤 如下: 1. 将 消息 的 长度 除以 密钥 并向 上 取整 计算 需要 的 列数。 2. 画出 一定 数量 的 格子。 列数 已在 第一步 计算, 行数 和 密钥 一样。 3. 将 格子 的 个数( 行数 乘以 列数) 减去 密 文 消息 的 长度 计算 需要 涂 灰 格子 的 个数。 4. 涂 灰 最 右边 那一 列 下面 的 格子, 个数 已在 第三步 计算。 5. 填入 密 文 的 字符, 从 最上 面 那一 行 开始, 从左 向右 填入。 跳过 任何 灰色 格子。 6. 要 获取 明文, 从 最 左边 那一 列 开始, 从上往下 读取, 然后 移到 下一 列 顶部。 Al Sweigart 斯维加特. Python密码学编程(异步图书) (p. 95). 人民邮电出版社. Kindle 版本.
破解方法:通常我们在不知道密钥key的情况下,采用爆破密钥key,然后通过英文单词检测的方式来破解密文。
凯撒加密法,都是采用将密钥加到字符串的索引去,而数乘加密法是采用乘法将密钥乘索引。
在凯撒加密法里 ,加密和解密符号涉及把它们转换成数字 ,加上或减去密钥 ,然后把新的数字转换回符号 。
如果我们在加密时不是加上密钥而是乘以呢 ?这会导致 “回调 ”问题 ,不过取模运算符可以解决这个问题 。比如说 ,我们使用只包含大写字母的符号集和密钥 7 。
下面列出字母及其数字 :
要找出符号 F使用密钥 7会加密成什么 ,将它的数字 ( 5 )乘以 7 ,再对 2 6取模 (处理 2 6符号集的 “回调 ” ) 。然后使用那个数字的符号 。 ( 5 × 7 )取模 2 6 = 9 , 9是符号 J的数字 。因此 , F在乘数加密法里使用密钥 7会加密成 J 。同理得到:
问题1:
乘数加密法有个缺点,就是A没有被加密,密文也是A,因为A的索引是0,0乘上任何Key都是0,所以,我们在乘数keyA后,再进行凯撒加密法进行加法keyB加密。于是得到仿射加密法。
问题2:不是任意的数都可以作为乘数加密的密钥Key,例如8,会导致密文多对一。密钥他和字符集大小,要互质。
两个数的最大公约数为1,则两个数互质
求两个数的最大公约数算法:欧几里得算法
def gcd (a , b ) : while a ! = 0 : a , b = b % a , a return b
加密过程:
x为明文的索引,a,b为密钥key
解密过程:
x为明文的索引,a,b为密钥key
不重复地简单替代,例如26个字母替代组合有:26! 种(403291461126605635584000000)
26!数量也很庞大,要逐个暴力破解,也不用简单。
常用破解方式是采用:单词模式+词典
例如密文是:HGHHU,长度为5,第1、3、4字母一样,三种字母H、G、U,单词模式为01002
找本牛津词典,找出这种模式的单词进行备选即可,例如:
解密出来的明文备选:
当对3组左右的单词,对得到的备选对照进行取交集,基本上就可以得到明文替换的对照关系。
和凯撒加密法类似,密钥采用多个(多组替代),凯撒加密的密钥范围是0-25,多表替代加密是采用一个字母密钥,例如:PIZZA,第1个密钥是P,第2个子密钥是I,第3、4密钥是Z,以此类推,如下:
举个栗子: 明文:ATTACKATDAWN 关键字:LEMON,密钥为:LEMONLEMONLE 加密过程:第一个字母A,对应密钥的第一个字母L,于是使用表格中L行字母表进行加密,得到密文第一个字母L 类似地,明文第二个字母为T,在表格中使用对应的E行进行加密,得到密文第二个字母X 加密后得到密文:LXFOPVEFRNHR
加密过程:
解密过程:
加密复杂度:密钥长度决定,每加一个长度复杂的就×26,当密钥长度超过12位基本上普通电脑破解就很难。
破解方法:词频分析与ETAOIN
英语中,每一个英文单词的使用频率都不一样,就像我们汉语常用也就3千个字,里面每一个字的频率都不一样。
我们对密文的单词进行频率统计,对用常用字母频率ETAOIN匹配即可得到密文中最高频率与低频率的对照关系。
剩下的继续按照,单词模式+字典的方式进行得到密文映射集合,然后多个集合取交集即可。
在多表替代加密法的基础上,加入以下规则:
简称OTP,复杂程度为:字符集A^消息长度L次方,例如26^55次方,爆破基本不可能
以上10种都是传统的加密方法,并且都是要求加密密钥和解密密钥相同,称之为对称加密法,基本都是给熟人(有你密钥)发送加密后的密文。
对称加密:
如果我们需要对不认识的人发送密文呢?例如你们要邮件、消息、文件发送要加密,发给一个未知的客户。这种场景问题,需要采用公钥密码学(public key cryptography),使用两个密钥,一个用来加密(共钥),一个用来解密(私钥),称之为非对称加密法。例如你用工行的公钥加密消息,发给工行,工行用自己的私钥解密。其他人就算截取了你的消息,没有解密的私钥也没有用。
非对称加密:
典型非对称加密算法有:RSA加密法
缺点1:无法做身份认证,例如你获得了工行的公钥,但是你无法确定这个“工行”就是工行,它可能是伪装的。就必须使用PKI(公钥基础设施)做身份认证,可以做安全地匹配到公钥。这要涉及认证的技术。
缺点2:中间人攻击,如果工行把它的公钥发给你的时候,在中间被黑客截取了,并且把自己的公钥替换了工行的公钥发给你。你们在通信过程就被他们截取解密了。还是身份认证问题。
RSA 密钥原理:
1. 创建 两个 随机 的 非常 大的 质数。 这些 数字 分别 称做 p 和 q。 将 这些 数字 相乘 得到 一个 数字, 我们 把 它 称做 n。
2. 创建 一个 随机数, 称做 e, 使 它与( p – 1) ×( q – 1) 互 质。
3. 计算 e 的 模 逆。 这个 数字 称做 d。
公 钥 将是 n 和 e 两个 数字。
私 钥 将是 n 和 d 两个 数字。( 注意, 两个 密钥 都 包含 了 数字 n。)
示例:
了解传统加密方法及起加密解密过程,了解对称加密、非对称加密加密解密过程。本篇只是对理论部分进行初步学习认识,接下来对常用的加密算法进行Python编程实现及其使用实战