gpt4 book ai didi

c - 用模数在 C 中移动字符,输出到文件在一个输入上产生不受支持的文件格式,在另一个输入上产生 txt 文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:22:50 26 4
gpt4 key购买 nike

这是我用 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' 作为密码会使加密文件不合格,但仍然可以打开它是 WAI,但是作为 pw 的“你好”生成了一个我无法打开的文件...但仍然可以通过控制台中的“cat”并解密它而不会出错。

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

最佳答案

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

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

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

$ 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;
}

关于c - 用模数在 C 中移动字符,输出到文件在一个输入上产生不受支持的文件格式,在另一个输入上产生 txt 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18680810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com