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)、入力ファイルから文字を消費します。whileループ条件で呼び出していますが、すぐに;get(n)で再度呼び出しています。ifつまり、入力時と出力時に1文字おきにスキップすることになります。復号化されたファイルは、元のファイルの文字の25%になります。ステートメントを完全に削除するだけifで、ループは正しくなります。うまくいけば、これらの両方を修正して、プログラムが機能するようになります。

于 2012-05-10T11:26:59.343 に答える
1

おそらく、最初にn ^ = rand();なしでファイルに何が書き込まれるかを確認する必要があります。ライン。それがなければ、ファイルを正しくコピーする必要がありますか?

于 2012-05-10T11:50:41.847 に答える