2013-08-16 128 views
1

我正在尋找一種方法,使用戶能夠使用提供給他/她的初始密鑰生成一對公鑰/私鑰。我不知道這是所謂的分級密鑰生成還是多級密鑰生成或其他。對於較高級別的密鑰能夠解密較低級別的數據並不重要,我只需要使用另一個密鑰來生成該對。使用初始密鑰生成公鑰/私鑰對

我看過一些文章,但都是理論上的。有沒有辦法實現這個RSA?

+0

這是當然可能,但在這種情況下,詢問*爲什麼要這麼做非常重要,你想用隨機生成的密鑰(可能是已簽名的)無法完成的密鑰做什麼?此外,這個更多的是crypto.stackexchange.com的問題(首先查看FAQ) –

+1

這個問題似乎是無關緊要的,因爲它是關於密碼學的(crypto.stackexchange.com) –

回答

2

實際上這很容易。

用於生成RSA密鑰對的算法歸結爲找到一組大的素數,它們滿足一些代數性質並且具有適當的大小。 如果你需要一個2048位的RSA密鑰,你通常會尋找2個素數,每個數字都有1024位的粗略長度。

找到素數的過程是反覆試驗:你隨機選擇一個合適大小的整數,並測試它是否爲素數。如果不是,則重試。

在現實世界中,驅動該算法的隨機生成器是一個確定的PRNG,其被嵌入適當的熵的祕密(例如128位的真隨機性)。

就你而言,PRNG種子可以從用戶機密或甚至從另一個密鑰中獲得(當然,前提是它是祕密的)。派生應該用一個鹽漬的KDF執行,如HKDF,PBKDF2等。

您不指定使用哪個加密庫:不管它是什麼,您必須清楚它如何繪製隨機性以及如何定義種子PRNG。

例(在Python 2.x中):

from Crypto.PublicKey import RSA 
from Crypto.Hash import HMAC 
from struct import pack 

# The first key could also be read from a file 
first_key = RSA.generate(2048) 

# Here we encode the first key into bytes and in a platform-independent format. 
# The actual format is not important (PKCS#1 in this case), but it must 
# include the private key. 
encoded_first_key = first_key.exportKey('DER') 

seed_128 = HMAC.new(encoded_first_key + b"Application: 2nd key derivation").digest() 

class PRNG(object): 

    def __init__(self, seed): 
    self.index = 0 
    self.seed = seed 
    self.buffer = b"" 

    def __call__(self, n): 
    while len(self.buffer) < n: 
     self.buffer += HMAC.new(self.seed + 
           pack("<I", self.index)).digest() 
     self.index += 1 
    result, self.buffer = self.buffer[:n], self.buffer[n:] 
    return result 

second_key = RSA.generate(2048, randfunc=PRNG(seed_128)) 

缺點要記住是:

  1. 導出密鑰將獲得一旦第一密鑰被泄露泄露。
  2. 導出密鑰不能超過第一個鍵強(如,算法不會奇蹟般地產生的熵。如果祕密密鑰或密碼是短暫的,你最終弱導出密鑰。
+0

我不明白一對密鑰怎麼可以通過這種方式生成,這兩個RFC指定只返回派生密鑰的函數。 –

+0

我在Python中添加了一個小例子。 – SquareRootOfTwentyThree