Encryption 使用初始密钥生成公钥/私钥对

Encryption 使用初始密钥生成公钥/私钥对,encryption,cryptography,rsa,public-key-encryption,Encryption,Cryptography,Rsa,Public Key Encryption,我正在寻找一种方法,使用户能够使用提供给他的初始密钥生成一对公钥/私钥。我不知道这是称为分层密钥生成还是多级密钥生成或其他什么。高级密钥能够解密低级密钥的数据并不重要,我只需要使用另一个密钥生成密钥对 我看过一些文章,但都是理论性的。有没有办法为RSA实现这一点 其实这很容易 生成RSA密钥对的算法归结为找到一组大的素数,这些素数满足一些代数性质,并且大小合适。 如果需要2048位RSA密钥,通常会查找2个素数,每个素数的大致长度为1024位 寻找素数的过程是反复试验:随机选取一个大小合适的整数

我正在寻找一种方法,使用户能够使用提供给他的初始密钥生成一对公钥/私钥。我不知道这是称为分层密钥生成还是多级密钥生成或其他什么。高级密钥能够解密低级密钥的数据并不重要,我只需要使用另一个密钥生成密钥对


我看过一些文章,但都是理论性的。有没有办法为RSA实现这一点

其实这很容易

生成RSA密钥对的算法归结为找到一组大的素数,这些素数满足一些代数性质,并且大小合适。 如果需要2048位RSA密钥,通常会查找2个素数,每个素数的大致长度为1024位

寻找素数的过程是反复试验:随机选取一个大小合适的整数,然后测试它是否为素数。如果不是,请重试

在现实世界中,驱动该算法的随机生成器是一个确定性PRNG,其种子带有适当熵的秘密(例如128位真实随机性)

在您的情况下,PRNG种子可以从用户密钥或甚至从另一个密钥(当然前提是它是机密的)派生。应使用盐腌KDF等进行衍生

您不需要指定使用哪个加密库:不管它是什么,您必须清楚它是如何绘制随机性的,以及如何定义PRNG的种子

示例(在Python2.x中):

从Crypto.PublicKey导入RSA
从Crypto.Hash导入HMAC
从结构导入包
#第一个密钥也可以从文件中读取
第一个密钥=RSA.generate(2048)
#在这里,我们将第一个密钥编码为字节,并采用独立于平台的格式。
#实际格式并不重要(在本例中为PKCS#1),但必须如此
#包括私钥。
编码的第一个密钥=第一个密钥。导出密钥('DER'))
seed_128=HMAC.new(编码的第一个密钥+b“应用程序:第二个密钥派生”).digest()
类别PRNG(对象):
定义初始化(self,seed):
self.index=0
self.seed=种子
self.buffer=b“”
定义调用(self,n):
而len(自缓冲区)pack(“当然有可能,但在这种情况下,很重要的一点是询问您为什么要这样做。对于无法使用随机生成的(可能是签名的)密钥的密钥,您希望如何处理该密钥?此外,这对于crypto.stackexchange.com来说更是一个问题(首先查看常见问题解答)。这个问题似乎离题了,因为它是关于密码学的(crypto.stackexchange.com)。我不明白如何以这种方式生成一对密钥。这两个RFC都指定只返回派生密钥的函数。我在Python中添加了一个小示例。
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))