Rsa

rsa_pss_pss_* 和 rsa_pss_rsae_* 方案有什麼區別?

  • April 26, 2018

我試圖理解 和 之間的rsa_pss_pss_區別rsa_pss_rsae_

圖為TLS1.3的ClientHello的擴展。

在此處輸入圖像描述

我查看 OpenSSL 程式碼,發現該rsa_pss_rsae_*方案與RFC 8017中第 8.1 節中的方案相對應,但是rsa_pss_pss_*方案呢?

我發現這樣的註釋很奇怪:

TODO 這不會區分 rsa_pss_pss_* 和 rsa_pss_rsae_* 方案,因為我們這裡沒有鏈可以讓我們查看簽名證書中的密鑰 OID。

這個鍊和密鑰 OID 是怎麼回事?

據我了解,簽名方案僅適用於私鑰類型(RSA 或 EC)。

摘要:它們不是不同的簽名方案。兩者都指定使用 RSA-PSS。不同之處在於如何解析證書以找到公鑰。

RSA-PSS(也拼寫為 RSASSA-PSS 和其他變體)是 PKCS#1 (RFC 8017) 中定義的一系列短消息簽名方案。短消息簽名方案只能對長度限制較小的消息進行簽名;通常,有效負載是可以任意長的消息的散列(實際上)。RSA-PSS 是一系列方案,因為它由遮罩生成函式參數化(和鹽長度,但我不會在這裡討論;您可以將其視為每個簽名的參數,而不是簽名方案的參數) . 任何人都使用的唯一遮罩生成函式稱為 MGF1,但它又由散列函式參數化。因此 RSA-PSS-MGF1-SHA-256 是短消息簽名方案的一個範例。

rsa_pss_pss_sha256並且rsa_pss_rsae_sha256兩者都表示 RSA-PSS-SHA-256 簽名方案,與rsa_pkcs1_sha256表示使用 RSA-PKCS#1v1.5 短消息簽名方案的 RSA-PKCS#1v1.5-SHA-256 簽名方案相同。每個基於 PSS 的方案都有一對值的原因是 TLS 1.3 中的簽名算法擴展編碼比簽名方案多一點。

額外的資訊是如何查找和驗證公鑰。在大多數情況下,給定 TLS 版本和密碼套件,只有一種方法可以做到這一點:在使用證書的密碼套件中(即“普通”密碼套件,而不是未經身份驗證或使用預共享密鑰或原始密碼的密碼套件)公鑰),您解析證書鏈,檢查簽名鍊是否有效,並檢查鏈的根是否可以接受。TLS 協議中沒有使用其他方法。

但是等等,你如何解析證書?TLS 協議僅指定一種證書格式,即X.509。所以仍然不需要任何額外的資訊。我不會詳細介紹 X.509,我只想說有一種標準方法可以找到公鑰和簽名,並且兩者都由一些說明它是什麼類型的密鑰或簽名的資訊進行註釋。密鑰或簽名類型由OID傳達。

顯然,由於有兩種使用 RSA 密鑰的標準簽名方案(RSA-PKCS#1v1.5 和 RSA-PSS),它們都有自己的 OID。不太明顯的是,RSA 密鑰也有多種密鑰類型。有一個稱為 OID rsaEncryption,它允許將密鑰用於任何標準加密或(儘管名稱)簽名方案。並且有一個稱為 OID 的 OID id-RSASSA-PSS,表示該密鑰只能用於 PSS 簽名。這在RFC 4055中有解釋。除了將密鑰的使用限制在 RSA-PSS 簽名方案系列之外,id-RSASSA-PSS用於標識 RSA 密鑰而不是rsaEncryption允許證書指示使用哪些方案參數(MGF1、其雜湊和其他很少使用的參數)。擁有不同的密鑰 OID 的原因是,如果您使用rsaEncryption那麼沒有辦法指定密鑰只能用於 PSS,如果有人發現用 PKCS#1v1.5 簽名的東西,那麼它一定是利用 PKCS#1v1.5 中的弱點進行的偽造。(PKCS#1v1.5在正確實施的情況下沒有已知的弱點,但有可能有一天會發現,PKCS#1v1.5驗證很難正確實施。)

那麼這與 TLS 有什麼關係呢?一些 TLS 實現使用 X.509 解析器,它只辨識rsaEncryption. 所以他們在發送簽名算法擴展時不包括rsa_pss_pss_sha256值,它們只包括rsa_pss_rsae_sha256(如果他們支持的話),其中rsae部分代表“rsaEncryption在證書中編碼”。其他人可能認為rsaEncryption是遺留的,並且他們不包括rsa_pss_rsae_sha256, 僅rsa_pss_pss_sha256(如果他們支持它),其中第二個pss代表“id-RSASSA-PSS在證書中編碼”。

引用自:https://crypto.stackexchange.com/questions/58680