加密&在c中解密文件

时间:2011-07-28 11:19:56

标签: c linux

这里我有一个简单的加密代码和用C解密C中的文件,

#include <stdio.h>
int Encrypt(char * FILENAME, char * NEW_FILENAME)    
{
    FILE *inFile;   //Declare inFile
    FILE *outFile;  //Declare outFile
    char Byte;
    char newByte;
    int n;
    int i=0;

    inFile = fopen(FILENAME,"rb");
    outFile = fopen(NEW_FILENAME, "w");

    if(inFile == NULL || outfile == NULL){
        printf("Error in opening file");
            return 1;
    } else {
        printf("\nFile Opened, Encrypting");
        while(1){
                while ( !feof( inFile ) ){
                    Byte=fgetc(inFile);
                    newByte=Byte+25;
                    fputc(newByte,outFile);
                } 
            printf("End of File");
            break;
        }
        fclose(inFile);
        fclose(outFile);
    }
}

int Decrypt (char *FILENAME, char *NEW_FILENAME)
{
    FILE *inFile; //Declare inFile
    FILE *outFile; //Declare outFile

    char Byte;
    char newByte;
    int i=0;

    inFile = fopen(FILENAME,"rb");
    outFile = fopen(NEW_FILENAME, "w");

    if(inFile == NULL || outfile == NULL){
        printf("Error in opening file");
        return 1;
    } else {
        printf("File Opened, Decrypting");
        while(1){
            printf(".");
            while ( !feof( inFile ) ){
                Byte=fgetc(inFile);
                newByte=Byte-25;
                fputc(newByte,outFile);
            } 
            printf("End of File");
            break;
        }
        fclose(inFile);
        fclose(outFile);
    }
}

int main()
{
    char encFile[200];
    char newencFile[200];
    char decFile[200];
    char newdecFile[200];

    int choice;

    printf("Enter 1 to Encrypt  / 2 to Decrypt");
    scanf("%d",&choice);

    switch(choice)
    {
    case 1:
        printf("Enter the Source Filename:  ");
        scanf("%s",encFile);
        printf("Enter the Destination Filename:   ");
        scanf("%s",newencFile);
        Encrypt(encFile, newencFile);
        break;
    case 2:
        printf("Enter the Source Filename:   ");
        scanf("%s",decFile);
        printf("Enter the Destination Filename:   ");
        scanf("%s",newdecFile);
        Decrypt(decFile, newdecFile);
        break;
    }
    return 0;
}

此代码有效,但在文件末尾它还包含"ÿæ"个字符,因此无法在linux&amp;中的默认文本编辑器中打开它。变得无用来存储私人细节。我想在discript文件中得到相同的东西。 请提供帮助,提前致谢。

3 个答案:

答案 0 :(得分:3)

您的代码不正确。您可能希望加密文件与原始文件具有相同的大小,但事实并非如此。错误的代码是:

    while(1){
        printf(".");
        while ( !feof( inFile ) ){
            Byte=fgetc(inFile);
            newByte=Byte+25;
            fputc(newByte,outFile);
         } 
         printf("End of File");
         break;
    }

必须改为:

while ((Byte = fgetc(inFile)) != EOF) {
  newByte = Byte + 25;
  if (fputc(newByte, outFile) == EOF) {
    /* ERROR */
  }
}
printf("End of File\n");

请注意,printf语句以换行符(\n)结尾。这是你应该遵循的风格。否则,由于缓冲,输出可能不会立即显示。

更多详细信息:feof函数仅检查文件标记的结尾是否已设置。但是当fgetc函数注意到它已到达文件末尾时,此标记尚未设置。相反,在这种情况下,fgetc函数会返回EOF

哦,请更改变量的类型。

char Byte; /* this is wrong. */
int Byte; /* this is correct. */

有关详细信息,请参阅任何好的关于C语言编程的入门书籍。

答案 1 :(得分:2)

在我解释上述代码的解决方案之前, 我先告诉你这些事情。要注意程序中变量的不必要的定义。 我在你的代码中看到了大量的内存浪费。每个人都可以编写一个程序,但是这样可以使得更简单的程序得到冠。记住当你编写程序时。

我在加密和解密功能中看到了Unneccessary变量i,defination。并且无需使用新的字节字符定义您可以将其排序为

   byte=byte+25 \\ even that makes your work no need of Newbyte char variable.

删除int n,int i definations以使你的代码更好。你真正需要知道的最重要的事情是

    you cannot use char a;a=getc(Filepointer);

记住EOF在到达文件末尾时返回-1,如果使用char,则返回-1。它不起作用。 Char数据类型只能处理正数据。即使你将-1分配给char,它也会在内部将其保存为正数,你可以在google上检查这个东西。

      so never use char data type for checkin EOF use int datatype 

正如罗纳德提到的那样,你将其作为

       while((Byte=getc(Filepointer))!=EOF)

这就是你犯的错误。把它作为int数据类型。请检查以前的问题。请注意它实际上是一个重复的问题。有些人可以视为downvote。

加密和解密的更好方式是使用按位运算而不是添加

            Byte=Byte^200; To encrypt  \\ just a sample 
            Byte=Byte^200; To  decrypt \\ you can make more complicated

你要怎么做。与向你的ACSII char添加25相比,它提供了更多的安全性。你甚至可以加密它给它一些预定义的规则。希望你得到了答案并解决了你的问题。谢谢你

答案 2 :(得分:2)

这个使用不同逻辑的新程序怎么样:

#include <stdio.h>
int main()
{
    char src[50], tgt[53], ch;
    printf ("Enter file name: ");
    gets (src);
    fs = fopen (src, "r");
    if (fs == NULL)
    {
        printf ("Error while opening file!\n");
        return 1;
    }
    sprintf (tgt, "%s.ed", src);
    ft = fopen (tgt, "w");
    while ((ch = fgetc (fs)) != EOF)
        fputc (~ch, ft);
    fclose (fs);
    fclose (ft);
    remove (src);
    rename (tgt, src);
    return 0;
}

无需为此目的编写单独的函数/程序。此外,同一文件将通过将文件的一个补码打印到另一个文件并在删除旧文件后将新文件重命名为旧文件来加密。
总体而言:这是非常简单实用程序!