0

ファイル内のデータの暗号化中に問題が発生しました。そのために単純な xor を使用しています。私はこの構造体を持っているとしましょう:

struct MyFile{
char fileName[128];
int account;
float balance;};

これをバイナリファイルとして保存すると正常に動作しますが、xor を使用して構造体のファイル名を暗号化し、構造体を hd に保存すると、構造体を読み取ってファイル名を復号化すると、文字が正しく表示されません。暗号化/復号化の目的でこの単純な関数を使用しています。

static void Codec(const char *key,int keySize,char* in,char *result,int length)  
{
    for(int i=0;i<length;i++)
        result[i]=in[i]^key[i%keySize];
}

ファイル名を暗号化し、メモリ内で直接復号化すると、結果は正しいことに注意してください。ハードディスクに保存すると変更されるのはなぜですか。できるだけ早く返信し、事前にtnxしてください...

4

3 に答える 3

2

まず、データがディスクに書き込まれるときにデータが実際に変更されているかどうかを確認します。プログラムに次の4つの場所で文字列を出力させます。

  1. 暗号化する前に
  2. 暗号化した後、ディスクに書き込む前
  3. ディスクから読み取った後、復号化する前
  4. 復号化した後

#2と#3の結果は同じですか?その場合、ディスクへの転送およびディスクへの転送中にファイルは変更されません。

#2と#3が異なる場合は、暗号化されていない文字列をディスクに書き込んで、読み戻してみてください。これは正常に機能しますか?

そのような構造体を1つだけファイルに書き込み、16進エディターでファイルの内容を調べます。ディスク上にあるファイルはどのように見えますか?

ディスクへの書き込みコードとディスクからの読み取りコードも投稿してください。問題の一部はそこにある可能性があります。

于 2010-08-03T23:04:24.533 に答える
2

ファイルをバイナリモードで開く必要があります。CI / Oを使用する場合(私が通常使用するように)、これは

FILE *input_file = fopen(input_file_name, "rb");
FILE *output_file = fopen(output_file_name, "wb");

代わりに、C ++ストリームの使用に騙された場合、これは

std::ifstream input_file(input_file_name, ios::in | ios::binary);
std::ofstream output_file(output_file_name, ios::out | ios::binary);
于 2010-08-03T23:05:11.457 に答える
1

ファイルはバイナリ モードで開く必要があることに注意してください ( fopen. 特に Windows C の実装では、\n<->\r\n変換に関して問題があります。

unsigned charまた、算術演算やビット単位の演算に sを使用することもお勧めします。8 ビットの 2 の補数の符号付き文字以外は問題を引き起こす可能性があります (当然のことながら、ほとんどの実装では対称 XOR 暗号化を使用しており、問題を引き起こさない可能性がありますが、それでも注意が必要です)。

于 2010-08-03T23:13:41.000 に答える