代换密码的密码分析—详细分析过程

article/2025/10/4 0:40:24

代换密码的密码分析

使用单表代换密码,对于给出的密文进行分析并得到结果,了解加密解密过程

密文信息如下:AHNFCROACOAHNISEFLCIASFVCNWOSEAHNWSRLDWCAHCEIRNTONDATRCFFOSEOANNLTEDTLUMCEUMFRSMAHNNUITETDTTEDJTPTEAHNUOWCNLDOCAOATRCFFBTASETGTCEOACAOARTDCACSETLTLLCNOTAAHNOTMNACMNCACODNMTEDCEGAHTATFRCITEISUEARCNOOUIHTORWTEDTTEDUGTEDTRNMSVNCMPSRAATRCFFOSEONISEDHTEDILSAHNOFRSMAHNUOAHTAVCNWSEAHNWSRLDCOKESWETOTMNRCITFCROATEDCAMNTEOAHTATEYSENONNETOHTVCEGMSVNDTMNRCITOIHNNONBNCATETLLYSRESACOPUECOHNDBYISEARTOAIHCETONNOCAORNLTACSEOWCAHAHNWSRLDTOBTONDSEMUAUTLRNOPNIAFTCRENOOJUOACINTEDWCEWCEISSPNRTACSETEDTCMOASOTFNGUTRDWSRLDPNTINTEDPRSMSANISMMSEDNVNLSPMNEACACOWCLLCEGASWSRKWCAHAHNRNOASFAHNWSRLDASMTKNAHNCEANRETACSETLGSVNRETEINOYOANMFTCRNRTEDMSRNRNTOSETBLNTEDBUCLDTENWAYPNSFCEANRETACSETLRNLTACSEOTEDTISMMUECAYWCAHTOHTRNDFUAURNFSRMTEKCED

对上面密码使用各种方法进行解密,得到明文信息


解密原理:

替代密码是指先建立一个替换表,加密时将需要加密的明文依次通过查表,替换为相应的字符,明文字符被逐个替换后,生成无任何意义的字符串,即密文,替代密码的密钥就是其替换表。根据密码算法加解密时使用替换表多少的不同,替代密码又可分为单表替代密码和多表替代密码。单表替代密码的密码算法加解密时使用一个固定的替换表。单表替代密码又可分为一般单表替代密码、移位密码、仿射密码、密钥短语密码。

思路步骤:

  1. 尝试使用穷举法获得明文。程序a:字母代换程序

  2. 程序实现统计密文中的英文字母频率。 程序b:字母统计程序

  3. 根据统计结果和常用字母频率表,假设字母代换的规则(1-1代换),用密文来验证假设的正确与否,若不成立,则继续假设,一直到找到明文为止。 程序a:字母代换程序

  4. 给出明文及密钥(字母代换规则表)。
    在进行实验的过程之中,我将会使用2种不同的方法来对这次实验的内容分别进行验证和解决,分别为通过大量测试的聚合算法和分别进行频率分析来对这个实验进行解决。


一、使用频率分析法进行密文分析:

    频率法就是我们对密文进行分析,只要这个内容不是特殊的内容,他固定单词的频率会出现多次,这个方法主要基于密文的量多,量多固定使用的单词频率也就会多。比如说the、and、for这些英文在英文文章中出现的频率会很多。

频率分析法主要思路:

  1. 第一步:统计出密文字母出现的各个频次;

  2. 第二步:根据密文字母出现的频次统计,确定出某些密文字母对应的明文字母是否可能是单个字母频率统计表之中的哪类字母;

  3. 第三步是利用自然语言的文字结合规律进行猜测分析,对各类单词之中字母出现的频率进行对应猜测,同时也需要利用双字母、三字母统计特性以及元音辅音的拼写知识进行猜测。

  4. 第四步就是整理我们进行猜测的明文字母,对恢复得到的明文进行整理分析。

对文本词频分析.py

