关键的区别在于保密的内容。
以 RSA 为例。RSA 的核心原理是简单的数学运算。任何有一点数学知识的人都可以弄清楚 RSA 在功能上是如何工作的(数学几乎有半个千年的历史了)。需要更多的想象力和经验才能弄清楚如何利用它来实现安全性,但它至少已经独立完成了两次(由 Rivest、Shamir 和 Adleman 完成,几年前由Clifford Cocks完成)。如果您设计了类似 RSA 的东西并对其保密,那么其他人很有可能会足够聪明地弄清楚它。
另一方面,私钥是随机生成的。如果正确完成,随机生成可确保无法用人类可用的计算能力重建秘密。再多的聪明也不会允许任何人重建一个随机位的秘密字符串,因为该字符串没有直觉的结构。
密码算法是出于聪明而发明的,具有很大程度上共同的目标(保护一些数据,廉价地实施算法,......)。聪明的人很有可能会采用相同的算法。另一方面,秘密位的随机字符串很多,根据定义,人们不会想出相同的随机字符串¹。因此,如果您设计自己的算法,您的邻居很有可能也会设计相同的算法。如果你和你的朋友分享你的算法,然后想和他私下交流,你需要一个新的算法。但是,如果您生成密钥,它将与您的邻居和您的伙伴的不同。将随机密钥保密肯定有潜在价值,而对算法保密则不然。
关于密钥保密的第二点是它可以被测量。使用好的随机生成器,如果您生成一个随机的 n 位字符串并将其保密,那么其他人一次尝试就可以找到它的概率是 1/2^n。如果您设计一种算法,则无法衡量其他人发现它的风险。
RSA 私钥不是一个简单的随机字符串——它们确实有一些结构,是一对素数。然而,熵的数量——一定大小的可能 RSA 密钥的数量——大到足以使一个几乎无法猜测。(至于 RSA 密钥实际上不可能从公钥和一堆明文和密文中重建,这是我们无法从数学上证明的事情,但我们相信是这样,因为很多聪明人都尝试过但都失败了。但那是另一个故事。)
当然,这可以推广到任何密码算法。将随机字符串保密。发布巧妙的设计。
这并不是说一切都应该公开,除了一小部分是随机的比特。Kerckhoff 的原则并没有这么说——它说设计的安全性不应该依赖于设计的保密性。虽然密码算法最好发布(你应该等待十年左右才能使用它们,看看是否有足够多的人没有破解它们),还有其他最好保密的安全措施,特别是需要主动探测的安全措施弄清楚。例如,一些防火墙规则可以属于这一类;但是,如果防火墙不能针对知道规则的攻击者提供保护,那将是无用的,因为最终有人会弄清楚它们。
¹虽然从数学上讲这不是真的,但您确实可以打赌。