解密单字节异或密文

2020-06-21 20:42:34

加密是对消息进行编码的过程,使其只能被目标方读取和理解。从加密的邮件中提取原始邮件的过程称为解密。加密通常使用相关各方同意的密钥(称为加密密钥)对原始消息进行加扰。

加密算法的强度取决于在不知道加密密钥的情况下提取原始消息的难度。通常,这取决于密钥中的位数-密钥越大,解密加密数据所需的时间就越长。

在本文中,我们将使用一个非常简单的密码(加密算法),它使用一个字节大小的加密密钥,并尝试在不知道加密密钥的情况下解密密文并检索原始消息。上面定义的问题陈述基于加密方案集1挑战3。

单字节XOR密码算法使用1字节大小的加密密钥-这意味着加密密钥可以是一个字节的256个可能值之一。现在,我们将详细了解此密码的加密和解密过程。

作为加密过程的一部分,按字节迭代原始消息,并将每个单字节b与加密密钥进行异或运算,所得到的字节流再次被转换回字符并发送给另一方。这些加密的字节不需要在通常的可打印字符中,并且理想情况下应该解释为字节流。以下是加密过程的基于python的实现。

def(text:bytes,key:int)->;bytes:";";";给定一个纯文本`text`作为字节,一个加密密钥`key`作为范围[0,256]中的一个字节,该函数通过对所有字节和`key`执行异或来加密文本,并返回结果。";";";返回字节([b^key for b in text])。

例如,我们可以尝试使用加密密钥69对纯文本ABCD进行加密,并根据算法对给定的纯文本执行按字节异或。对于字符a,字节(即ASCII值)是97,当与69异或得到字符等效值为$的36时,类似地,对于b,加密字节是';,对于c,它是&;,对于d,它是!。因此,当使用单字节XOR密码和加密密钥69对ABCD进行加密时,结果密文(即加密消息)是$';&;!。

解密是在给定加密密钥的情况下从加密密文中提取原始消息的过程。XOR有一个属性-如果a=b^c,则b=a^c,因此解密过程与加密完全相同,即我们按字节迭代加密消息,并用加密密钥对每个字节进行XOR操作-结果将是原始消息。

因为加密和解密都有完全相同的实现-我们将密文传递给上面定义的函数Single_byte_xor,以获取原始消息。

当我们必须恢复给定密文的原始消息并且不知道加密密钥时,事情变得非常有趣;尽管我们知道加密算法。

作为一个纯文本示例,我们以二战期间通过德国军事无线电网络发送的最后几条消息为例。这些消息被英国军队截获并解密。在战时,这些信息是使用Enigma机器加密的,艾伦·图灵著名地破解了用于加密德国信息的Enigma Code(类似于加密密钥)。

在本文中,我们将不使用Enigma Code对消息进行加密,而是使用单字节XOR密码,并尝试在不知道任何加密密钥的情况下恢复原始消息。

这里,我们假设要加密的原始消息是一个真正的英语小写句子。我们要尝试解密的密文可以如下所示。

英国军队于5月6日下午14时进入库克斯黑文,从现在起,所有无线电通讯将停止,祝你一切顺利。lt kunkel.';单字节_xor(纯文本,密钥)b';0;&;!:r&;=";!r7<;&;7 76r1\';*:3$7<;r3&;rcfbbr=<;rdr?3+r\x7fr4=?r<;=%r=<;r3>;>;r 36;=r&;344;1r%;>;>;r173!7r\x7fr%;!:;<;5r+=\';r3>;>;r&;:7r07!&;|r>;&;r9\';<;97>;|';

可能的加密密钥数量非常有限-准确地说是256个-我们可以非常方便地采用暴力方法,并尝试用每个密钥来解密密文。因此,我们开始迭代范围[0,256)中的所有密钥,并解密密文,看看哪一个与原始消息最相似。

在上面的图示中,我们看到通过密钥82解密的消息实际上是我们的原始消息,而其他检索到的纯文本看起来是混乱的和垃圾的。视觉上做到这一点非常容易;作为人类,我们能够理解熟悉,但计算机如何识别这一点呢?

