Python密码学编程

Python密码学编程

写在前面

娄老师推荐的这本书《Python密码学编程》,比较系统地讲述了许多经典的密码,并在介绍密码原理、python实现的过程中、介绍了python的许多语法知识,对于我们信息安全专业的学生不仅在密码学知识上,并且在Python编程中都有很大的帮助。

本书代码链接

反向密码源代码
凯撒密码程序
暴力破解凯撒密码
置换加密
破解置换密码
编写测试程序
文件加密程序
编程检测英文文本
破解置换密码
仿射密码模块运算
仿射密码
破解仿射密码
简单代换密码
简单代换密码破解
维吉尼亚密码
维吉尼亚密码破解

反向密码实现与破解

及将所有字符反向来加密,是比较简单的加密方式

python实现

解码验证

凯撒密码实现与破解

在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。

python实现

编码


解码

暴力破解凯撒密码

如果我们知道了密码的加密方式为凯撒加密,但不知道使用的是什么密匙,我们就可以用枚举法,暴力破解,一共只有66种可能,交给计算机来就是一瞬的事情。

Python实现

  • 练一练

置换密码实现加密与破解

  • 置换密码
    和替换密码不同的是,置换密码是通过对原始信息中的字符重新排列,使其变得不可读,因为不同的密匙会导致字符有不用的顺序,将密文重新排列还原成原始消息。
  • 用置换密码进行加密的步骤如下:
    1.计算消息和密匙中字符的个数
    2.绘制一行个数等于密匙值的空框(如密钥为8,绘制8个框)
    3.从左到右开始对框进行填充,每个框内放置一个字符。
    4.当框已经填满但还有剩余字符时,再添加一行空框。
    5.到最后一个字符时,为最后一行未使用的框涂上阴影。
    6.从左上方开始,每列依次向下写出字符。当到达一列的底部,移到右侧一列,并跳过阴影框,这样的结果是密文
    实例“Common sense is not so common." 用数字8作为密钥

python实现

置换加密算法

用python实现置换加密的关键就是了解算法

ciphertext =[''] * key

ciphertext变量中的每个字符串代表置换密码网格中的一列。因为列的数量与键的值相等,所以可以使用复制列表的方式将具有一个空字符串的列表乘以键的值。这样就得到了一个拥有正确数目的空字符串的列表
然后

for column in range(key):
  currentIndex =column

破解置换密码

  • 如何在纸上破解置换密码


python实现破解置换密码

编写测试程序

文件的加密和解密

python实现

编程检测英语文本

Python破解置换密码

仿射密码实现与破解

  • 模运算
    模运算或者称时钟运算,是指数字达到某一特定值时,对其取模,用模运算来处理仿射密码中的回环。
    类似于时钟问题如10小时后的5小时是几小时
    10+5=15 15/12=1...3 所以是指向3小时
  • 寻找最大公约数
    通过可视化两个因数的因子,最容易找到最大公约数现在举例古氏积木法,可视化3+2=5 5*3=15
def gcd(a,b):
    while a !=0:
        a,b =b%a,a
    return b
def findModInverse(a,m):
    if gcd(a,m) !=1:
        return None
    u1,u2,u3=1,0,a
    v1,v2,v3=0,1,m
    while v3 != 0:
        q=u3//v3
        v1,v2,v3,u1,u2,u3=(u1-q* v1),(u2-q*v2),(u3-q*v3),v1,v2,v3
    return u1 %m

Cryptomath模块的源代码 包含gcd函数和欧几里得扩展算法的findModInverse函数

仿射加密

仿射加密法需要两个密钥:一个用于乘数加密法相乘,另一个用于凯撒加密法相加。
对于仿射加密法程序,我们将使用单个整数密钥。我们将通过某种简单的数学运算把这
个密钥分成两个密钥,我们把它们称为密钥A和密钥B。
使用仿射加密法加密会将一个字符在SYMBOLS里的索引乘以密钥A,再加上密钥B。
但是,如果keyA是1,加密之后的文字将会非常弱,因为将这个索引乘以1并未改变它。
类似地,如果keyB是0,加密之后的文字也会非常弱,因为将这个索引加上0并未改变它。
如果keyA是1,且keyB是0,那么“加密之后的”消息就会和原来的消息完全一样。也就是根本没有加密!

破解仿射密码

只要密钥的数量级是几千个,暴力破解就不会花费计算机很长时间,可以尝试每一个可能的密钥并使用isEnglish()函数来寻找正确的密钥。
用来暴力破译密文的密钥的整数范围是从0到符号集大小的二次方
我们之所以这样相乘是因为密钥A有len (affineCipher.SYMBOLS)个可能的整数,密钥B也有len (affineCipher.SYMBOLS)个可能的整数。要得到可能密钥的整个范围,我们将这些值相乘来寻找进一步范围。

简单代换密码原理即破解


让我们先用纸笔实现简单替代加密法。比如说,我们要用密钥VJZBGNFEPLITMXDW
KQUCRYAHSO加密消息“Attack at dawn.”。首先写出字母表的字母,然后在它下面写下密钥。
ABCDEFGHIJKLMNOPQRSTUVWXYZ
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
VJZBGNFEPLITMXDWKQUCRYAHSO
要加密消息,从上面那行的明文找到字母,用下面那行的字母替代它。A加密成V,T
加密成C,C加密成Z,如此类推。因此,消息“Attack at dawn.”加密成“Vccvzi vc bvax.”。
要解密,从下面那行的密文找到字母,用上面那行的字母替代它。V解密成A,C解密
成T,Z解密成C,如此类推...
简单替代加密法的优势是拥有大量可能的密钥。劣势是密钥有26个字符的长度,很
难记。如果字母在明文里是小写的,它在密文里也是小写的;如果字母在明文里是大写
的,它在密文里也是大写的。简单替代加密法并不加密空格或标点符号。
简单替代加密法的密钥字符串值只有在它包含了符号集里的每个字符且没有重复或缺失
的情况下才有效。我们可以按照字母表顺序对一个字符串值和符号集分别进行排序,并检查
它们是否相等,这样就能判断这个字符串值是不是一个有效的密钥了。

破解简单代换密码

通过单词模式可以猜测密文字母可能解密到哪些明文字母,这些明文字母称为密文字母的可能解密字母。
破解步骤如下

  • 在密文中找出每个密文单词的单词模式
  • 找出每个密文单词的英语单词候选项
  • 为每个密文字母创建一个字典存储为可能解密字母,相当于对每个密文单词获取密文字母映射
  • 将密文字母的映射取交集合并为一个映射,称之为交集映射
  • 从交集映射中移除任意已经确定了正确映射的密文字母
  • 根据确定了的密文字母映射解密密文

维吉尼亚密码实现与破解

与凯撒密码不同,维吉尼亚密码是一种多密匙密码
简单来讲就是由多个凯撒密码组成的维吉尼亚密码

破解维吉尼亚密码

本章程序实现的是字典式攻击算法,这意味着维吉尼亚密码如果采用英文单词作为密钥,很难抵御字典式攻击
字典式攻击详细介绍

感悟

通过这本书,简单了解了反向密码、凯撒密码、置换密码、文件加密、仿射密码、简单代换密码、维吉尼亚密码,并通过暴力破解或制作算法破解密码,对密码学有了初步的了解,并在学习密码原理的过程中对于数学能力与Python编程能力也有了很大的提升,希望可以进一步学习密码学知识,早日做到能自己制作一种加密算法。

posted @ 2021-11-24 11:37  20211308wjc  阅读(945)  评论(0编辑  收藏  举报