如何使用XOR加密音乐文件

时间:2010-08-12 10:49:40

标签: iphone c

我想加密和解密10000字节的音乐文件。我用了代码:

if(file!=NULL && g!= NULL)  
{
    while(!feof(file))
    {
        count++;
        char aByte;
        fread(&aByte, sizeof(char), 1, file);
        if (count <= 10000)
        {
            if (count % 2 == 0)
            {
                if ((aByte ^ 'A') != EOF) aByte = aByte ^ 'A';
            }
            else 
            {
                if ((aByte ^ 'B') != EOF) aByte = aByte ^ 'B';
            }
        }
        fwrite(&aByte, sizeof(char), 1, g);
    }
}   
fclose(file);

但代码不起作用。请帮忙!!!

2 个答案:

答案 0 :(得分:2)

当您检查EOF时,您不应该执行XOR(顺便说一下,fread表示其返回值而不是它写入缓冲区的值;只有在准备要写入文件的字节时才会这样做。

此外,如果您想要正确加密密钥,则需要更长的密钥 - 并且任何不应该解密密钥的人都必须知道该密钥。

答案 1 :(得分:1)

通过删除“加密”来测试文件处理。拿出这些线

        if (count % 2 == 0)
        {
            if ((aByte ^ 'A') != EOF) aByte = aByte ^ 'A';
        }
        else 
        {
            if ((aByte ^ 'B') != EOF) aByte = aByte ^ 'B';
        }

你的文件是完全相同的吗?我认为不会。以下是一些原因

  1. 文件超过10,000个字节 - 最后关闭文件,所以我假设这些字节丢失
  2. 该文件小于10,000字节 - 您不检查EOF属性,因此看起来会写一个额外的字节
  3. count未在此代码中初始化 - 如果在一次运行中甚至在另一次运行中它是奇数,它就不匹配。此外,它只是根据计数来复制随机数字节。也许它已经在其他地方初始化了。
  4. 你没有关闭g,所以你不能确定它被刷新了(fwrite可以缓冲写入)
  5. 更新:EOF不是您可以在文件中找到的字节,它是某些FILE API函数(非fread)使用的特殊返回值。

    函数getchar()的定义如下:

      int getchar();
    

    它返回EOF或者在char范围内的int。如果它是EOF,则表示您位于文件的末尾。如果没有,您可以安全地将回报转换为char。 EOF的唯一规定是它不是有效的字符。 getchar()返回一个int,因为它可以返回任何char(256个选项)+ EOF,总共257个选项,无法在char中表示。

    如果你看fread(),你会发现它与chars没有任何关系。它需要缓冲区,记录大小和记录计数,并返回读取的字节数。你碰巧传入sizeof(char)和1来获得一个char。它不可能在该char中存储EOF,因为EOF不是有效的char,它是一个int并且不适合。它不使用与getchar()相同的约定。如果遇到EOF,则返回的数字小于请求的总字节数。在你的情况下,那是0.如果fread()返回0,检查feof()和ferror()以查明你是否到达文件结尾或出错(两者都导致fread返回少于请求的数量) )。