0

実行可能ファイルで MD5 ハッシュを実行しています。Python スクリプトを使用してバイナリを実行可能ファイルからテキスト ファイルに読み込みましたが、この構築されたファイルを C プログラムに読み込むと、1 と 0 が次のように扱われるため、MB 単位のデータを処理することになります。chars、各 1 ビット数に対して 8 ビットを取ります。これらをそれぞれ単一のビットとして読み取ることは可能でしょうか? バイナリ変換の長さとハッシュのパディングに必要なすべての文字を保持するために、たとえば 10MB の配列を作成した場合、プログラムのパフォーマンスはどの程度低下するでしょうか? これが考えられない場合、データを操作するためのより良い方法はありますか?

4

1 に答える 1

1

C と C++ という質問にタグを付けたので、C に行きます。

これらをそれぞれ単一のビットとして読み取ることは可能でしょうか?

はい、ファイルから一度に 8 バイトを読み取り、それら1の とを連結0して新しいバイトを作成します。このために 10MB の配列を作成する必要はありません。

まず、ファイルから 8 バイトを読み取ります。読み取られcharた値は整数値 (0および1) に変換され、ビットシフトされて新しいバイトが作成されます。

unsigned char bits[8];
while (fread(bits, 1, 8, file) == 8) {
    for (unsigned int i = 0; i < 8; i++) {
        bits[i] -= '0';
    }

    char byte = (bits[0] << 7) | (bits[1] << 6) |
                (bits[2] << 5) | (bits[3] << 4) |
                (bits[4] << 3) | (bits[5] << 2) |
                (bits[6] << 1) | (bits[7]     );

    /* update MD5 Hash here */
}

次に、新しく読み取ったバイトで MD5 ハッシュを更新します。


編集:典型的な MD5 実装では、処理前に入力を 512 ビットのチャンクに分割する必要があるため、実装自体でそのオーバーヘッドを取り除き (推奨されません)、ファイルから 512 ビット (64 バイト) を読み取るだけです。その後、ハッシュを直接更新します。

unsigned char buffer[64];
unsigned char bits[8];
unsigned int index = 0;

while (fread(bits, 1, 8, file) == 8) {
    for (unsigned int i = 0; i < 8; i++) {
        bits[i] -= '0';
    }

    buffer[index++] = (bits[0] << 7) | (bits[1] << 6) |
                      (bits[2] << 5) | (bits[3] << 4) |
                      (bits[4] << 3) | (bits[5] << 2) |
                      (bits[6] << 1) | (bits[7]     );

    if (index == 64) {
        index = 0;
        /* update MD5 hash with 64 byte buffer */
    }
}

/* This sends the remaining data to the MD5 hash function */
/* It's not likely that your file has exactly 512N chars */
if (index != 0) {
    while (index != 64) {
        buffer[index++] = 0;
    }
    /* update MD5 hash with the padded buffer. */
}
于 2013-03-29T18:48:26.470 に答える