我正在寻找一种方法,使用户能够使用提供给他/她的初始密钥生成一对公钥/私钥。我不知道这是否称为分层密钥生成或多级密钥生成或其他。对于更高级别的密钥来说,能够解密较低级别的数据并不重要,我只需要使用另一个密钥生成该对。
我看过一些文章,但它们都只是理论上的。有没有办法为RSA实现这一目标?
答案 0 :(得分:3)
实际上很容易。
生成RSA密钥对的算法归结为找到一组大的素数,它们满足一些代数属性并且具有适当的大小。 如果需要2048位RSA密钥,通常会查找2个素数,每个素数的长度为1024位。
查找素数的过程是反复试验:您随机选择适当大小的整数,并测试它是否为素数。如果不是,请重试。
在现实世界中,驱动算法的随机生成器是一个确定性的PRNG,它带有适当熵的秘密(例如128位真随机性)。
在您的情况下,PRNG种子可以来自用户秘密,甚至来自另一个密钥(前提是它是秘密的)。应使用HKDF,PBKDF2等盐渍KDF进行推导。
您没有指定使用哪个加密库:不管它是什么,您必须清楚它如何绘制随机性以及如何定义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))
要记住的缺点是: