0

编写一个与我的密码程序类似的密码程序:•提示用户输入密钥并使用它来计算随机数生成器的种子•提示用户提供输入文件的名称和输出编码/解码文件• 使用从用户密钥获得的种子从随机数生成器创建随机字节序列。• 使用随机位 r 对位 x 进行编码,如下所示: x⊕ = r • 由于∀r ∈{0,1},r ⊕r = 0,使用相同的随机字节序列和相同的操作 x 执行解码⊕ = r。解码基于运算 x⊕r ⊕r = x⊕(r ⊕r) = x⊕0 = x

下面是用于加密的代码,但在解密时,密文仅包含 3 个字符。我无法弄清楚为什么解码不起作用。我正在使用 Dev-C++。您的帮助将不胜感激。

  #include<iostream>
  #include<conio.h>
  #include<math.h>
  #include<stdlib.h>
  #include<fstream>

  using namespace std;


  int main()
  {   
    char  n, line[1024],  keystring[100]; char FitoEncr[100], NewFiCrypt[100];
    char FiletobeDecrypted[100];
    ifstream IS ("FitoEncr.txt", ios::in);
    ofstream OS ("NewFiCrypt.txt", ios::out); 

    unsigned int psswd=0, number;
    cout<<"Please, enter a secret key :";
    cin.getline(keystring, 100);
    for( int i=0;keystring[i]!='\0'; i++)

      psswd=(psswd+3)*keystring[i];
    cout<<"initial password: "<<keystring<<endl;
    cout<<"encrypted password: "<<psswd<<endl;

    cout<<"please, enter the name of the input file: ";
    cin.getline(FitoEncr,20);
    cout<<"please, enter the name of the output file: ";
    cin.getline(NewFiCrypt,20);

    srand(psswd);    //not sure about creating the sequence of random bytes from a...
    number=rand() % 255; //random number generator with the seed obtained from user's secret key

   //ENCRYPTION

    while(IS.get(n))
     {
         if(IS.get(n))
         {      
           n^=rand();
           OS<<n;
           cout<<"character coded:"<<n;   
         }

     }
     IS.close();
     OS.close();

    //DECRYPTION

     ifstream IS1;
     ofstream OS1; 

     IS1.open("NewFiCrypt.txt", ios::in);
     OS1.open("FilDecr.txt", ios::out); 

     while(IS1.get(n))
     {
       if(IS1.get(n))
       {      
         n^=rand();  //I think the problem starts on this line...
         OS1<<n;
         cout<<"character coded:"<<n;   
       }

     }       
     IS1.close();
     OS1.close();     

     getch();

     return 0;
  }
4

2 回答 2

2

您在加密之前播种随机数生成器,而不是在解密之前播种,因此随机数系列会有所不同;显然,它们必须相同才能起作用。如果您添加另一个

srand(psswd);  

在第二次解密之前,这会让你更接近。

然而,仔细观察,还有一些重要的其他问题。例如,每次调用 时get(n),都会使用输入文件中的一个字符。您正在调用get(n)您的 while 循环条件,但随后立即在您的if;中再次调用它。这意味着您将有效地跳过输入和输出中的所有其他字符;解密后的文件将只包含原始文件中 25% 的字符!只需if完全删除这些语句,您的循环就会正确。希望解决了这两个问题,您的程序将可以正常工作。

于 2012-05-10T11:26:59.343 回答
1

也许您应该首先检查它在没有 n ^= rand(); 的情况下在文件中写入的内容;线。没有它,它应该只是复制文件对吗?

于 2012-05-10T11:50:41.847 回答