# 统计频率
def getLetterList():c_file = open('c_text.txt')  # 读取文件c_text = c_file.read()  # 读取文本char_list = list(c_text)  # 转化为列表,每个字母为一个元素# 统计加密字符串中各个字母的出现次数#  Q X ZtempSet = set(char_list)  # 抓转为集合去重# 保存为字典,key:字母,value:出现次数tempDict = {}for i in tempSet:tempDict[i] = char_list.count(i)# 列表排序, 以元组形式dict_sorted = sorted(tempDict.items(), key=lambda x: x[1], reverse=True)# print(dict_sorted)frequency_list = []print("字母", "出现次数", "频率")for i in dict_sorted:print(i[0], "\t", i[1], "\t", i[1] / len(c_text))frequency_list.append(i[0])     # 按照出现频率写入到列表return frequency_listgetLetterList()

对二元英文进行词频分析.py

# 统计频率def get2WordList():c_file = open('c_text.txt')  # 读取文件c_text = c_file.read()  # 读取文本char_list = list(c_text)  # 转化为列表,每个字母为一个元素word_list2 = []temp_list = []try:for i in range(0, len(char_list)-1):temp_list.append(char_list[i])temp_list.append(char_list[i + 1])temp_str = "".join(temp_list)word_list2.append(temp_str)temp_list = []except StopIteration:print()# 统计加密字符串中各个二元字母的出现次数tempSet = set(word_list2)  # 抓转为集合去重# 保存为字典,key:字母,value:出现次数tempDict = {}for i in tempSet:tempDict[i] = word_list2.count(i)# 列表排序, 以元组形式dict_sorted = sorted(tempDict.items(), key=lambda x: x[1], reverse=True)# print(dict_sorted)frequency_list = []print("2元字母", "出现次数", "\t频率")for i in dict_sorted:print(i[0], "\t\t", i[1], "\t\t", i[1] / len(c_text))frequency_list.append(i[0])  # 按照出现频率写入到列表return frequency_listget2WordList()

对三元英文进行词频分析.py

# 统计频率def get3WordList():c_file = open('c_text.txt')  # 读取文件c_text = c_file.read()  # 读取文本char_list = list(c_text)  # 转化为列表,每个字母为一个元素word_list3 = []temp_list = []try:for i in range(0, len(char_list)-2):temp_list.append(char_list[i])temp_list.append(char_list[i + 1])temp_list.append(char_list[i + 2])temp_str = "".join(temp_list)word_list3.append(temp_str)temp_list = []except StopIteration:print()# 统计加密字符串中各个二元字母的出现次数tempSet = set(word_list3)  # 抓转为集合去重# 保存为字典,key:字母,value:出现次数tempDict = {}for i in tempSet:tempDict[i] = word_list3.count(i)# 列表排序, 以元组形式dict_sorted = sorted(tempDict.items(), key=lambda x: x[1], reverse=True)# print(dict_sorted)frequency_list = []print("3元字母", "出现次数", "\t频率")for i in dict_sorted:print(i[0], "\t\t", i[1], "\t\t", i[1] / len(c_text))frequency_list.append(i[0])  # 按照出现频率写入到列表return frequency_listget3WordList()

    通过使用上述一元、二元、三元对密文之中的英文字母出现频次进行分析,我们可以得到下面的结果,分别是单字母、双字母、三字母进行统计得到的频率:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

    在上面分别对各个代码算法得到的字母频率进行统计,得到的结果值得我们进行分析并进行字母猜测,在下面我们对得到的信息进行合理化猜测并进行验证。由此可以得到三元之中密文TED对应着英文中的and、AHN对应着the、ACS对应着tio、CSE对应着ion、SET对应着ona,继续细细向下进行分析。

    经过对词典以及各类单词进行详细的猜测分析,以及出现的频率进行统计分析,我们逐渐接近明文,因为有一些词汇为低频词汇,上面不少的词汇并未作出改变,原字母保持不变,因此,我们并未对其进行代换变化,经过分析如下所示,得到明文结果。

