散列RSA密钥的标准方法?

时间:2011-06-23 21:30:32

标签: encryption hash rsa public-key-encryption public-key

创建RSA公钥的哈希(sha-1或MD5)的算法是什么?有没有标准的方法来做到这一点?哈希只是模数,字符串加两个然后采取哈希?通常使用SHA-1还是MD5?

我想用它来确保我得到了正确的密钥(让发送者发送一个哈希值,我自己计算),然后记录所述哈希值,这样我就知道在加密有效载荷时我使用了哪个确切的密钥。

1 个答案:

答案 0 :(得分:3)

基于OpenSSH源代码,为RSA密钥生成指纹的方式是将n和e从公钥转换为big-endian二进制数据,连接数据,然后使用给定的散列函数散列该数据

以下是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 manual page

BN_bn2bin(a, to)a的绝对值转换为 big-endian 形式,并将其存储在toto必须指向BN_num_bytes(a)字节的内存。