我们需要一种方法来量化文本与真正的英语句子的接近程度。解密的文本越接近真正的英语句子,它就越接近我们原来的纯文本。

我们之所以能这样做,只是因为我们的假设--原始的纯文本是一个真正的英语句子。

字母频率是字母表中字母在书面语言中平均出现的次数。在英语语言中,字母a的出现频率是8.239%,而b的出现频率是1.505%,这意味着在用英语写的百个字母中,字母a出现的平均次数为8.239%,而b出现的次数为1.505%。其他信件的信件频率(以百分比为单位)如下所示。

发生_英语={';a';:8.2389258,';b';:1.5051398,';c';:2.8065007,';d';:4.2904556,';e';:12.813865,';f';:2.2476217,';g';:2.0327458,';h';:6.1476691,';i';:6.1476691,';j';:0.1543474,';k';:0.7787989,';l';:4.0604477,';m';:2.4271893,';n';:6.8084376,';o';:7.5731132,';p';:1.9459884,';q';:0.0958366,';r';:6.0397268,';s';:6.3827211,';t';:9.1357551,';u';:2.7822893,';v';:0.9866131,';w';:2.3807842,';x';:0.1513210;y';:1.9913847,#39;z';:0.0746517}。

这种字母频率分析是语言识别的一种基本方法,在这种方法中,我们可以看到文本的当前字母频率分布是否与英语语言的平均字母频率分布相匹配。Etain shrdlu是英语中最常用的12个字母的大致频率顺序。

下图显示了使用从79到84的加密密钥解密明文的字母频率分析。

在上图中,我们可以清楚地看到加密密钥82的字母频率分布与英语语言的分布有多匹配。现在我们的假设成立了,我们需要一种方法来量化这个度量,我们称之为如果拟合商。

拟合商是表示两个字母频率分布匹配程度的度量。启发式地,我们将拟合商定义为文本中字母的频率与英语中相应字母的绝对差值(以百分比表示)的平均值。因此,拟合商的值越小,意味着文本越接近英语。

上面定义的拟合商的基于Python的实现如下所示。该函数首先计算文本中每个字母的相对频率,然后取两个分布之间的绝对差值的平均值。

dist_english.values()def(text:bytes)->;Float:";";";给定字节流`text`,该函数计算`text`的字母频率分布与英语语言的字母频率分布的拟合商。此函数返回`text`中字母的频率与英语中相应字母之间的绝对差值的平均值(以百分比表示)。";";";COUNTER=COUNTER(TEXT)dist_text=[(coun.get(order(Ch),0)*100)/len(Text)for ch in ococance_english]return sum([abs(a-b)for a,b in zip(dist_english,dist_text)])/len(Dist_Text)。

现在我们已经有了直接从给定密文中获取明文所需的一切,我们将其包装在一个函数中,该函数迭代范围[0,256)中的所有可能的加密密钥,解密密文,计算明文的拟合商并将商最小化的那个作为原始消息返回。该解密逻辑的基于Python的实现如下所示。

def(text:bytes)->;Tuple[bytes,int]:";";";";该函数使用单字节XOR对加密文本进行解密,并返回原始纯文本消息和加密密钥。";";";";Original_Text,ENCRYPTION_KEY,MIN_fq=NONE,NONE,NONE对于范围(256)中的k:#我们使用加密密钥`k`_text=single_byte_xor(text,k)#我们计算此解密明文的拟合商_fq=COMPUTE_FIFTING_QUTINENT(_TEXT)#如果此生成的明文的拟合商小于目前看到的最小值`min_。如果min_fq为NONE或_fq<;min_fq:ENCRYPTION_KEY,Original_Text,min_fq=k,_Text,_fq#返回具有最小拟合商的文本和密钥返回Original_Text,Encryption_Key。

该方法还针对100个使用随机加密密钥的随机英语句子进行了测试,结果发现,这种解密技术对所有样本都表现良好。如果句子很短或包含很多符号,这种方法就会失败。整个解密过程的源代码可以在Jupyter笔记本上找到,地址是arPitbhayani.me/decpher-Single-byte-xor。