从零开始入门密码学_1
来源:互联网 发布:windows安装光盘下载 编辑:程序博客网 时间:2024/06/07 07:27
1.凯撒密码(Caesar)
凯撒密码简单理解就是将字符进行平移。
例如:将字母右移10位,那么 Password
将加密成Zkccgybn
凯撒加密的密钥就是右移的位数,由于只有26个英文字母,所以总共有26个密钥,暴力破解,穷举搜索,就可以破解密文。
python实现如下:
#! /usr/bin/env python3#Caesar Encryptdef CaeserEncrypt(text,n=10):#默认右移10位 if not text.isalpha(): raise Exception('Input must be a text of letters\n') else: res = '' for char in text: num = ord(char) if char.isupper(): if num+n >90: res += chr(num+n-26) else: res += chr(num+n) else: if num+n > 122: res += chr(num+n-26) else: res += chr(num+n) return resif __name__ == '__main__': //Caeser Encrypt text = 'Password' print(CaeserEncrypt(text)) //穷举破解 text = 'Zkccgybn' for i in range(1,27): print(CaeserEncrypt(text,i),' ',end='')结果如下:ZkccgybnAlddhzco Bmeeiadp Cnffjbeq Doggkcfr Ephhldgs Fqiimeht Grjjnfiu Hskkogjv Itllphkw Jummqilx Kvnnrjmy Lwoosknz Mxpptloa Nyqqumpb Ozrrvnqc Password Qbttxpse Rcuuyqtf Sdvvzrug Tewwasvh Ufxxbtwi Vgyycuxj Whzzdvyk Xiaaewzl Yjbbfxam Zkccgybn
2.简单替换密码
凯撒密码将字母平移,本质是建立了一个字母之间的一一映射,它也是一种特殊的替换密码。
如果我们打乱这种替换顺序,新建一个字母之间的一一映射,就可以得到一种新的加密方式,这就是简单替换密码。
python实现如下:
#! /usr/bin/env python3#替换加密import randomdef generate_key():#随机生成一个密钥 key = {} list = [] for i in range(26): while True: char = chr(round(random.uniform(65,90))) if char not in list: break key[chr(65+i)] = char list.append(char) for k,v in key.copy().items(): key[k.lower()] = v.lower() return keydef replaceEncrypt(text,key):#给定 明文和替换密钥 进行加密 res = '' for char in text: if char.isalpha(): res += key[char] else: res += char return resif __name__ == '__main__': key = generate_key() print(key) text = 'Password' print(replaceEncrypt(text,key))结果如下:由于每次生成的替换密钥都不一样,所以同一文本,每次得到的密文也不一样{'M': 'X', 'j': 'k', 'L': 'A', 'R': 'Y', 'B': 'N', 'V': 'E', 'U': 'P', 'm': 'x', 'Q': 'J', 'O': 'O', 'P': 'F', 'W': 'B', 'c': 'i', 'o': 'o', 'l': 'a', 'Y': 'S', 't': 'm', 'y': 's', 'k': 'h', 'C': 'I', 'd': 'v', 'a': 'g', 'r': 'y', 'T': 'M', 'e': 'r', 'f': 'w', 'X': 'U', 'g': 't', 'S': 'C', 'n': 'l', 'G': 'T', 'q': 'j', 'z': 'd', 'E': 'R', 'D': 'V', 'i': 'z', 'p': 'f', 'K': 'H', 'F': 'W', 'h': 'q', 'N': 'L', 'x': 'u', 'H': 'Q', 'b': 'n', 'w': 'b', 'J': 'K', 's': 'c', 'A': 'G', 'Z': 'D', 'u': 'p', 'I': 'Z', 'v': 'e'}Fgccboyv
3.密钥空间 keyspace
密钥空间即为所有密钥的集合。
对于凯撒加密,由于只有26中可能的密钥,故密钥空间大小为26.
而对于替换加密,密钥空间大小为26!,数量级为10^26。对于如此大的密钥空间,尝试穷举就显得乏力了。
4.频率分析
虽然替换密码密钥空间巨大,但是如果用频率分析的方法,就比较容易破解了。
如果我们一段替换加密的密文,并且文本长度越长越好,我们可以通过,统计字母出现的频率,逐渐尝试出加密密钥来。
python实现如下:
#! /usr/bin/env python3import pprintdef letterCount(text,flag=True): '''统计文本中各个字母出现的次数 输入文本和是否忽略大小写,默认忽略大小写 ''' res = {} for char in text: if flag: char = char.lower() res.setdefault(char, 0) res[char] += 1 return resif __name__ == '__main__': text = '''Monte Ne is a former health resort and planned community in the U.S. state of Arkansas, open from 1901 to the mid-1930s. It was owned and operated by William Hope Harvey, a financial theorist and writer, in the Ozark hills of the White River valley east of Rogers on the edge of Beaver Lake. Two of its hotels, Missouri Row and Oklahoma Row, were the largest log buildings in the world at the time, and Oklahoma Row's tower is one of the earliest examples of a multi-story concrete structure. The resort was not a financial success, due in part to Harvey's management style, and shortly after his death the property was sold off. The remainder of the resort and town was almost completely submerged after Beaver Lake was created in 1964. The severely vandalized Oklahoma Row tower is the only remaining structure that can be seen at normal lake levels. The area on the edge of Beaver Lake still referred to as Monte Ne, owned and managed by the United States Army Corps of Engineers, serves mainly as a boat ramp.''' import replaceEncrypt key = replaceEncrypt.generate_key() print('替换密钥是:') pprint.pprint(key) decrypted_text = replaceEncrypt.replaceEncrypt(text, key) print('\n密文是:\n%s'%decrypted_text) res1 = letterCount(text, flag=True) # 忽略大小写进行统计 print('\n明文的字母统计:') pprint.pprint(res1) print('\n 密文的字母统计:') res2 = letterCount(decrypted_text, flag=True) # 忽略大小写进行统计 pprint.pprint(res2)替换密钥是:{'A': 'F', 'B': 'D', 'C': 'X', 'D': 'J', 'E': 'U', 'F': 'O', 'G': 'K', 'H': 'C', 'I': 'R', 'J': 'Z', 'K': 'H', 'L': 'E', 'M': 'Y', 'N': 'N', 'O': 'V', 'P': 'A', 'Q': 'M', 'R': 'T', 'S': 'Q', 'T': 'B', 'U': 'I', 'V': 'L', 'W': 'W', 'X': 'G', 'Y': 'S', 'Z': 'P', 'a': 'f', 'b': 'd', 'c': 'x', 'd': 'j', 'e': 'u', 'f': 'o', 'g': 'k', 'h': 'c', 'i': 'r', 'j': 'z', 'k': 'h', 'l': 'e', 'm': 'y', 'n': 'n', 'o': 'v', 'p': 'a', 'q': 'm', 'r': 't', 's': 'q', 't': 'b', 'u': 'i', 'v': 'l', 'w': 'w', 'x': 'g', 'y': 's', 'z': 'p'}密文是:Yvnbu Nu rq f ovtyut cufebc tuqvtb fnj aefnnuj xvyyinrbs rn bcu I.Q. qbfbu vo Fthfnqfq, vaun otvy 1901 bv bcu yrj-1930q. Rb wfq vwnuj fnj vautfbuj ds Wreerfy Cvau Cftlus, f ornfnxrfe bcuvtrqb fnj wtrbut, rn bcu Vpfth creeq vo bcu Wcrbu Trlut lfeeus ufqb vo Tvkutq vn bcu ujku vo Duflut Efhu. Bwv vo rbq cvbueq, Yrqqvitr Tvw fnj Vhefcvyf Tvw, wutu bcu eftkuqb evk direjrnkq rn bcu wvtej fb bcu bryu, fnj Vhefcvyf Tvw'q bvwut rq vnu vo bcu ufteruqb ugfyaeuq vo f yiebr-qbvts xvnxtubu qbtixbitu. Bcu tuqvtb wfq nvb f ornfnxrfe qixxuqq, jiu rn aftb bv Cftlus'q yfnfkuyunb qbseu, fnj qcvtbes fobut crq jufbc bcu atvautbs wfq qvej voo. Bcu tuyfrnjut vo bcu tuqvtb fnj bvwn wfq feyvqb xvyaeubues qidyutkuj fobut Duflut Efhu wfq xtufbuj rn 1964. Bcu qulutues lfnjferpuj Vhefcvyf Tvw bvwut rq bcu vnes tuyfrnrnk qbtixbitu bcfb xfn du quun fb nvtyfe efhu eulueq. Bcu ftuf vn bcu ujku vo Duflut Efhu qbree tuouttuj bv fq Yvnbu Nu, vwnuj fnj yfnfkuj ds bcu Inrbuj Qbfbuq Ftys Xvtaq vo Unkrnuutq, qutluq yfrnes fq f dvfb tfya.明文的字母统计:{'\n': 14, ' ': 180, "'": 2, ',': 10, '-': 2, '.': 9, '0': 2, '1': 4, '3': 1, '4': 1, '6': 1, '9': 3, 'a': 79, 'b': 9, 'c': 13, 'd': 28, 'e': 113, 'f': 19, 'g': 11, 'h': 34, 'i': 39, 'k': 9, 'l': 40, 'm': 27, 'n': 50, 'o': 63, 'p': 11, 'r': 63, 's': 54, 't': 74, 'u': 13, 'v': 11, 'w': 20, 'x': 1, 'y': 15, 'z': 2} 密文的字母统计:{'\n': 14, ' ': 180, "'": 2, ',': 10, '-': 2, '.': 9, '0': 2, '1': 4, '3': 1, '4': 1, '6': 1, '9': 3, 'a': 11, 'b': 74, 'c': 34, 'd': 9, 'e': 40, 'f': 79, 'g': 1, 'h': 9, 'i': 13, 'j': 28, 'k': 11, 'l': 11, 'n': 50, 'o': 19, 'p': 2, 'q': 54, 'r': 39, 's': 15, 't': 63, 'u': 113, 'v': 63, 'w': 20, 'x': 13, 'y': 27}
如果我们可以接触到这个加密过程,通过测试给定的明文,得到密文之后,进行频率对比就很容易得到加密密钥了。
如果我们无法接触到这个加密过程,我们也可以把给定密文的字母出现频率和经验中的字母出现频率做一定对比,我们也可以通过尝试逐步破解。
阅读全文
0 0
- 从零开始入门密码学_1
- 从零开始入门密码学_2
- 密码学入门
- ARM入门文章_1
- ARM入门文章_1
- 数据结构入门_1
- 驱动入门_1
- Servlet入门笔记_1
- HIVE入门_1
- SparkSQL入门_1
- python入门笔记_1
- MyBatis快速入门_1
- Graphql入门_1
- Vue入门篇_1
- Smarty快速入门_1
- C#编程入门_1
- Linux入门_1
- python 入门练习笔记_1
- Machine Learning3——LDA算法(一种经典的线性学习方法)
- 机会来了!股票大盘指数顽强翻红,未来投资主线一阵见血
- 远程服务器无法复制粘贴
- Java编程之CSV文件导入与导出的实现
- Vector
- 从零开始入门密码学_1
- CAN总线简单介绍
- GirdView控件绑定数据源,自动生成列
- 分布式搜索引擎ElasticSearch+kibana+marvel+sense安装
- python 实例(利润)
- vim鼠标模式打开与关闭
- 界面内嵌多种卡片视图(ViewPager、RadioGroup)
- 2D图像中点的旋转
- vue那点事儿