我正在使用C语言编写密码项目。我必须编写具有多个加密/解密目的的9个函数。该函数应该能够读取'message.txt'文件中的文本,加密/解密消息(取决于用户输入),然后将结果写入函数创建的新“code.txt”文件中。用户将给出他想要的密钥(谱号)和模式(密码/解密),并且该函数将基于另一个遵循Vigenère方法的密码/解密函数来执行。这是我的代码,(有些部分是西班牙语,对不起)首先是密码/解密的函数,然后是文件读/写一个然后是main()。 (IF MODE == 0 FUNCTION DECIPHERS)。
#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);
}
此函数可以正确地加密/解密,但当它尝试在“code.txt”文件中写入结果时,它不会写出之前给出的相同的加密/解密字符。
如何更正此问题,以便将更改的相同字符写入'code.txt'文件? 谢谢。 (如果您需要翻译成英文的话,请告诉我。)
答案 0 :(得分:0)
strlen
使用第一个'\0'
来确定长度。因此,strlen
可能会错误地缩短加密字符串。
所以你需要一个其他的字符串表示,考虑存储大小的字节块。