在这里插入图片描述

二、使用算法大量聚合进行密文分析

    这个方法的原理就是选择不同的解密密钥进行破解尝试,然后通过计算每一个解密得到的明文的适应度,也就是符合英文单词语法的程度,如果解密得到的明文越接近我们日常使用的英语文章,它的那个适应度的值就会越高,如果大多数单词不对,那么适应度就会越低。

主要思路步骤:

  1. 第一步,我们随机生成一个密钥,用它来进行代换解密,解出得到的明文m1,对明文进行适应度计算,第一个适应度为d1。

  2. 第二步,随机交换之前生成的密钥之中的两个字符,我们得到子密钥child,解密出对应的明文m2,同时计算适应度d2。

  3. 第三步,对d1、d2进行比较,如果d1 < d2,那么child成为新的密钥。

  4. 第四步,对第二步、第三步进行多次循环1000次,直到无法生成得到更高的适应度,此时得到的密钥最有可能就是我们密文的解密密钥。

  5. 第五步,通过设置一个标志量flag来对循环进行终止操作,如果当最高值不进行满足的话,我们就跳出循环,防止陷入局部最优的困境,对于生成明文的适应度主要就是对不同解密密钥进行比较,解密出来得到的明文适应度越高,密钥就越好,适应度的计算方法我们通过使用quadgram statistics来进行计算。

