Python零基础编程——08密码学基础理论篇

摘要

书接前文:《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-总结

Python零基础编程——08密码学基础理论篇_第1张图片左边是密文,右边是明文

1-摩斯代码 morse

电报原理:将英文字母转成电子脉冲(编码),另外一头将电子脉冲转换成为英文字母(解码)

Python零基础编程——08密码学基础理论篇_第2张图片

2-手工制作加密工具

-加密轮盘:明文密文同心圆中进行对照

Python零基础编程——08密码学基础理论篇_第3张图片

-St.Cry滑条,对照显示

Python零基础编程——08密码学基础理论篇_第4张图片

3-凯撒加密法的信息加密、解密及过程

加密一个字母的步骤是 :
 1 .从 1到 2 5选一个密钥 。保管好这个密钥 !
 2 .找出明文字母的数字 。
 3 .把密钥加到这个明文字母的数字 。 
 4 .如果这个数字大于 2 6 ,则减去 2 6 。
 5 .找出你计算的数字的字母 。这就是密文字母 。
 6 .对明文消息里的每个字母重复步骤 2 ~ 5 。
 思考?多次凯撒加密是否更安全?答案是否定的,多次加密反而无效,直接得到明文

 

Python零基础编程——08密码学基础理论篇_第5张图片对字符进行编码

key=3 为密钥

如果要解密,编码减去这个密钥key, 而不是加上它。

破解方法:爆破方式,逐个密钥尝试

4-反转加密法

对明文进行倒序反转,例如:“Hello world!” 反转加密变为:成“! dlrow olleH”

加密性弱,一般用于密文进行反转加密

5-换位加密法、加密、解密及过程

对明文信息进行打乱顺序,例如:加密“ Common sense is not so common.” 这条 消息。 算上空格和 标点符号, 这条消息包含30个字符。利用密钥Key=8,即8列

加密过程:

 

Python零基础编程——08密码学基础理论篇_第6张图片

将明文是行的,密文为列,即:密 文 是“ 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行的表格中,如下:

Python零基础编程——08密码学基础理论篇_第7张图片得到明文“ Common sense is not so common.”

 

解密的步骤 如下: 
1. 将 消息 的 长度 除以 密钥 并向 上 取整 计算 需要 的 列数。 
2. 画出 一定 数量 的 格子。 列数 已在 第一步 计算, 行数 和 密钥 一样。
3. 将 格子 的 个数( 行数 乘以 列数) 减去 密 文 消息 的 长度 计算 需要 涂 灰 格子 的 个数。
4. 涂 灰 最 右边 那一 列 下面 的 格子, 个数 已在 第三步 计算。 
5. 填入 密 文 的 字符, 从 最上 面 那一 行 开始, 从左 向右 填入。 跳过 任何 灰色 格子。
6. 要 获取 明文, 从 最 左边 那一 列 开始, 从上往下 读取, 然后 移到 下一 列 顶部。

Al Sweigart 斯维加特. Python密码学编程(异步图书) (p. 95). 人民邮电出版社. Kindle 版本. 

破解方法:通常我们在不知道密钥key的情况下,采用爆破密钥key,然后通过英文单词检测的方式来破解密文。

6-数乘加密法

凯撒加密法,都是采用将密钥加到字符串的索引去,而数乘加密法是采用乘法将密钥乘索引。

在凯撒加密法里 ,加密和解密符号涉及把它们转换成数字 ,加上或减去密钥 ,然后把新的数字转换回符号 。

如果我们在加密时不是加上密钥而是乘以呢 ?这会导致 “回调 ”问题 ,不过取模运算符可以解决这个问题 。比如说 ,我们使用只包含大写字母的符号集和密钥 7 。

下面列出字母及其数字 :

Python零基础编程——08密码学基础理论篇_第8张图片

要找出符号 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

 

Python零基础编程——08密码学基础理论篇_第9张图片算法过程

 

7-仿射加密法

  • 乘数加密法 +凯撒加密法 =仿射加密法

 

Python零基础编程——08密码学基础理论篇_第10张图片

加密过程:

x为明文的索引,a,b为密钥key

解密过程:

x为明文的索引,a,b为密钥key

 

8-简单替代加密法

不重复地简单替代,例如26个字母替代组合有:26! 种(403291461126605635584000000)

Python零基础编程——08密码学基础理论篇_第11张图片

26!数量也很庞大,要逐个暴力破解,也不用简单。

常用破解方式是采用:单词模式+词典

例如密文是:HGHHU,长度为5,第1、3、4字母一样,三种字母H、G、U,单词模式为01002

找本牛津词典,找出这种模式的单词进行备选即可,例如:

Python零基础编程——08密码学基础理论篇_第12张图片

解密出来的明文备选:

 

