1
创建RSA公钥的哈希(sha-1或MD5)的算法是什么?有没有一个标准的方法来做到这一点?哈希只是模数,两个字符串的加法,然后采取哈希?通常使用SHA-1还是MD5?散列RSA密钥的标准方法?
我想用它来确保我获得了正确的密钥(让发件人发送一个散列,然后我自己计算它),并记录所述散列,以便我始终知道在加密有效负载时使用的确切密钥。
创建RSA公钥的哈希(sha-1或MD5)的算法是什么?有没有一个标准的方法来做到这一点?哈希只是模数,两个字符串的加法,然后采取哈希?通常使用SHA-1还是MD5?散列RSA密钥的标准方法?
我想用它来确保我获得了正确的密钥(让发件人发送一个散列,然后我自己计算它),并记录所述散列,以便我始终知道在加密有效负载时使用的确切密钥。
基于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
绝对值转换成在to
大端形式存储。 to
必须指向BN_num_bytes(a)
字节的内存。
此处用于散列密钥的方法不是抗碰撞。即很容易找到不同的对(n',e'),例如通过从n中删除一个字节并将其附加到e中,使得结果blob不会改变。例如,如果除了n'的一个素数因子都很小,那么攻击者甚至可以将这样的模数n'考虑进去。如果需要抗冲击性,那么例如两个整数n和e的长度应该被编码到被散列的线中,例如,通过使用字符串的DER编码。 – Accipitridae
我不想在这里声称SSH在这里做错了什么。即它不依赖于密钥哈希是抗碰撞的。我也不知道OP是否需要一个碰撞抵抗散列,因为这个问题还不够具体,以确定能否找到具有相同键散列的另一个键的攻击者是否可以利用它。相反,选择一些随机代码片段并将其用于某些可能有不同要求的内容通常是一个糟糕的主意。 – Accipitridae