1

私の目標は、バイオに保存されているデータを読み取り(書き込み操作用であると想定)、そのmd5フィンガープリントを計算することです。データは何でもかまいません。私はいくつかの試みをしました。これが私の最新の試みです:

void fingerprint(struct bio * bio, unsigned char * result)
{
char * place;
char * cpy;
int total;
struct buffer_head * bh;
struct scatterlist sg;
struct hash_desc desc = {
    .tfm = crypto_alloc_hash("md5", 0, CRYPTO_ALG_ASYNC),
    .flags = CRYPTO_TFM_REQ_MAY_SLEEP
};
total = 0;

cpy = kmalloc(sizeof(char) * bio->bi_io_vec[i].bv_len, GFP_KERNEL);
bh = (struct buffer_head *)bio->bi_io_vec[i].bv_page->private;
    place = bh->b_data + bio->bi_io_vec[i].bv_offset;

DPRINTK("%u", bio->bi_io_vec[i].bv_offset);
DPRINTK("%u", place);

memcpy(cpy, place, bio->bi_io_vec[i].bv_len);
DPRINTK("%x", place);
DPRINTK("%x", cpy);

sg_init_one(&sg, (u8 *)cpy, bio->bi_io_vec[i].bv_len);
crypto_hash_init(&desc);
crypto_hash_update(&desc, &sg, bio->bi_io_vec[i].bv_len);
total += bio->bi_io_vec[i].bv_len;
DPRINTK("%u", bio->bi_vcnt);
DPRINTK("%u", total);

crypto_hash_final(&desc, result);
kfree(cpy);
}

ハッシュの結果は、まったく同じではないにしても非常に似ており、常に偶数です。結果をlongと16進数で出力します。なぜこうなった?

4

1 に答える 1

1

コードをテストする必要があります。コードを MD5 の最小値まで削減し、いくつかのテスト ベクトルを試してください。

"" -> d41d8cd98f00b204e9800998ecf8427e

「素早い茶色のキツネが怠け者の犬を飛び越える」 -> 9e107d9d372bb6826bd81d3542a419d6

「素早い茶色のキツネが怠け者の犬を飛び越える。」-> e4d909c290d0fb1ca068ffaddf22cbd0

(3 番目の例の余分なピリオドに注意してください。)

MD5 が正しく動作していることを確認したら、コードの他の部分を徐々に再導入し、定期的に再チェックしてください。

于 2012-06-22T16:43:08.480 に答える