我正在尋找一種方法,使用戶能夠使用提供給他/她的初始密鑰生成一對公鑰/私鑰。我不知道這是所謂的分級密鑰生成還是多級密鑰生成或其他。對於較高級別的密鑰能夠解密較低級別的數據並不重要,我只需要使用另一個密鑰來生成該對。使用初始密鑰生成公鑰/私鑰對
我看過一些文章,但都是理論上的。有沒有辦法實現這個RSA?
我正在尋找一種方法,使用戶能夠使用提供給他/她的初始密鑰生成一對公鑰/私鑰。我不知道這是所謂的分級密鑰生成還是多級密鑰生成或其他。對於較高級別的密鑰能夠解密較低級別的數據並不重要,我只需要使用另一個密鑰來生成該對。使用初始密鑰生成公鑰/私鑰對
我看過一些文章,但都是理論上的。有沒有辦法實現這個RSA?
實際上這很容易。
用於生成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))
缺點要記住是:
我不明白一對密鑰怎麼可以通過這種方式生成,這兩個RFC指定只返回派生密鑰的函數。 –
我在Python中添加了一個小例子。 – SquareRootOfTwentyThree
這是當然可能,但在這種情況下,詢問*爲什麼要這麼做非常重要,你想用隨機生成的密鑰(可能是已簽名的)無法完成的密鑰做什麼?此外,這個更多的是crypto.stackexchange.com的問題(首先查看FAQ) –
這個問題似乎是無關緊要的,因爲它是關於密碼學的(crypto.stackexchange.com) –