【问题标题】:Standard way to hash an RSA key?散列 RSA 密钥的标准方法?
【发布时间】:2011-09-21 14:18:37
【问题描述】:

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

我想用它来确保我得到了正确的密钥(让发件人发送一个哈希值,我自己计算它),并记录所说的哈希值,这样我在加密有效负载时总是知道我使用了哪个确切的密钥。

【问题讨论】:

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


    【解决方案1】:

    基于 OpenSSH 源代码,为 RSA 密钥生成指纹的方式是将 n 和 e 从公钥转换为大端二进制数据,连接数据,然后使用给定的哈希函数对数据进行哈希处理.

    部分 OpenSSH 源代码如下。添加 cmets 是为了澄清正在发生的事情。

    // 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_bn2binmanual page

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

    【讨论】:

    • 这里散列密钥的方法不是抗冲突的。 IE。很容易找到不同的对 (n', e'),例如通过从 n 中删除一个字节并将其附加到 e,使得生成的 blob 不会改变。攻击者甚至很有可能会考虑这样的模数 n',例如,如果 n' 的一个素因数之外的所有因素都很小。如果需要抗碰撞性,则例如两个整数 n 和 e 的长度应编码到散列的字符串中,例如通过使用字符串的DER编码。
    • 我不想在这里声称 SSH 在这里做错了什么。 IE。它不依赖于抗冲突的密钥哈希。我也不知道 OP 是否需要抗冲突哈希,因为这个问题不够具体,无法确定能够找到具有相同密钥哈希的另一个密钥的攻击者是否可以利用它。相反,只选择一些随机代码 sn-p 并将其用于可能有不同要求的东西通常是一个坏主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    相关资源
    最近更新 更多