从零开始入门密码学_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}  

如果我们可以接触到这个加密过程,通过测试给定的明文,得到密文之后,进行频率对比就很容易得到加密密钥了。

如果我们无法接触到这个加密过程,我们也可以把给定密文的字母出现频率和经验中的字母出现频率做一定对比,我们也可以通过尝试逐步破解。

原创粉丝点击