C 破坏简单的异或加密

C 破坏简单的异或加密,c,encryption,cryptography,C,Encryption,Cryptography,Bruce Schneier在其著作《应用密码学》中为简单XOR加密方法提供了以下加密/解密程序: /* Usage: crypto key input_file output_file */ #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { FILE *fi, *fo; char *cp; int c; i

Bruce Schneier在其著作《应用密码学》中为简单XOR加密方法提供了以下加密/解密程序:

/* Usage:  crypto key input_file output_file */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
        FILE *fi, *fo;
        char *cp;
        int c;

        if ( ( cp = argv[1] ) && *cp!='\0') {
                if ((fi = fopen(argv[2], "rb")) != NULL ) {
                        if ((fo = fopen(argv[3], "wb")) != NULL ) {
                                while ((c = getc(fi)) != EOF ) {
                                        if ( !*cp ) cp = argv[1];
                                        c ^= *(cp++);
                                        putc(c, fo);
                                }
                                fclose(fo);
                        }
                        fclose(fi);
                }
        }
        return 0;
}
输入文件内容为:ThisisSimpleEnglishTest

结果是:

hexdump OUTPUT
0000000 1c 0d 05 1f 06 1b 04 1f 05 02 18 09 09 09 01 0f
0000010 09 05 1f 07 1c 00 1f 18 45
0000019
对密文副本执行移位并对其进行异或运算,我得到:

/断键输出

Displacement[1] %=13.33 8/21
Displacement[2] %=7.14 6/21
Displacement[3] %=4.76 5/21
Displacement[4] %=2.86 4/21
Displacement[5] %=13.33 8/21
Displacement[6] %=2.86 4/21
Displacement[7] %=2.86 4/21
Displacement[8] %=10.00 7/21
Displacement[9] %=2.86 4/21
Displacement[10] %=13.33 8/21
Displacement[11] %=10.00 7/21
Displacement[12] %=4.76 5/21
Displacement[13] %=0.00 1/21
Displacement[14] %=2.86 4/21
Displacement[15] %=1.43 3/21
Displacement[16] %=0.00 1/21
Displacement[17] %=0.00 1/21
Displacement[18] %=0.00 0/21
Displacement[19] %=0.00 1/21
Displacement[20] %=0.00 0/21

请注意,关键帧大小为5。但我没有得到文本中描述的接近6%的任何结果。

您是否尝试了Schneier在一些实际数据上描述的过程?即使这是一个有趣的问题,您也应该展示您的尝试以及遇到的问题,而不是要求完整的代码实现。。。Bruce在这里提供了足够的信息来制作一个小程序。嗨,伙计们,刚刚添加了更多的信息。嗨,你能展示一下
break\u key
的代码吗(我想第一个提供的是
简单的异或
)?请注意,Bruce说您应该得到大于6的值,因此“6或更多”,不一定接近6。此外,您可能会产生边界效应:您的输出长度为25字节,而您的输入长度为24字节。最后一个字节实际上是T(来自测试)或XOR L(来自helLo)。似乎在输入的末尾有一个
\n
,用ASCII编码为0x0A,O是0x4F:0x0A XOR 0x4F=0x45(您的最后一个字节)。因此,
21
从何而来?
Displacement[1] %=13.33 8/21
Displacement[2] %=7.14 6/21
Displacement[3] %=4.76 5/21
Displacement[4] %=2.86 4/21
Displacement[5] %=13.33 8/21
Displacement[6] %=2.86 4/21
Displacement[7] %=2.86 4/21
Displacement[8] %=10.00 7/21
Displacement[9] %=2.86 4/21
Displacement[10] %=13.33 8/21
Displacement[11] %=10.00 7/21
Displacement[12] %=4.76 5/21
Displacement[13] %=0.00 1/21
Displacement[14] %=2.86 4/21
Displacement[15] %=1.43 3/21
Displacement[16] %=0.00 1/21
Displacement[17] %=0.00 1/21
Displacement[18] %=0.00 0/21
Displacement[19] %=0.00 1/21
Displacement[20] %=0.00 0/21