加密一个简单的数组

时间:2012-03-18 06:28:17

标签: c encryption xor

对于我必须要做的实验,我需要创建一个程序,它将从文本文件中获取一个简单的字符串,并使用一个密钥加密它 - 一个0到255之间的数字。它将文件读入一个通过使用密钥对每个字节进行异或,将此数组加密(或解密)到另一个数组中。最后,它将修改后的数组写入第二个文件。

我大部分都得到了 - 我下面的内容编译得很好。但是,它不会将任何内容复制到第二个文件中。救命啊!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CRYPT(a, b) (a ^ b)

int main(int argc, char *argv[])
{
    FILE *fp1, *fp2;
    int a[100], b, key;
    int i = 0;

    // opens file containing string to be encrypted
    if((fp1 = fopen(argv[2], "rb")) == NULL)
    {
            printf("Error - could not open file or file does not exist\n");
            return;
    }

    // opens file encrypted string will be saved to
    fp2 = fopen(argv[3], "wb");

    // converts string to integer
    key = atoi(argv[1]);

    while(fread(a, sizeof(a), 100, fp1))
    {
            while (i != '\0');
            {
                    b = CRYPT(a[i], key);
                    fwrite(&b, sizeof(a), 1, fp2);
                    i++;
            }
    }


    return 0;

}

2 个答案:

答案 0 :(得分:0)

我认为问题出在这里 -

while (i != '\0');

您正在将i初始化为0,而在while循环中,您正在检查i是否等于NULLNULL\0的整数值为0.因此,表达式为false,并且永远不会执行循环。

同时删除此while循环末尾的额外分号。

来自reference -

  

size_t fread(void * ptr,size_t size,size_t count,FILE * stream);

     

读取 count 元素的数组,每个元素的大小为 size 字节,来自< strong> stream 并将它们存储在 ptr 指定的内存块中。   流的位置指示符按读取的总字节数提前。   成功读取的总字节数是(size * count)。

因此,您还需要将fread功能更改为此 -

fread(a, sizeof(int), 100, fp1)

同样,您还需要更改fwrite -

fwrite(&b, sizeof(int), 1, fp2);

编辑后的代码看起来应该是这样的 -

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define CRYPT(a, b) (a ^ b)

int main(int argc, char *argv[])
{
    FILE *fp1, *fp2;
    int a[100], b, key;
    int i = 0;
    int data_read = 0;

    // opens file containing string to be encrypted
    if((fp1 = fopen(argv[2], "rb")) == NULL)
    {
            printf("Error - could not open file or file does not exist\n");
            return;
    }

    // opens file encrypted string will be saved to
    fp2 = fopen(argv[3], "wb");

    // converts string to integer
    key = atoi(argv[1]);

    while( (data_read = fread(a, sizeof(int), 100, fp1)) > 0 )
    {
            while(i < data_read)
            {
                    b = CRYPT(a[i], key);
                    fwrite(&b, sizeof(int), 1, fp2);
                    i++;
            }

            i=0;
    }

    return 0;
}

答案 1 :(得分:0)

您的代码存在一些严重缺陷。

首先,整数数组a上有一个缓冲区溢出(即可以将超过100个整数读入a)。

正如托马斯麦卡锡评论你的while循环末尾的分号创建一个空语句 - 删除它。

此外,您正在为每个角色将sizeof(a)或100个整数写入fp2。