encryption - 散列 RSA key 的标准方法?

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

创建 RSA 公钥的散列(sha-1 或 MD5)的算法是什么?有没有标准的方法来做到这一点?只需对两者的模数和字符串加法进行哈希处理,然后再进行哈希处理?通常使用 SHA-1 还是 MD5?

我想用它来确保我获得正确的 key (让发送者发送一个哈希值,然后我自己计算它),并记录所述哈希值,以便我始终知道在加密有效负载时使用的确切 key 。

最佳答案

基于 OpenSSH 源代码,为 RSA key 生成指纹的方式是将公钥中的 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 manual page :

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

关于encryption - 散列 RSA key 的标准方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6460845/

相关文章:

php - PHP中的简单加密

python - 在 python 中计算字符串的 SHA1

python - 逐字或按哈希比较 2 段文本

python - Python 中的移位密码 : error using ord

Ruby openssl 文档

c++ - 关于为许可证系统创建 key 生成器的问题

javascript - 如何加载 PEM 格式的公钥进行加密?

encryption - 使用 RSA-1024 签名 SHA-256 摘要 : what is the size?

java - 为 SQLCipher 加密现有数据库

c# - 跨多个平台(Android、Phone、W8M)的密码散列