作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在寻找一种方法,使用户能够使用提供给他/她的初始 key 生成一对公钥/私钥。我不知道这是否称为分层 key 生成或多级 key 生成或其他名称。较高级别的 key 能够解密较低级别的数据并不重要,我只需要使用另一个 key 生成该对即可。
我看过一些文章,但它们都只是理论上的。有没有办法为 RSA 实现这一目标?
最佳答案
其实很简单。
生成 RSA key 对的算法归结为找到一组满足某些代数性质且大小合适的大素数。如果您需要 2048 位 RSA key ,您通常会寻找 2 个素数,每个素数的粗略长度为 1024 位。
寻找质数的过程是反复试验:您随机选择一个适当大小的整数,然后测试它是否是质数。如果不是,则重试。
在现实世界中,驱动算法的随机生成器是一个确定性的 PRNG,它以适当的熵(例如,128 位真正随机性)的 secret 作为种子。
在您的情况下,PRNG 种子可以从用户 secret 或什至从另一个 key 派生(当然前提是它是 secret 的)。应该使用盐渍 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))
要记住的缺点是:
关于encryption - 使用初始 key 生成公钥/私钥对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18264314/
我是一名优秀的程序员,十分优秀!