我想使用非對稱加密算法,但我需要它具有較短的密鑰大小(不像RSA至少是384)。 我需要它約20個。 這可能嗎?自定義非對稱加密算法
回答
有幾種方法可以獲得短密鑰大小。
1. RSA
甲RSA公鑰在於一個大數目Ñ(下稱 「模量」)和一個(通常很小)數Ë(公共指數)。 e可以小到3,並且在一個關閉的設置中(您可以控制密鑰生成),您可以強制使用常規的和,這對每個人都是一樣的。 n的典型尺寸是1024位(即128字節)。
n是兩個素數的乘積(n = p * q)。的p和q知識就足以重建私鑰(標稱值d這是Ë模的乘法逆P-1和Q-1)。假設ň衆所周知,知識p的本身就足以(如果你知道ñ和p,你可以計算q用一個簡單的除法)。爲了保證安全,和和q應該有相似的大小,所以即使通過取兩者中的較小者,仍然需要存儲大約512位左右 - 即64位)。
也有人建議選擇一個小的d(「私人指數」)。但這使得基本上是隨機的,因此很大;您不能再使用傳統的小值和。這基本上使公鑰大小加倍。另外,迫使小d可以使鍵弱(它已被證明是這樣的,當d的大小是ñ規模不超過29%,但不以任何證明方式是d的大小爲的大小n是安全的)。這通常被認爲是一個壞主意。
2. DSA /的Diffie-Hellman
DSA是一個數字簽名算法。 Diffie-Hellman是一種密鑰交換算法。兩者都是「非對稱加密算法」,您可以根據自己的需要使用其中一種或另外兩種。在這兩種情況下,都有一個公共數學小組(對於基本的DSA和DH,模數大素數p;橢圓曲線變體使用橢圓曲線作爲組);公鑰是一個羣組元素,私鑰是相對於常規發生器的該元素的離散對數。換句話說,給出一個素數p和g模p(它們可以由所有密鑰持有者共享,甚至);私鑰是對應於公鑰的數字x y = g x mod p。私鑰是以小素數q爲模。 q是已知的並且必須足夠大以便擊敗通用離散對數算法;在實踐中,我們想要一個160位或更多的q。
這意味着一個私鑰可以容納大約20個字節。這不是20位十進制數字,但更接近。
3.與任何加密算法
當你生成密鑰對,你這樣做:
- 確定性的過程;
- 隨機位的來源。
例如,對於RSA,你產生p並通過創建大小合適的隨機奇數和循環,直到一個素數被發現q。對於一個給定的隨機源,整個過程是確定性的:給定相同的隨機位,這將找到相同的素數p和q。
因此,您可以開發PRNG種子的密鑰K,並將其用作密鑰生成過程的隨機源。只要您需要私鑰,就可以再次運行密鑰生成過程,使用K作爲輸入。瞧!您需要存儲的私鑰是K。
使用RSA,這使得私鑰使用非常昂貴(RSA密鑰生成並不容易)。但是,使用DSA/Diffie-Hellman,這將非常便宜:私鑰只是一個隨機數模q(羣組順序),它可以使用私有密鑰進行數字簽名的成本低得多非對稱密鑰交換。
這導致了以下程序:
- 的 「私鑰」,如存儲,是ķ。
- DSA/Diffie-Hellman的組參數在應用程序中被硬編碼;每個人都使用同一個組,這不是問題。羣組順序是q,這是已知的至少160位的素數。如果使用橢圓曲線變體,那麼q是曲線的一個屬性,因此是給定的。
- 當您需要簽名或執行密鑰交換時(密鑰交換用於模擬非對稱加密),您計算SHA-512(K),這會產生512位序列。你取前半部分(256位),將其解釋爲一個數字(只要你總是使用相同的約定,就可以按照你的意願使用大端或小端約定),然後將其減少模q以獲得私人DSA密鑰。同樣,您可以使用SHA-512輸出的後半部分來獲取專用DH密鑰。
關鍵一代是有點偏頗,但這並不意味着很多安全問題。請注意,如果您需要一個DSA密鑰和一個DH密鑰,那麼您可以使用相同的組,但您不應該使用使用相同的私鑰(因此使用兩個SHA-512輸出的一半)。
應該有多大K?使用諸如SHA-512的散列函數,K可以是任意位的任意序列。但是,K應足夠寬以擊敗窮舉搜索。 1024位RSA密鑰或1024位DSA模數(DSA模數)提供的安全級別與80位對稱密鑰非常相似。同樣,DSA/DH的160位組訂單也提供相同的級別。 80位並不多;如果你想被認真對待,你不能低於這個水平。這意味着K應該在至少2個可能的密鑰空間中選擇;換句話說,如果選擇K作爲統一的隨機字節,則它必須至少有10個字節長。用十進制數字,你至少需要24位數字。低於這個水平的東西本質上是脆弱的,這是不可避免的。
標準警告:如果上述任何內容對您而言並不明顯或清晰,那麼請不要考慮實施它。加密算法的實現是棘手的,尤其是因爲最致命的錯誤不能被測試(這不是因爲程序運行並且似乎正常工作以致它不包含安全弱點)。
如果您可以找到它的標準實現,您可能需要考慮使用橢圓曲線密碼學。它提供了與RSA相同程度的防暴力保護,並且密鑰長度大大縮短。
關於烹飪自己的密碼系統的標準聲明當然適用於此處。
- 1. 非對稱加密
- 2. 非對稱加密
- 3. 自定義Python加密算法
- 4. 非對稱加密密鑰
- 5. 對稱密鑰加密算法
- 6. 結合對稱和非對稱加密
- 7. 在Java API中可用的最佳非對稱加密算法?
- 8. 對稱加密算法功能
- 9. 對稱加密密鑰與非對稱密鑰-ssl
- 10. 在Rijndael加密算法中創建自定義長度密碼
- 11. 非對稱密鑰加密算法如何保持單向解密和加密功能?
- 12. x509非對稱算法的證書密鑰
- 13. 非對稱加密差異 - Android vs Java
- 14. 使用PHP的非對稱加密
- 15. mcrypt是否支持非對稱加密?
- 16. 帶有非對稱加密的SQLCipher
- 17. PCL項目中的非對稱加密
- 18. lazarus中的非對稱加密
- 19. 非對稱加密使用AES爲iPhone
- 20. python X.509非對稱加密
- 21. 你推薦哪種C加密框架用於對稱和非對稱加密?
- 22. 針對嵌入式系統的對稱加密算法
- 23. 制定出加密算法
- 24. 自定義加密#2
- 25. 非對稱密鑰系統?
- 26. 使用自定義加密方法加密連接字符串
- 27. 反向稱爲XOR加密算法
- 28. Ruby中的非對稱確定性加密(RSA)
- 29. 的WebSphere自定義密碼加密
- 30. 有沒有辦法將自定義加密算法添加到nodejs加密模塊中?怎麼樣?
密鑰越短,代碼越快被破壞。即使使用最慢的解密算法,20位密鑰也會在幾秒鐘內破裂。 – cHao 2010-09-28 12:02:44
你能解釋一下爲什麼你想做這個看起來很瘋狂的事情?什麼可能的價值是*強加密*弱鍵*? – 2010-09-28 14:15:41