c - 如何使用按位 XOR 加密文本文件?

标签 c encryption xor

我正在尝试通过对来自另一个文件 (keys.txt) 的两个特定 key 对左右字符使用按位异或运算来加密来自文本文件的消息,但是我在前面收到了不可读的代码原始文本文件(没有改变),这是不对的。我正在使用两个文本文件:

1) Input.txt - 包含要加密的消息

2) Keys.txt - 这包含两个字符,对 input.txt 中的每个字符进行异或运算(字符 1 是键 1,字符 2 是键 2)

我程序中的以下代码:

str[i]=str[i]^str2[2];
str[++i]=str[i]^str2[1];
break;

是假设执行异或运算的代码行

注意我想要的输出应该类似于这样:

m@#EmI(>9S(@)H#FmN# XGmmmmU,H!Gmr(DmI"VmD,F(S!XmU%DmM"C>U(S>,O)9I(9T?U!D>,M!,E;@#B(Gmu%D4,S(:@$U$O*"OmU%DmR%H#F!D`V$M!4N8.N Dm@#EmK"H#9I(+mmmm)@#B(f

有人可以澄清我遇到的问题吗?

用户应输入:

gcc myProgram.c
./a.out e input.txt keys.txt

(e代表加密)

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


int main(int args, char *argc[]){

int i;
int len=0;
char str[1024];
char str2[2];
FILE *finp;
FILE *keyFile;

if ( strcmp(argc[1], "e") == 0 )
{
  if ( (finp = fopen(argc[2],"r")) == NULL )
  {
    printf("Could Not Open file %s\n", argc[2]);
    exit(1);
  }

  if ( (keyFile = fopen(argc[3],"r")) == NULL )
  {
    printf("Could Not Open file %s\n", argc[3]);
    exit(1);
  }


  while((fgets(str,1024,finp)!=NULL)&(fgets(str2,2,keyFile)!=NULL))
  {
    printf("%c\n %c",str2[1],str2[2]);


    /* *** START CODE THAT USES INPUT.TXT FILE & KEYS.TXT *** */
    len = strlen(str);
    for(i=0;i<len;i++)
    {
      str[i]=str[i]^str2[2];
      str[++i]=str[i]^str2[1];
      break;
    }
  }

  printf("%s\n", str);
  fclose(finp);
  return 0;

}
else
{
  printf("SORRY!");
}

最佳答案

C 数组索引是从零开始的,那么你应该使用

str2[0],str2[1]

代替

str2[1],str2[2]

在这个片段中

for(i=0;i<len;i++)
{
  str[i]=str[i]^str2[2];
  str[++i]=str[i]^str2[1];
  break;
}

break 语句在第一次迭代后停止循环。你应该删除它。然后你得到

for(i=0;i<len;i++)
{
  str[i]^=str2[1];
  str[++i]^=str2[0];
}

排队

while((fgets(str,1024,finp)!=NULL)&(fgets(str2,2,keyFile)!=NULL))

你需要逻辑与而不是按位

while((fgets(str,1024,finp)!=NULL)&&(fgets(str2,2,keyFile)!=NULL))

如果您的 input.txt 文件包含更多 1024 字节以显示您需要移动的所有结果 printf("%s\n", str);进入while循环

while((fgets(str,1024,finp)!=NULL)&&(fgets(str2,2,keyFile)!=NULL))
{
    ...
    printf("%s\n", str);
}

关于c - 如何使用按位 XOR 加密文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29499480/

相关文章:

c# File.Delete - 另一个进程正在使用的文件

math - 如何为巨大的数字实现 c=m^e mod n?

Java异或运算

c - 这个程序有什么问题?分词程序

c - 为什么这个 C 函数以二进制补码形式返回 int 值?

python - 有没有办法扩展 Charm-Crypto 方案来加密文件?

时间:2019-03-09 标签:c#xorfunctionality

cryptography - OTP/XOR 破解具有相同 key 的两个密文

c - m 的静态声明遵循非静态声明

c - 为什么可以使用 scanf 更改 const int?