# -*- coding: utf-8 -*-
# __author__ = "苏柳欣"  1509995828@qq.com
# Date: 2019-11-29  Python: 2.7.16
import random            
import sys
sys.path.append('/Users/Iro/code/CodeSupport/ngram_score.py')
from ngram_score import *
from math import *
#   1.随机生成一个key,称为parentkey,用它解密得对应的明文m1,对明文计算适应度d1
#   2.随机交换parentkey中的两个字符得到子密钥child,解密出对应的明文m2并计算适应度d2
#   3.若d1<d2,则child成为新的parentkey
#   4.不断循环进行步骤2、3直到最后的1000次循环中不再有更高的适应度生成
#   5.回到1重新生成parentkey继续迭代寻找,或者由操作者终止程序
#   重新执行1,是为了防止2、3的操作使结果陷入局部最优的困境。对于生成的明文的适应度的比较
#   其实可以看作是对不同解密密钥的比较,解密出来的明文的适应度越高,对应的密钥就更好。
#   quadgram statistics的适应度计算方法ciphertext = 'AHNFCROACOAHNISEFLCIASFVCNWOSEAHNWSRLDWCAHCEIRNTONDATRCFFOSEOANNLTEDTLUMCEUMFRSMAHNNUITETDTTEDJTPTEAHNUOWCNLDOCAOATRCFFBTASETGTCEOACAOARTDCACSETLTLLCNOTAAHNOTMNACMNCACODNMTEDCEGAHTATFRCITEISUEARCNOOUIHTORWTEDTTEDUGTEDTRNMSVNCMPSRAATRCFFOSEONISEDHTEDILSAHNOFRSMAHNUOAHTAVCNWSEAHNWSRLDCOKESWETOTMNRCITFCROATEDCAMNTEOAHTATEYSENONNETOHTVCEGMSVNDTMNRCITOIHNNONBNCATETLLYSRESACOPUECOHNDBYISEARTOAIHCETONNOCAORNLTACSEOWCAHAHNWSRLDTOBTONDSEMUAUTLRNOPNIAFTCRENOOJUOACINTEDWCEWCEISSPNRTACSETEDTCMOASOTFNGUTRDWSRLDPNTINTEDPRSMSANISMMSEDNVNLSPMNEACACOWCLLCEGASWSRKWCAHAHNRNOASFAHNWSRLDASMTKNAHNCEANRETACSETLGSVNRETEINOYOANMFTCRNRTEDMSRNRNTOSETBLNTEDBUCLDTENWAYPNSFCEANRETACSETLRNLTACSEOTEDTISMMUECAYWCAHTOHTRNDFUAURNFSRMTEKCED'
parentkey = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
sss = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
# 上面将密文存入变量中,在设定一个目前的字符替换标准
# 下面的key就是用来声明字典key
key = {'A':'A'}
# 导入quadgrams.txt文本来进行适应度分析计算
fitness = ngram_score('/Users/Iro/code/CodeSupport/quadgrams.txt')  
parentscore = -99e9
maxscore = -99e9
j = 0
flag = 1
print('开始进行密文分析 QAQ ')
while flag:j = j + 1random.shuffle(parentkey)       # 进行随机打乱for i in range(len(parentkey)):      key[parentkey[i]] = chr(ord('A') + i)decipher = ciphertextfor i in range(len(decipher)):decipher = decipher[:i] + key[decipher[i]] + decipher[i + 1:]parentscore = fitness.score(decipher)count = 0 while count < 1000:  # 进行1000次的适应度计算,预计会达到峰值'''  下面是进行适应度的计算的比较  '''a = random.randint(0,25)       # 适应度的计算与比较b = random.randint(0,25)child = parentkey[:]child[a], child[b] = child[b], child[a]childkey = {'A':'A'}  for i in range(len(child)):childkey[child[i]] = chr(ord('A') + i)decipher = ciphertextfor i in range(len(decipher)):decipher = decipher[:i] + childkey[decipher[i]] + decipher[i+1:]score = fitness.score(decipher)if score > parentscore:         # 当此时的适应度大于之前适应度,我们就进行赋值操作parentscore = scoreparentkey = child[:]count = 0count = count + 1if parentscore > maxscore:       # 这里对最大的适应度的值进行输出,当适应度不再maxscore = parentscore       # 进行增长的时候,我们将标志符号flag设置为0,结束maxkey = parentkey[:]for i in range(len(maxkey)):key[maxkey[i]] = chr(ord('A') + i)decipher = ciphertextfor i in range(len(decipher)):decipher = decipher[:i] + key[decipher[i]] + decipher[i+1:]     print("目前使用密钥: " + ''.join(maxkey))print("              " + sss)print("\n")print("明  文: " + decipher.lower())print("\n")else:flag = 0ss = decipher.lower()
'''下面的操作是导入英文段的分割的语料库,对上面得到的明文段进行添加空格分割
'''
words = open("/Users/Iro/code/CodeSupport/words-by-frequency.txt").read().split() # 有特殊字符的话直接在其中添加
wordcost = dict((k, log((i+1)*log(len(words)))) for i,k in enumerate(words))
maxword = max(len(x) for x in words)def infer_spaces(s):def best_match(i):candidates = enumerate(reversed(cost[max(0, i-maxword):i]))return min((c + wordcost.get(s[i-k-1:i], 9e999), k+1) for k,c in candidates)cost = [0]for i in range(1,len(s)+1):c,k = best_match(i)cost.append(c)out = []i = len(s)while i>0:c,k = best_match(i)assert c == cost[i]out.append(s[i-k:i])i -= kreturn " ".join(reversed(out))print("添加空格后明文为:" + infer_spaces(ss))

    经过上面代码的分析计算,我们得到的结果如下,我的代码在后面还运用了NLP自然语言处理的方式,对生成的代码进行分词,最后自动得到符合语法的英文明文,但是还是有一些小错误,需要手动进行合理更改。

在这里插入图片描述

    对了对了,上面代码不能直接跑,还需要导入一些支持包,我已经上传CSDN下载了,可以在这里下载


http://chatgpt.dhexx.cn/article/yrt0rJ2x.shtml

相关文章

密码分析之单表代换原理详解与算法实现

【密码分析&#xff08;单表代换&#xff09;】 1. Equipment &#xff08;1&#xff09; operating system version &#xff1a;WIN 10 &#xff08;2&#xff09; CPU instruction set: x 64 &#xff08;3&#xff09; software&#xff1a;MATLAB R2020a 2.process P…