Python零基础编程——08密码学基础理论篇_第13张图片密文对照

当对3组左右的单词,对得到的备选对照进行取交集,基本上就可以得到明文替换的对照关系。

 

9-维吉尼亚加密法——多表替代加密法

和凯撒加密法类似,密钥采用多个(多组替代),凯撒加密的密钥范围是0-25,多表替代加密是采用一个字母密钥,例如:PIZZA,第1个密钥是P,第2个子密钥是I,第3、4密钥是Z,以此类推,如下:

 

Python零基础编程——08密码学基础理论篇_第14张图片

 

Python零基础编程——08密码学基础理论篇_第15张图片密码表

举个栗子:
明文:ATTACKATDAWN
关键字:LEMON,密钥为:LEMONLEMONLE
加密过程:第一个字母A,对应密钥的第一个字母L,于是使用表格中L行字母表进行加密,得到密文第一个字母L
类似地,明文第二个字母为T,在表格中使用对应的E行进行加密,得到密文第二个字母X

加密后得到密文:LXFOPVEFRNHR

加密过程:

解密过程:

加密复杂度:密钥长度决定,每加一个长度复杂的就×26,当密钥长度超过12位基本上普通电脑破解就很难。

 

破解方法:词频分析与ETAOIN

英语中,每一个英文单词的使用频率都不一样,就像我们汉语常用也就3千个字,里面每一个字的频率都不一样。

 

Python零基础编程——08密码学基础理论篇_第16张图片

我们对密文的单词进行频率统计,对用常用字母频率ETAOIN匹配即可得到密文中最高频率与低频率的对照关系。

 

Python零基础编程——08密码学基础理论篇_第17张图片

剩下的继续按照,单词模式+字典的方式进行得到密文映射集合,然后多个集合取交集即可。

 

10-一次一密加密法 one time pad cipher

在多表替代加密法的基础上,加入以下规则:

  • 密钥和加密的消息同样长,密钥称之为密码本(pad)
  • 密钥由真正的随机符号组成
  • 密钥只用一次,永不对其他消息复用

简称OTP,复杂程度为:字符集A^消息长度L次方,例如26^55次方,爆破基本不可能

Python零基础编程——08密码学基础理论篇_第18张图片

11-公钥密码学

以上10种都是传统的加密方法,并且都是要求加密密钥和解密密钥相同,称之为对称加密法,基本都是给熟人(有你密钥)发送加密后的密文。

对称加密:

  • 密钥加密
  • 密钥解密

 

Python零基础编程——08密码学基础理论篇_第19张图片

如果我们需要对不认识的人发送密文呢?例如你们要邮件、消息、文件发送要加密,发给一个未知的客户。这种场景问题,需要采用公钥密码学(public key cryptography),使用两个密钥,一个用来加密(共钥),一个用来解密(私钥),称之为非对称加密法。例如你用工行的公钥加密消息,发给工行,工行用自己的私钥解密。其他人就算截取了你的消息,没有解密的私钥也没有用。

非对称加密:

  • 公钥加密
  • 私钥解密

典型非对称加密算法有:RSA加密法

Python零基础编程——08密码学基础理论篇_第20张图片

12-RSA加密法

缺点1:无法做身份认证,例如你获得了工行的公钥,但是你无法确定这个“工行”就是工行,它可能是伪装的。就必须使用PKI(公钥基础设施)做身份认证,可以做安全地匹配到公钥。这要涉及认证的技术。

 

Python零基础编程——08密码学基础理论篇_第21张图片

缺点2:中间人攻击,如果工行把它的公钥发给你的时候,在中间被黑客截取了,并且把自己的公钥替换了工行的公钥发给你。你们在通信过程就被他们截取解密了。还是身份认证问题。

RSA 密钥原理:

1. 创建 两个 随机 的 非常 大的 质数。 这些 数字 分别 称做 p 和 q。 将 这些 数字 相乘 得到 一个 数字, 我们 把 它 称做 n。

2. 创建 一个 随机数, 称做 e, 使 它与( p – 1) ×( q – 1) 互 质。

3. 计算 e 的 模 逆。 这个 数字 称做 d。

 

公 钥 将是 n 和 e 两个 数字。

私 钥 将是 n 和 d 两个 数字。( 注意, 两个 密钥 都 包含 了 数字 n。)

 

 

Python零基础编程——08密码学基础理论篇_第22张图片

 

Python零基础编程——08密码学基础理论篇_第23张图片

示例:

 

Python零基础编程——08密码学基础理论篇_第24张图片

 

13-总结

了解传统加密方法及起加密解密过程,了解对称加密、非对称加密加密解密过程。本篇只是对理论部分进行初步学习认识,接下来对常用的加密算法进行Python编程实现及其使用实战

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Python,python,密码学,算法)