C 文件写入窃听

C 文件写入窃听,c,file,C,File,我在用C语言做一个密码项目。我必须编写9个具有多重加密/解密目的的函数。此函数应该能够读取“message.txt”文件中的文本,对消息进行加密/解密(取决于用户输入),然后将结果写入函数创建的新“code.txt”文件中。用户将给出一个密钥(clef)和他想要的模式(密码/解密),该函数将基于另一个函数执行,该函数按照Vigenère方法进行加密/解密。这是我的代码,(很抱歉,有些部分是西班牙语的)首先是加密/解密的函数,然后是文件读/写函数,然后是main()。(如果模式==0函数解密) #

我在用C语言做一个密码项目。我必须编写9个具有多重加密/解密目的的函数。此函数应该能够读取“message.txt”文件中的文本,对消息进行加密/解密(取决于用户输入),然后将结果写入函数创建的新“code.txt”文件中。用户将给出一个密钥(clef)和他想要的模式(密码/解密),该函数将基于另一个函数执行,该函数按照Vigenère方法进行加密/解密。这是我的代码,(很抱歉,有些部分是西班牙语的)首先是加密/解密的函数,然后是文件读/写函数,然后是main()。(如果模式==0函数解密)

#包括
#包括
int vigenereCipher(字符*链、字符*键、字符*代码、int模式)
{
int i=0,c=0;
如果(模式!=0){
对于(;i%s\n”,链,代码);
如果(*chaine==*chaine){
printf(“\n0\n”);
}否则{
printf(“\n1\n”);
}
}
int encryptTextFile(字符*密钥,int模式)
{
碳链[99999];
字符代码[99999];
int i;
文件*archivo1,*archivo2;
archivo1=fopen(“message.txt”、“r”);
archivo2=fopen(“code.txt”,“w”);
fscanf(档案1,“%s”,链);
vigenereCipher(链、键、代码、模式);
对于(i=0;i
此函数可以正确地进行加密/解密,但当它尝试将结果写入“code.txt”文件时,它不会写入与以前相同的加密/解密字符

如何更正此错误,使其将更改后的相同字符写入“code.txt”文件?
非常感谢。(如果您需要翻译成英语,请告诉我。)

strlen
使用第一个
'\0'
来确定长度。因此,
strlen
可能会错误地缩短加密字符串


因此,考虑到存储大小的字节块,您需要另一种字符串表示。

chiffrementVigenere
中,您在哪里终止生成的字符串?您的代码从MSVC生成6个编译器警告。三个问题涉及有符号/无符号整数比较。有人建议,
get
已经过时了。两个函数建议函数在应该返回的时候不返回任何值。请启用所有编译器警告。
请启用所有编译器警告
并在继续之前解决这些问题。您不检查
fopen
fscanf
是否成功。如果他们失败了,你将和垃圾一起工作。另外,
fscanf
中的
%s
必须对其读取量有一个限制,或者最好使用
fgets
,否则会有缓冲区溢出的风险。与
get
类似的问题,请改用
fgets
。制造荒谬的巨大静态缓冲区并不能阻止这一点,4096应该是您需要的最大的(最大的典型磁盘块)。当然,如果您一次只读取一个字符,对其进行密码运算,然后立即将其写出,您就不会担心
fgets
fprints
。维格纳不是一个方块密码,而是一个角色密码。如果您想缩短代码,还可以研究模运算符
%
,非常感谢,我已经解决了这些问题,还有文件编写错误。
#include <string.h>
#include <stdio.h>

int vigenereCipher(char *chaine, char *key, char *code, int mode)
{
    int i = 0, c = 0;

    if (mode != 0) {
        for (; i < strlen(chaine); i++) {
            if (chaine[i] + key[c] < 256) {
                code[i] = chaine[i] + key[c];
                c += 1;
            } else {
                code[i] = chaine[i] + key[c] - 256;
                c += 1;
            }

            if (c == strlen(key)) {
                c = 0;
            }
        }
    } else {
        for (; i < strlen(chaine); i++) {
            if (chaine[i] - key[c] < 0) {
                code[i] = chaine[i] - key[c];
                c += 1;
            } else {
                code[i] = chaine[i] - key[c] + 256;
                c += 1;
            }

            if (c == strlen(key)) {
                c = 0;
            }
        }
    }

    printf("\n %s -> %s \n", chaine, code);
    if (*chaine == *chaine) {
        printf("\n0\n");
    } else {
        printf("\n1\n");
    }
}

int encryptTextFile(char *key, int mode)
{
    char chaine[99999];
    char code[99999];
    int i;
    FILE *archivo1, *archivo2;

    archivo1 = fopen("message.txt", "r");
    archivo2 = fopen("code.txt", "w");

    fscanf(archivo1, "%s", chaine);

    vigenereCipher(chaine, key, code, mode);

    for (i = 0; i < strlen(chaine); i++) {
        fprintf(archivo2, "%c", code[i]);
    }

    fclose(archivo1);
    fclose(archivo2);
}

int main()
{
    char key[99999];
    int mode;

    printf("Enter encryption key: ");
    gets(key);

    printf("Enter desired mode (1 or 0): ");
    scanf("%i", &mode);

    encryptTextFile(key, mode);
}