我试图通过使用左右字符上的按位异或操作对来自另一个文件(keys.txt)的两个特定密钥对来自文本文件的消息进行加密,但在原始文本文件前面收到了无法读取的代码(未更改),这是不对的我使用两个文本文件:
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;

是假定要执行异或操作的代码行
注意,我想要的输出应该类似于:
电磁干扰(>9S(@)HţFmNţXGmmmmU,H!Gmr(DmI“VmD,F(S)!XmU%DmM“C>U(S>,O)9I(9T?你!D>,M!,E;@#B(Gmu%D4,S(:@$U$O*“OmU%DmR%H#F!百万美元!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;
}

第一次迭代后中断语句停止循环。你应该把它取下来。然后你得到
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);
}

07-24 09:46
查看更多