2010-09-28 59 views
4

我想使用非對稱加密算法,但我需要它具有較短的密鑰大小(不像RSA至少是384)。 我需要它約20個。 這可能嗎?自定義非對稱加密算法

+4

密鑰越短,代碼越快被破壞。即使使用最慢的解密算法,20位密鑰也會在幾秒鐘內破裂。 – cHao 2010-09-28 12:02:44

+1

你能解釋一下爲什麼你想做這個看起來很瘋狂的事情?什麼可能的價值是*強加密*弱鍵*? – 2010-09-28 14:15:41

回答

3

有幾種方法可以獲得短密鑰大小。

1. RSA

甲RSA公鑰在於一個大數目Ñ(下稱 「模量」)和一個(通常很小)數Ë(公共指數)。 e可以小到3,並且在一個關閉的設置中(您可以控制密鑰生成),您可以強制使用常規的和,這對每個人都是一樣的。 n的典型尺寸是1024位(即128字節)。

n是兩個素數的乘積(n = p * q)。的pq知識就足以重建私鑰(標稱值d這是Ë模的乘法逆P-1Q-1)。假設ň衆所周知,知識p的本身就足以(如果你知道ñp,你可以計算q用一個簡單的除法)。爲了保證安全,和和q應該有相似的大小,所以即使通過取兩者中的較小者,仍然需要存儲大約512位左右 - 即64位)。

也有人建議選擇一個小的d(「私人指數」)。但這使得基本上是隨機的,因此很大;您不能再使用傳統的小值和。這基本上使公鑰大小加倍。另外,迫使小d可以使鍵弱(它已被證明是這樣的,當d的大小是ñ規模不超過29%,但不以任何證明方式是d的大小爲的大小n是安全的)。這通常被認爲是一個壞主意。

2. DSA /的Diffie-Hellman

DSA是一個數字簽名算法。 Diffie-Hellman是一種密鑰交換算法。兩者都是「非對稱加密算法」,您可以根據自己的需要使用其中一種或另外兩種。在這兩種情況下,都有一個公共數學小組(對於基本的DSA和DH,模數大素數p;橢圓曲線變體使用橢圓曲線作爲組);公鑰是一個羣組元素,私鑰是相對於常規發生器的該元素的離散對數。換句話說,給出一個素數pgp(它們可以由所有密鑰持有者共享,甚至);私鑰是對應於公鑰的數字x y = g x mod p。私鑰是以小素數q爲模。 q是已知的並且必須足夠大以便擊敗通用離散對數算法;在實踐中,我們想要一個160位或更多的q

這意味着一個私鑰可以容納大約20個字節。這不是20位十進制數字,但更接近。

3.與任何加密算法

當你生成密鑰對,你這樣做:

  1. 確定性的過程;
  2. 隨機位的來源。

例如,對於RSA,你產生p並通過創建大小合適的隨機奇數和循環,直到一個素數被發現q。對於一個給定的隨機源,整個過程是確定性的:給定相同的隨機位,這將找到相同的素數pq

因此,您可以開發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位數字。低於這個水平的東西本質上是脆弱的,這是不可避免的。

標準警告:如果上述任何內容對您而言並不明顯或清晰,那麼請不要考慮實施它。加密算法的實現是棘手的,尤其是因爲最致命的錯誤不能被測試(這不是因爲程序運行並且似乎正常工作以致它不包含安全弱點)。

4

這是對密鑰大小的.NET限制; RSA可以用於任何密鑰大小。這樣做沒有意義。

想一想,使用20位密鑰,您可以在2^20次嘗試中蠻力,並且這對今天的計算機來說太簡單了。

+0

讓我糾正我的陳述,我需要它約20位數字。 – Ali 2010-09-28 12:34:59

+0

讓我糾正我的陳述,我需要它約20位數。感謝您的答案。 – Ali 2010-09-28 12:35:22

2

如果您可以找到它的標準實現,您可能需要考慮使用橢圓曲線密碼學。它提供了與RSA相同程度的防暴力保護,並且密鑰長度大大縮短。

關於烹飪自己的密碼系統的標準聲明當然適用於此處。