Исходя из исходного кода 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)
байт памяти.