
Kerckhoffs 原则:密码系统的安全性应仅依赖密钥
来源标题:Kerckhoffs's Principle
荷兰密码学家 Auguste Kerckhoffs 在 19 世纪提出 Kerckhoffs 原则,主张密码系统的安全应只依赖密钥,即使系统其它细节全部公开也不影响安全性。Claude Shannon 后来将其表述为「敌人知道系统」,即设计系统时应假设对手已完全熟悉它。这一原则被密码学界广泛接受,与依赖保密的「隐匿式安全」相对。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
Kerckhoffs 原则(也称 Kerckhoffs desideratum、假设、公理、信条或定律)由荷兰密码学家 Auguste Kerckhoffs 在19世纪提出。该原则认为,一个密码系统应当是安全的,即使关于该系统的一切信息——除了密钥——都为公众所知。这一理念被密码学家广泛接受,与之相对的是“通过隐匿实现安全”,后者则不被认可。
美国数学家 Claude Shannon 将 Kerckhoffs 原则表述为“敌人了解系统”,[1] 即“人们应当在设计系统时假设敌人会立即完全熟悉该系统”。在这种表述形式下,它被称为 Shannon 箴言。
美国研究者兼教授 Steven M. Bellovin 的另一种表述是:
换言之——设计你的系统时,假设你的对手对其了如指掌。(NSA 国家计算机安全中心的一位前官员告诉我,那里的标准假设是:任何新设备的序列号1都会被送到克里姆林宫。)[2]
电报的发明彻底改变了军事通信,使需要防范敌人的消息数量急剧增加,这促使了野战密码的发展——这类密码必须易于使用,且不能依赖容易被战场缴获的大部头机密码本。[3] 正是在这样的环境中,Kerckhoffs 的要求得以形成。
Auguste Kerckhoffs 是 HEC Paris 的德语教授。[4] 1883年初,Kerckhoffs 的文章《La cryptographie militaire》[5] 在《军事科学杂志》上分两部分发表,文中他提出了军用密码的六条设计规则。[6] 从法文翻译过来,它们分别是:[7][8]
鉴于计算机能够执行复杂加密,其中一些规则已不再适用。第二条规则,即如今所称的 Kerckhoffs 原则,仍然至关重要。[9]
Kerckhoffs 将密码学视为隐写编码的竞争对手,并且是比后者更好的替代方案——隐写编码在19世纪常用于隐藏军事消息的含义。编码方案的一个问题在于,它们依赖于人为持有的秘密,例如“字典”,这些字典会揭示诸如词语的秘密含义等信息。类似隐写的字典一旦泄露,就会永久性地危及相应的编码系统。另一个问题是,随着持有秘密的用户数量增加,暴露的风险也随之增加。
相比之下,19世纪的密码学使用简单的表格来实现字母数字字符的置换,通常给出可由密钥修改的行列交叉点,而密钥通常较短、为数字形式,且可以记在人脑中。该系统被认为是“不可破译的”,因为表格和密钥本身并不传达含义。只有当匹配的表格、密钥和消息在相关时间范围内落入敌手时,秘密消息才可能被泄露。Kerckhoffs 认为战术消息的相关性只有几个小时。系统未必会被攻破,因为其组成部分(即字母数字字符表和密钥)可以很容易地更换。
使用安全的密码学,本应是用一个远为可控的问题——保持相对较小的密钥安全——来取代保持消息安全这一难题。一个系统如果要求对整个密码系统设计这样庞大而复杂的东西长期保密,显然无法实现该目标。它只是用一个难题替换了另一个难题。然而,如果一个系统即使在敌人知晓除密钥以外的一切信息时仍然安全,那么所需要做的就只是管理好密钥的保密。[10]
一个广泛使用的系统,其内部细节可能通过大量途径被发现。最明显的是,有人可能通过贿赂、勒索或以其他方式威胁员工或客户来解释该系统。例如在战争中,一方很可能会俘获另一方的部分设备和人员。每一方也会利用间谍收集情报。
如果某种方法涉及软件,有人可以进行内存转储,或在调试器控制下运行该软件,以理解该方法。如果使用的是硬件,有人可以购买或窃取部分硬件,并构建任何所需的程序或装置来测试它。硬件也可以被拆解,以便在显微镜下检查芯片细节。
有人从 Kerckhoffs 原则中概括出:“为确保系统安全而必须保守的秘密越少、越简单,维护系统安全就越容易。” Bruce Schneier 将其与一种信念联系起来:所有安全系统都必须设计成尽可能优雅地失效:
Kerckhoffs 原则不仅适用于代码和密码,也适用于一般安全系统:每一个秘密都会创造一个潜在的故障点。换言之,保密是脆弱性的一个主要原因——因此也是使系统容易发生灾难性崩溃的因素。相反,开放则提供了延展性。[11]
任何安全系统都关键性地依赖于对某些事物保密。然而,Kerckhoffs 原则指出,被保密的事物应当是那些即使无意泄露、更改代价也最低的事物。[9]
例如,一种密码算法可能由广泛分发给用户的硬件和软件来实现。如果安全性依赖于对该算法保密,那么泄露就会在开发、测试和分发新算法的实现方面带来重大的后勤困难——它是“脆弱的”。另一方面,如果保持算法秘密并不重要,只有与算法配合使用的密钥必须保密,那么密钥泄露只需要更简单、成本更低的新密钥生成和分发过程。[12]
(原文较长,此处译出前 6000 字,完整内容请点「打开原文」。)
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。