我的C加密程序出了什么问题?

时间:2012-08-03 11:45:18

标签: c encryption

所以我正在尝试在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中包含随机内容。那么我做错了什么?

5 个答案:

答案 0 :(得分: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);
        }
    }

有两个嵌套循环,因此为每个输入字符执行整个内部循环。如果达到EOF,请在内循环内尝试新的c = getc()并使两个循环中断,或使用c ^= keyString[(x++) % strlen(keyString)];将循环展平为一个循环。

答案 1 :(得分:2)

如果我理解你的问题; 您希望通过为文件提供要写入的输出文件以及密钥来加密文件

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

您需要提出一种算法,该算法接受密码并将其所有字母组合成单个值,您可以将其用于XOR操作。此算法通常称为hash function

答案 4 :(得分:0)

您的编码方案应该稍微纠正一下。您正在使用键中的每个字符来读取您阅读的每个字符,这不会产生所需的效果。您甚至可以注意到,您的加密文件比原始文件大,而使用此加密方案它们应该相同。

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

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