搞懂差分密码分析,看这篇文章就够了!!

搞懂差分密码分析&#xff0c;这篇文章就够了&#xff01;&#xff01; 关注我&#xff01;我会不定期发一些学习信安的心得体会 文章目录 **搞懂差分密码分析&#xff0c;这篇文章就够了&#xff01;&#xff01;**一、概述二、流密码的线性特性三、差分分析四、toy cipher-差…

线性密码分析(简单笔记)

线性密码分析(简单笔记) 关于差分密码分析的可以看差分密码分析读书报告。欢迎大家讨论留言。 1、发现 在1993年的欧洲密码年会上&#xff0c;日本学者Matsui提出了对DES算法的一种新的攻击方法&#xff0c;即线性密码分析.同年的国际密码年会上&#xff0c;Matsui发现了DES…

密码分析

破译密码体制的一般思路 经典密码分析 古典密码分析可以理解为从密文y中得到明文x&#xff0c;或者是密钥k。密码分析可以分为两类&#xff1a;一类是发现加密方法内部结构的分析攻击&#xff0c;一类是将加密算法看作是黑盒&#xff0c;试图测试所有可能密钥进行破解蛮力攻击…

密码分析(一):差分密码分析

文章目录 一、选择明文攻击&#xff08;chosen-plaintext attack, CPA&#xff09;二、差分密码分析&#xff08;differential cryptanalysis&#xff09;1.原理2.过程2.1 S盒差分分布表2.2 S盒的差分分析 总结参考文献 差分分析是一种选择明文攻击&#xff0c;其基本思想是&am…

密码分析(二):线性密码分析

​ 线性密码分析 一、已知明文攻击&#xff08;known-plaintext attack&#xff09;二、线性密码分析基本原理三、实例3.1 S盒线性逼近表3.2 例题分析3.2.1 分析算法的过程3.2.2 攻击过程加密攻击分析 具体过程 总结参考文献 在1993年欧洲密码年会上&#xff0c;日本学者Matsu…

Bluehost注册流程与问题

Bluehost注册流程与问题 第一步 进入Bluehost官方网站&#xff0c;点击下图中粉色的 Sign Up Now 进行注册 第二步 进入下一个界面后&#xff0c;你可以免费获得一个新的域名&#xff0c;BlueHost 对第一年是免费赠送一个域名&#xff0c;所以输入你想要的域名&#xff0c;然后…

BlueHost主机从零开始使用笔记,我踩过的坑你就不要踩了.

一:购买时,使用官方优惠码BH可以优惠30% 二:登陆后:点击可以显示你购买的主机,点击列表中的域名即可进入管理界面! 三:特别提醒!面板中的部分功能"比如在线文件 管理上传文件",只有使用chrome浏览器才可以,使用360浏览器的时候会出现上传不了的情况. 这里就是坑1 …

hosts文件 (屏蔽网站)

hosts文件 hosts文件是什么 Hosts是一个没有扩展名的系统文件&#xff0c;可以用记事本等工具打开。它是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”&#xff0c;当用户在浏览器中输入一个需要登录的网址时&#xff0c;系统会首先自动从Hosts文件中寻找对应…

2018年最新bluehost主机(中文站)购买教程,送30%优惠码!

Bluehost是一家老牌的美国主机商&#xff0c;行业经验达18年&#xff0c;以稳定性强&#xff0c;速度快著称&#xff0c;是国内使用较多主机之一&#xff0c;在个人站长中的口碑、使用流行度都很高。作为电子商务首选主机的BlueHost主机也深受国内外贸网站、仿牌产品等公司的喜…

bluehost虚拟主机有什么用?适合做什么网站呢?

bluehost作为比较知名的美国主机商&#xff0c;在国内也是非常的受欢迎&#xff0c;并且为了更好的服务国内用户&#xff0c;更是推出了中文站以及中文客服&#xff0c;为 国内用户提供更加本土化以及更加完善的服务&#xff0c;而且而且其机房专门对国内线路进行了优化&#x…

