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