我正在寻找一种方法,使用户能够使用提供给他/她的初始密钥生成一对公钥/私钥。我不知道这是所谓的分级密钥生成还是多级密钥生成或其他。对于较高级别的密钥能够解密较低级别的数据并不重要,我只需要使用另一个密钥来生成该对。使用初始密钥生成公钥/私钥对
我看过一些文章,但都是理论上的。有没有办法实现这个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) –