用RSA(n,d,e),你能猜出n的值嗎,當它沒有公佈時;給定一些有符號值: (V_i ^ e) % n
如果您有一個 RSA 密鑰對
(n,d,e)
,並且您不n
向全世界發布,那有多少安全性?例如,如果我收到一組使用密鑰對簽名的消息,我能猜到n
嗎?對於一個真正的實際問題,我必須考慮這一點。我正在嘗試用更簡單的方法替換 JWT 方案。我選擇了常用工具:Sha256、RSA 和 AESGCM 來實現。我希望令牌簽名不可能被忽略,並且我希望聲稱只能對那些獲得(不完全)公鑰的人進行解碼
(n,e)
。簡而言之,我正在挑戰常見的密碼學實踐,假設這種形式的簽名是安全的:(plaintext,Sign(Hash(plaintext))
如果您可以向我展示 json 聲明,它們必須是真實的,因為您必須使用驗證過程來解密它們。
首先,網路令牌(不是嚴格意義上的 JWT,但類似)是一個元組:
(keyId, encryptedClaims, Sig)
.
V = xor( k, Hash(encryptedClaims) )
Sig = (V^d)%n
生成了簽名,因為我們擁有私鑰 (n,d),並且在實踐中,我們也擁有公鑰(n,e)
,因為e
眾所周知。我們可以選擇不分n
發給所有人。
k
任何人都可以使用(部分)公鑰恢復(n,e)
。驗證簽名,並與密文的雜湊進行異或;證明你做了這兩件事:k = xor( ((Sig^e)%n)
,Hash(encryptedClaims))
。使用
k
,我們可以解碼聲明;它可以證明我們對密文進行了雜湊處理並驗證了簽名。通常假設 RSA 公鑰的公鑰是向全世界廣播的。但是看起來您可以使用私鑰來授予驗證者的訪問權限,而無需授予中間伺服器解密聲明的權利。即使e
在協議中眾所周知,您也n
只能提供給合法的驗證者。這最終使用 RSA 作為管道,私鑰的所有者可以寫入管道,而擁有公鑰的每個人都可以從管道中讀取。使用從驗證過程中生成解密密鑰的方案;我們使用 RSA 使得無法在不驗證聲明的情況下提取有關使用者的聲明。將此與典型的簽名驗證方案進行比較,在該方案中,使用者在驗證之前獲得明文進行散列;在這種情況下,我們無法強迫他們提供任何形式的見證來遵循協議和驗證簽名。作為旁注,似乎不可能強制驗證者在聲明中查找日期(即:
exp
欄位)。但這修復了 JWT 中的一個漏洞,在該漏洞中提取聲明以使簽名檢查消失是微不足道的。請注意,對於其中一些功能,我假設您無法查看一堆
Sig
值並猜測n
. 這將是phi
(p-1)(q-1)
通過查看一堆有符號值來猜測的。
是的,對於任何簽名 $ S $ , 如果我們知道相關值 $ V $ 我們知道 $$ S^e\equiv V\pmod N. $$ 這告訴我們 $ N|(S^e-V) $ 其中括號中的數字通常為幾億位大小,雖然很大,但並不超出通用電腦的範圍。給定幾個(兩個可能就足夠了)對 $ (S_i,V_i) $ ,我們可以計算 $ \mathrm{GCD}(S_0^e-V_0,\ldots,S_m^e-V_m) $ 以壓倒性的機率是 $ N $ (對於更大的 $ m $ 將只是 $ N $ ).