2

所以我试图在 C 中制作一个文件加密程序(顺便说一下,我对 C 有点陌生)所以我写了这个简单的 XOR 文件加密代码:

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

int main()
{
char fileName1[35] = {'\0'};        //Name of original file
char fileName2[35] = {'\0'};        //Name of encrypted file
char keyString[20] = {'\0'};        //Key determines result encryption
FILE* originalFile;                 //File to be encrypted
FILE* cryptedFile;                  //The encrypted file
int c;                              //byte read from original file


printf("Enter file location followed by name of the file you want to encrypt: ");
scanf("%s", fileName1);

printf("Enter file location followed by name of the encrypted file: ");
scanf("%s", fileName2);

printf("Enter your key (Encryption changes based on Key): ");
scanf("%s", keyString);

originalFile = fopen(fileName1, "rb"); //rb to read file bytes
cryptedFile = fopen(fileName2, "wb");  //wb to write bytes to file


if(originalFile != NULL && cryptedFile != NULL){
    while( (c = getc(originalFile)) != EOF ){
        int x;
        for(x=0; x<strlen(keyString); x++){
            c ^= keyString[x];
            putc(c, cryptedFile);
        }
    }
    fclose(originalFile);
    fclose(cryptedFile);
}

return 0;
}

所以为了测试这个程序,我创建了一个名为 file1.txt 的文件并运行加密程序,将第二个文件作为 file2.txt 并将密钥作为secret。然后我再次运行该程序,但这次是在加密的 file2.txt 上并创建了一个具有相同密钥secret的 file3.txt 。由于它是相同的密钥,因此 file3.txt 应该与 file1.txt 相同,但 file3.txt 中包含随机内容。那么我做错了什么?

4

5 回答 5

4

你的程序输出了太多数据;尝试检查 file1.txt、file2.txt 和 file3.txt 的大小。这个部分的问题是:

while( (c = getc(originalFile)) != EOF ){
        int x;
        for(x=0; x<strlen(keyString); x++){
            c ^= keyString[x];
            putc(c, cryptedFile);
        }
    }

有两个嵌套循环,因此每个输入字符都会执行整个内部循环。在内部循环中尝试一个新c = getc()的,如果达到 EOF,则打破两个循环,或者使用c ^= keyString[(x++) % strlen(keyString)];.

于 2012-08-03T11:52:29.233 回答
2

如果我了解您的问题;您想加密文件,方法是给它一个要写入的输出文件和一个密钥

现在,当您运行第一个文件时,它会提供一个应该是正确的输出。现在您是说,如果您对加密文件进行加密,它应该给出相同的结果?

好吧它不应该,尝试反转过程,看看是否通过两次解密最后一个文件,你应该最终得到原始文本。

于 2012-08-03T11:50:08.270 回答
0
int x = 0, keyLen = strlen(keyString);
while( (c = getc(originalFile)) != EOF ){
    c ^= keyString[x++%keyLen];
    putc(c, cryptedFile);
}
于 2012-08-03T11:53:22.097 回答
0

如果您比较输入和输出文件的文件大小,您会发现输出文件越来越大。这是因为对于您读取的每个字节,您为密码中的每个字母写一个。这意味着,如果您的密码是 ,则输出文件将比输入文件大六倍"secret"

您需要提出一种算法,该算法采用密码并将其所有字母组合成一个值,您可以将其用于 XOR 操作。这种算法就是通常所说的散列函数

于 2012-08-03T11:55:59.357 回答
0

您的编码方案应该稍作修正。您正在使用键中的每个字符对您读取的每个字符进行异或运算,这不会产生预期的效果。您甚至可以注意到,您的加密文件比原始文件大,而使用此加密方案时它们应该是相同的。

您需要将原始文本中的一个字符与键中的一个字符进行异或。您可以通过以下方式修复它(例如):

if(originalFile != NULL && cryptedFile != NULL){
      int x = 0;
      int keyStringLength = strlen(keyString);

      while( (c = getc(originalFile)) != EOF ){
         c ^= keyString[x];
         putc(c, cryptedFile);

         ++x;
         if (x >= keyStringLength) {
            x = 0;
         }
      }

      fclose(originalFile);
      fclose(cryptedFile);
}
于 2012-08-03T11:59:34.853 回答