siteground主机和Bluehost主机哪个好,看完这篇你就有自己确定的答案

Siteground主机和Bluehost主机&#xff0c;哪个更好&#xff1f;哪个更适合外贸建站&#xff1f;读完这篇&#xff0c;你就有答案&#xff01; 说实话......我花了太多的时间来做决定。在决定买什么相机、加入什么健身房、甚至选择什么衣服时&#xff0c;都是如此。我花了一下…

linux虚拟主机建站程序,bluehost中国Linux虚拟主机建站过程

无论是我们初次接触海外主机服务商的&#xff0c;还是已经有过使用国内主机商建站经验的&#xff0c;可能初次接触BlueHost(无论是英文或者是中文官方网站产品)可能在应用上稍微有一些困惑。 因为大部分海外主机都使用的cPanel面板(Linux系统主机)&#xff0c;普通的用户肯定是…

蓝色主机 bluehost主机 启用CloudFlare的cdn加速服务

启用CloudFlare的cdn加速服务 1.到CDN官网&#xff08;www.cloudflare.com&#xff09;&#xff0c;注册账号并登陆进入。 2.点击页面右上角 Add Site,输入您的域名。 3.选择CDN套餐&#xff0c;一般用户选择FREE版本的 4.修改DNS记录&#xff0c;选择之后会自动扫描域名的DNS…

Siteground和Bluehost对比,我花了7天时间研究出了结果

Siteground主机和Bluehost主机&#xff0c;哪个更好&#xff1f;哪个更适合外贸建站&#xff1f;读完这篇&#xff0c;你就有答案&#xff01; 说实话......我花了太多的时间来做决定。在决定买什么相机、加入什么健身房、甚至选择什么衣服时&#xff0c;都是如此。我花了一下…

美国主机BlueHost vs HostEase

网站备案对于大部分个人站长而言&#xff0c;花费成本高、程序复杂&#xff0c;因此在挑选主机时&#xff0c;常选择免备案IDC服务商&#xff0c;如美国、香港主机&#xff0c;且前几日国内某免备案机房因个别网站涉及非法言论而配合相关部门采取停网整顿等&#xff0c;为此站长…

BlueHost主机建站教程

BlueHost主机支持一键安装WordPress程序与Discuz程序&#xff0c;下面就给大家演示一下如何一键安装WordPress程序和Discuz程序建站教程&#xff0c;希望对使用BlueHost主机用户有所帮助&#xff01; 腾讯云最新服务器活动--云服务器免费送。 试用领取有人能领到180天。 腾讯…

Bluehost主机安装WordPress步骤

教你一个使用Bluehost主机安装WordPress步骤 使用bluehost主机创建wordpress网站非常简单&#xff0c;但是首先需要先注册bluehost账户。 作为优秀wordpress主机之一的bluehost主机&#xff0c;性价比是很不错的&#xff0c;价格几乎接近免费了&#xff0c;它有很多出色的功能…

bluehost虚拟主机速度快吗?bluehost主机评测!

bluehost虚拟主机速度快吗&#xff1f;众所周知&#xff0c;美国主机访问一般都是有延迟的&#xff0c;理论上是220ms&#xff0c;主机的访问速度与机房位置&#xff0c;连接线路等都有很大关系。 优越的机房硬件加上软件加速的实力&#xff0c;使bluehost虚拟主机的速度在海外…

Bluehost中国的主机产品和美国那边的主机有什么差别吗?

bluehost作为著名的美国主机商&#xff0c;为了更好的服务国内用户&#xff0c;与2014年推出了bluehost中文站,bluehost中国作为bluehost美国主机商在国内的独立运营部分&#xff0c;主要是为国内用户提供域名、虚拟主机、分销主机、VPS主机、独立服务器和网站建设等。bluehost…