C 查找键长度

C 查找键长度,c,xor,C,Xor,简单异或解密: 为了打破这种加密,我们必须做出一些假设: 1) 密钥相当短(在我们的例子中,我们假设它小于30字节,但大于30字节) 超过3个字节) 2) 文本是纯ASCII码 3) 这篇课文是用通俗易懂的英语写的 4) 文本比密钥足够长(或者有多个文本段都使用同一密钥加密) 密钥长度说明: 如果文本是英语,我们知道最常见的字符是e、t、a、o、n、r、i、s、h、d、(…)。更具体地说,如果我们从任何文本中随机选取2个字符,我们知道它们具有相同值的概率大于6%。密钥长度小于30字节 为了确定给

简单异或解密:

为了打破这种加密,我们必须做出一些假设:

1) 密钥相当短(在我们的例子中,我们假设它小于30字节,但大于30字节) 超过3个字节)

2) 文本是纯ASCII码

3) 这篇课文是用通俗易懂的英语写的

4) 文本比密钥足够长(或者有多个文本段都使用同一密钥加密)

密钥长度说明:

如果文本是英语,我们知道最常见的字符是e、t、a、o、n、r、i、s、h、d、(…)。更具体地说,如果我们从任何文本中随机选取2个字符,我们知道它们具有相同值的概率大于6%。密钥长度小于30字节

为了确定给定的密钥长度是否正确,我们使用这些假设并将加密文本细分为与密钥长度相同大小的段。然后,将每个部分与其前面的部分进行异或运算,并计算相等值的数目。数学告诉我们,如果Ti==Tj,那么

Bi^Bj = (Ti^Kn)^(Tj^Kn)
      = (Ti^Tj)^(Kn^Kn)
      = (0)^(0)
      = 0
那么我应该有钥匙的长度。但是我怎样才能得到它呢?到目前为止,我唯一能做的就是读取二进制文件并打开二进制文件

代码:

二进制文件:


由于某些原因,我无法发布文件或发布链接,否则你们可能不知道。

我假设你们有一些数据是根据某个键进行异或的。该键具有固定的大小,并在数据长度上重复

设K为密钥,长度为K,p为包含纯文本的数组,E为包含密文的数组,然后

P[0: k-1] xor K = E[0: k-1]
P[k:2l-1] xor K = E[k:2k-1]
所以
E[0:k-1]xor E[k:2k-1]
p[0:k-1]xor p[k:2k-1]
相同,也就是说,它是两个纯文本字符串的异或。您可以根据预期某些字母在纯文本中出现的频率来计算这些值的频率,并根据这些频率对替换进行猜测

p[0:k-1]
的纯文本值构造一个猜测,然后将此猜测与
E[0:k-1]
进行异或运算将给出对k的猜测。尝试该键并进行迭代,以改进您的猜测。因为这是英语,一旦你有了元音,它应该很容易猜

要获得密钥长度,只需尝试所有可能的密钥长度k,将密码文本划分为大小k的范围和它们的异或对。请看一致的字符位置的数量。一个很好的启发是,最可能的密钥长度对应于对之间最广泛的一致性


这是有道理的。

你的问题以一句话开头,听起来好像我们应该知道你在说什么。这些数据来自哪里?这实际上是一个编程问题,还是更适合于密码术、信息安全或逆向工程论坛?在你的帖子中,唯一的问题是“我如何得到它?”指的是一些你没有命名的算法的密钥,并且你没有提供数据@DavidHoelzer它涉及基本的XOR加密/解密,这是一个额外的信用分配。@asdf3fasdf,听起来不错,但我们可能需要更多的上下文。你能完整地描述你被分配的任务吗?@BrianCain我补充了更多的描述。我希望有帮助@哈夫纳德+1,是的,你将从布鲁赫大学毕业
P[0: k-1] xor K = E[0: k-1]
P[k:2l-1] xor K = E[k:2k-1]