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