我主要使用以下命令生成 RSA 密钥对:
ssh-keygen -t rsa -b 4096 -C "someemail@hostname.com"
它产生一个公私 RSA 密钥对。如果我一次又一次地运行这个命令,我会得到不同的密钥对。
生成的所有密钥对是否
ssh-keygen都是唯一的(此时不考虑冲突)?如果是,如何
ssh-keygen确保不同人在不同时间生成的所有密钥对都是唯一的并且最终不会相同?如果不是,密钥对的唯一性取决于哪些因素?除了密钥长度空间和PRNG。
我主要使用以下命令生成 RSA 密钥对:
ssh-keygen -t rsa -b 4096 -C "someemail@hostname.com"
它产生一个公私 RSA 密钥对。如果我一次又一次地运行这个命令,我会得到不同的密钥对。
生成的所有密钥对是否ssh-keygen都是唯一的(此时不考虑冲突)?
如果是,如何ssh-keygen确保不同人在不同时间生成的所有密钥对都是唯一的并且最终不会相同?
如果不是,密钥对的唯一性取决于哪些因素?除了密钥长度空间和PRNG。
ssh-keygenerates 的所有密钥对是否都是唯一的(此时不考虑冲突)?
是的,每个密钥对都是唯一的,概率远高于 99.99999%。这主要是由于密钥空间的大小和所使用的 CSPRNG 的质量(见下文)。
如果是,ssh-keygen 如何确保不同人在不同时间生成的所有密钥对都是唯一的并且最终不会相同?
它没有做出这样的保证,但无论如何它都可以有效地保证是独一无二的。这是因为操作系统使用高质量的 CSPRNG(加密安全伪随机数生成器)算法,该算法比大多数语言的开箱即用 PRNG 更可靠(意味着更不可预测)。
如果不是,密钥对的唯一性取决于哪些因素?除了密钥长度空间和 PRNG。
独特性来自CSPRNG,而不是“常规” PRNG。不同之处在于熵的选择。
PRNG 只需要一些种子(如果程序员是懒惰的,通常是“0”,或者是一些任意的度量,例如从 time() 开始),每次请求位时都会对位进行洗牌,然后进行更多的洗牌。它只是“看起来”是随机的,直到您观察输出一段时间,此时您可以确定 (a) 使用了哪个种子,以及 (b) 将从该特定观察到的下一个无限数量的输出压缩包。
相比之下,CSPRNG 运行的时间越长,熵就越大。它通过从多个设备获取定期读数并对传入数据应用一些非常复杂的抽象来生成“随机”位池来实现这一点。这意味着,如果您在加载此答案时运行的是 Linux 风格,那么此答案的某些位现在可能会漂浮在您的熵池中(无论如何,直到它们被使用)。
当然,从逻辑上讲,这些位是随机的,因为计算机实际上没有能力做“随机”的事情(它们总是精确地遵循给它们的指令),但它们仍然是随机的,因为没有通用算法由人或机器设计的可能希望确定原始熵数,随着随机数的产生而不断补充。
由于计算机经常以相当不可预测的顺序从网络、磁盘等接收不同类型的输入(由于延迟、重试、硬件的其他物理特性),因此两个系统不可能完美同步到CSPRNG 也将同步。类似地,除非你真的在调试内核,否则不可能预测 CSPRNG 的输出,而这样做的行为,或者试图报告当前状态,会改变 CSPRNG 的状态。
当然,官方文档对此非常清楚:这都是理论上的,因为我们无法证明任何密钥都不会生成两次。然而,找到一个重复的随机密钥的可能性是如此之大,以至于人们可能会说这确实是不可能的。