2

だから私はCでファイル暗号化プログラムを作成しようとしています(ちなみに私はCに慣れていません)ので、この単純なXORファイル暗号化コードを書きました:

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

int main()
{
char fileName1[35] = {'\0'};        //Name of original file
char fileName2[35] = {'\0'};        //Name of encrypted file
char keyString[20] = {'\0'};        //Key determines result encryption
FILE* originalFile;                 //File to be encrypted
FILE* cryptedFile;                  //The encrypted file
int c;                              //byte read from original file


printf("Enter file location followed by name of the file you want to encrypt: ");
scanf("%s", fileName1);

printf("Enter file location followed by name of the encrypted file: ");
scanf("%s", fileName2);

printf("Enter your key (Encryption changes based on Key): ");
scanf("%s", keyString);

originalFile = fopen(fileName1, "rb"); //rb to read file bytes
cryptedFile = fopen(fileName2, "wb");  //wb to write bytes to file


if(originalFile != NULL && cryptedFile != NULL){
    while( (c = getc(originalFile)) != EOF ){
        int x;
        for(x=0; x<strlen(keyString); x++){
            c ^= keyString[x];
            putc(c, cryptedFile);
        }
    }
    fclose(originalFile);
    fclose(cryptedFile);
}

return 0;
}

そこで、このプログラムをテストするために、file1.txt というファイルを作成し、暗号化プログラムを実行して、2 番目のファイルを file2.txt として、キーをsecretとして指定しました。次に、プログラムを再度実行しましたが、今回は暗号化された file2.txt に対して実行し、同じキーsecretで file3.txt を作成しました。同じキーだったので、file3.txt は file1.txt と同じはずですが、file3.txt にはランダムな内容が含まれています。それで、私は何を間違っていますか?

4

5 に答える 5

4

プログラムが出力するデータが多すぎます。file1.txt、file2.txt、file3.txt のサイズを確認してみてください。問題は次のセクションです。

while( (c = getc(originalFile)) != EOF ){
        int x;
        for(x=0; x<strlen(keyString); x++){
            c ^= keyString[x];
            putc(c, cryptedFile);
        }
    }

ネストされたループが 2 つあるため、入力文字ごとに内側のループ全体が実行されます。c = getc()内側のループ内で new を試行し、 EOF に達した場合は両方のループから抜け出すか、. を使用してループを 1 つにフラット化しますc ^= keyString[(x++) % strlen(keyString)];

于 2012-08-03T11:52:29.233 に答える
2

私があなたの問題を理解しているなら; 書き込み先の出力ファイルとキーを指定して、ファイルを暗号化したい

最初のファイルを実行すると、おそらく正しい出力が得られます。暗号化されたファイルを暗号化すると、同じ結果が得られるはずだと言っていますか?

プロセスを逆にして、最後のファイルを 2 回復号化することで元のテキストが得られるかどうかを確認してください。

于 2012-08-03T11:50:08.270 に答える
0

エンコード方式を少し修正する必要があります。読み取ったすべての文字をキーのすべての文字で xor しているため、目的の効果が得られません。暗号化されたファイルが元のファイルよりも大きいことに気付くことさえありますが、この暗号化スキームを使用すると同じになるはずです.

必要なのは、元のテキストの 1 文字をキーの 1 文字で xor することです。次の方法で修正できます (たとえば)。

if(originalFile != NULL && cryptedFile != NULL){
      int x = 0;
      int keyStringLength = strlen(keyString);

      while( (c = getc(originalFile)) != EOF ){
         c ^= keyString[x];
         putc(c, cryptedFile);

         ++x;
         if (x >= keyStringLength) {
            x = 0;
         }
      }

      fclose(originalFile);
      fclose(cryptedFile);
}
于 2012-08-03T11:59:34.853 に答える
0
int x = 0, keyLen = strlen(keyString);
while( (c = getc(originalFile)) != EOF ){
    c ^= keyString[x++%keyLen];
    putc(c, cryptedFile);
}
于 2012-08-03T11:53:22.097 に答える
0

入力ファイルと出力ファイルのファイル サイズを比較すると、出力ファイルがどんどん大きくなっていることがわかります。これは、読み取ったバイトごとに、パスワードの文字ごとに 1 つ書き込むためです。これは、パスワードが"secret".

パスワードを取得し、そのすべての文字を XOR 演算に使用できる単一の値に結合するアルゴリズムを考え出す必要があります。このアルゴリズムは、一般にハッシュ関数として知られているものです。

于 2012-08-03T11:55:59.357 に答える