1

这是我用 C 语言编写的一个函数,它使用 linux 控制台“cat”命令运行,你将一个 txt 文件传递​​给它,然后告诉函数你想要“编码”还是“解码”,然后是密码。它会产生一个“加密” ' 只能(几乎)通过以加密文件作为输入并解码+正确密码作为参数再次运行程序来解密该文件...

您可以像这样通过Linux机器上的命令控制台运行此代码

cat your_txt_file | ./ThisProgram encode password > encoded_file

cat encoded_file | ./ThisProgram decode password > decoded_file

这个“应该有时”确实会产生两个 txt 文件,encoded_file / decoded_file。

您应该看到 your_txt_file 和 decoded_file 之间没有区别

int main(int argc, char *argv[]) {
    char buffer;
    char *pw = argv[2];
    int ptrpw = 0;
    int code = 0;


    if (strcmp(argv[1], "encode") == 0) {
        code=  cumSumCrypt(pw, code);

        while ( scanf("%c", &buffer) != EOF ) {
            printf("%c", (((int)buffer + code) % 256));
        }
    }



    if (strcmp(argv[1], "decode") == 0) {
        code= cumSumCrypt(pw, code);

        while ( scanf("%c", &buffer) != EOF ) {
            printf("%c", (256 + ((int)buffer - code)) % 256);

        }
    }

    return 0;
}


int cumSumCrypt(char *pw, int sum){
    int i;

    for(i = 0; i < sizeof pw; i++){
        sum +=(int) pw[i];
    }
    return sum;
}

问题是有时我运行程序时,它产生的中间文件..加密的有时不是txt文件,但它仍然可以通过解密并且最终输出很好..所以程序实现了它目的,但我在大学里询问过,在谷歌等上看过,找不到任何人可以解释这种奇怪的行为。

它产生的加密文件是否可以在.txt中打开取决于你给它的密码,我发现给它'hl'作为pw会使加密文件不合格,但仍然可以打开这是WAI,但是 'hello' 作为 pw 会生成一个我无法打开的文件......但仍然可以通过控制台中的 'cat' 并解密它而不会出错。

程序本身对输入文件中的每个字符进行 Caeser 移位,移位的大小是密码字符的总和,在将 txt 文件的字符添加到总和后以 256 为模。

4

1 回答 1

2

名义上,文本文件必须以换行符结尾。您的程序不确保文件末尾有换行符,因此它并不总是生成文本文件。事实上,它可能会在 256 次(或者可能是 255 次;你对空字节做什么?)。大多数 Unix 程序对最后一行并不那么挑剔,但有些是。

因此,如果这是文本文件的定义,那么您不生成一个文件也就不足为奇了。

在任何情况下,中间文件都可能包含一大堆字符,使其看起来不像文本文件——当然,这取决于密码。您使用密码为凯撒班次生成一个值。这意味着您的大部分字母字符将被转移到非字母位置。这对于加密程序来说是相当正常的。它产生伪随机乱码作为输出,并从中重新生成原始内容。如果您愿意,您可以安排仅提供字母或字母数字字符之间的映射,不映射标点符号和空格。您必须查看如何生成此类代码,但肯定可以完成,为您留下文本文件输出以供文本文件输入。

$ cat input
This is the input data for the encryption program.
It consists of two shortish lines.
$ edc encode password < input > output
$ odx output
0x0000: C7 DB DC E6 93 DC E6 93 E7 DB D8 93 DC E1 E3 E8   ................
0x0010: E7 93 D7 D4 E7 D4 93 D9 E2 E5 93 E7 DB D8 93 D8   ................
0x0020: E1 D6 E5 EC E3 E7 DC E2 E1 93 E3 E5 E2 DA E5 D4   ................
0x0030: E0 A1 7D BC E7 93 D6 E2 E1 E6 DC E6 E7 E6 93 E2   ..}.............
0x0040: D9 93 E7 EA E2 93 E6 DB E2 E5 E7 DC E6 DB 93 DF   ................
0x0050: DC E1 D8 E6 A1 7D                                 .....}
0x0056:
$ edc decode password < output > copy
$ cmp input copy
$ edc encode AAAA < input > output.AAAA
$ odx output.AAAA
0x0000: 58 6C 6D 77 24 6D 77 24 78 6C 69 24 6D 72 74 79   Xlmw$mw$xli$mrty
0x0010: 78 24 68 65 78 65 24 6A 73 76 24 78 6C 69 24 69   x$hexe$jsv$xli$i
0x0020: 72 67 76 7D 74 78 6D 73 72 24 74 76 73 6B 76 65   rgv}txmsr$tvskve
0x0030: 71 32 0E 4D 78 24 67 73 72 77 6D 77 78 77 24 73   q2.Mx$gsrwmwxw$s
0x0040: 6A 24 78 7B 73 24 77 6C 73 76 78 6D 77 6C 24 70   j$x{s$wlsvxmwl$p
0x0050: 6D 72 69 77 32 0E                                 mriw2.
0x0056:
$ file output.AAAA
output.AAAA: data
$ edc decode AAAA < output.AAAA > copy.AAAA
$ cmp input copy.AAAA
$

你的cumSumCrypt()函数有问题:

int cumSumCrypt(char *pw, int sum){
    int i;

    for(i = 0; i < sizeof pw; i++){
        sum +=(int) pw[i];
    }
    return sum;
}

sizeof意味着您使用 4 或 8 个字节的密码,如果密码字符串不是那么长,这预示着不好。你可能已经strlen(pw)想到了。

使用scanf()printf()读取单个字符有点矫枉过正。的功能getchar(),并putchar()会处理得一样整齐。

您的代码应该在使用它们之前检查您是否提供了至少两个命令行参数(或恰好两个命令行参数)。使用零个或一个参数运行,您的代码将崩溃。

像这样:

#include <stdio.h>
#include <string.h>

int cumSumCrypt(char *pw);

int main(int argc, char *argv[])
{
    int c;
    int code;

    if (argc != 3)
    {
        fprintf(stderr, "Usage: %s {encode|decode} password\n", argv[0]);
        return 1;
    }

    code = cumSumCrypt(argv[2]);

    if (strcmp(argv[1], "encode") == 0)
    {
        while ((c = getchar()) != EOF)
            putchar((c + code) % 256);
    }

    if (strcmp(argv[1], "decode") == 0)
    {
        while ((c = getchar()) != EOF)
            putchar((256 + (c - code)) % 256);
    }

    return 0;
}

int cumSumCrypt(char *pw)
{
    size_t sum = 0;
    for (size_t i = 0; i < strlen(pw); i++)
        sum += pw[i];
    return sum % 256;
}
于 2013-09-08T06:13:06.940 回答