2013-08-16 130 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