Стандартный способ хеширования ключа RSA? - PullRequest
1 голос
/ 24 июня 2011

Каков алгоритм создания хэша (sha-1 или MD5) открытого ключа RSA? Есть ли стандартный способ сделать это? Хэш только модуль, сложение строк обоих, а затем взять хэш? Обычно используются SHA-1 или MD5?

Я хочу использовать его, чтобы убедиться, что я получил правильный ключ (пусть отправитель отправил хэш, и я сам его вычисляю), и записал в журнал хэш, чтобы я всегда знал, какой именно ключ я использовал при шифровании полезной нагрузки.

1 Ответ

3 голосов
/ 24 июня 2011

Исходя из исходного кода OpenSSH, способ создания отпечатка пальца для ключей RSA состоит в преобразовании n и e из открытого ключа в двоичные данные с прямым порядком байтов, конкатенации данных и последующем хешировании этих данных с помощью данной хэш-функции.

Далее следует фрагмент исходного кода OpenSSH.Комментарии были добавлены, чтобы прояснить, что происходит.

// from key_fingerprint_raw() in key.c
switch (k->type) {
case KEY_RSA1:
    // figure out how long n and e will be in binary form
    nlen = BN_num_bytes(k->rsa->n);
    elen = BN_num_bytes(k->rsa->e);
    len = nlen + elen;
    // allocate space for n and e and copy the binary data into blob
    blob = xmalloc(len);
    BN_bn2bin(k->rsa->n, blob);
    BN_bn2bin(k->rsa->e, blob + nlen);

...

// pick a digest to use
switch (dgst_type) {
case SSH_FP_MD5:
    md = EVP_md5();
    break;
case SSH_FP_SHA1:
    md = EVP_sha1();
    break;

...

// hash the data in blob (n and e)
EVP_DigestInit(&ctx, md);
EVP_DigestUpdate(&ctx, blob, len);
EVP_DigestFinal(&ctx, retval, dgst_raw_length);

Со страницы руководства BN_bn2bin :

BN_bn2bin(a, to) преобразуется абсолютное значение aв big-endian форму и сохраняет его в to.to должен указывать на BN_num_bytes(a) байт памяти.

...