应用密码学

前言

    世界上有两种密码:一种是防止你的小妹妹看你的文件;另一种是防止当局者阅读你的文件资料。这本书写的是后一种情况。

    如果把一封信锁在保险柜中,把保险柜藏在纽约的某个地方…,然后告诉你去看这封信。这并不是安全,而是隐藏。相反,如果把一封信锁在保险柜中,然后把保险柜及其设计规范和许多同样的保险柜给你,以便你和世界上最好的开保险柜的专家能够研究锁的装置。而你还是无法打开保险柜去读这封信,这样才是安全的。

    许多年来,这种密码学是军队独家专有的领域。美国国家安全局以及前苏联、英国、法国、以色列及其它国家的安全机构已将大量的财力投入到加密自己的通信,同时又千方百计地去破译别人的通信的残酷游戏之中,面对这些政府,个人既无专门知识又无足够财力保护自己的秘密。

    在过去20年里,公开的密码学研究爆炸性地增长。从二次世界大战以来,当普通公民还在长期使用经典密码时,计算机密码学成为世界军事的独占领域。今天,最新的计算机密码学已应用到军事当局的高墙之外,现在非专业人员都可以利用密码技术去阻止最强大的敌人,包括军方的安全机构。

    平头百姓真的需要这种保密性吗?是的,他们可能正策划一次政治运动,讨论税收或正干一件非法的事情;他们也可能正设计一件新产品,讨论一种市场策略,或计划接管竞争对手的生意,或者,他们可能生活在一个不尊重个人隐私权的国家,也可能做一些他们自己认为并非违法实际却是非法的事情。不管理由是什么,他的数据和通信都是私人的、秘密的,与他人无关。

    这本书正好在混乱的年代发表。1994年,克林顿当局核准了托管加密标准(包括Clipper芯片和Fortezza卡),并将数字电话法案签署成为法律。这两个行政令企图确保政府实施电子监控的能力。

    一些危险的Orwellian假设在作祟:即政府有权侦听私人通信,个人对政府保守秘密是错误的,如果可能,法律总有能力强制实施法院授权的监控,但是,这是公民第一次被强迫采取积极措施,以使他们自己能被监控。这两个行政令并不是政府在某个模糊范围内的简单倡议,而是一种先发制人的单方面尝试,旨在侵占以前属于人民的权力。

    Clipper和数字电话不保护隐私,它强迫个人无条件地相信政府将尊重他们的隐私。非法窃听小马丁·路德·金电话的执法机构,同样也能容易地窃听用Clipper保护的电话。最近,地方警察机关在好些管区内都有因非法窃听而被控有罪或被提出民事诉讼的,这些地方包括马里兰、康涅狄格、佛蒙特、佐治亚、密苏里和内华达。为了随时方便警察局的工作而配置这种技术是很糟糕的想法。

    这儿给我们的教训是采用法律手段并不能充分保护我们自己,我们需要用数学来保护自己。加密太重要了,不能让给政府独享。

    本书为你提供了一些可用来保护自己隐私的工具。提供密码产品可能宣布为非法,但提供有关的信息绝不会犯法。

怎样读这本书?

    我写《应用密码学》一书是为了在真实介绍密码学的同时给出全面的参考文献。我尽量在不损失正确性的情况下保持文本的可读性。这本书不想成为一本数学书。虽然我无意给出任何错误信息,但匆忙中理论难免有失严谨。对形式方法感兴趣的人,可以参考大量的学术文献。

    第一章介绍了密码学,定义了许多术语,简要讨论了计算机出现前密码学的情况。

    第一篇(第二~六章)描述密码学的各种协议:人们能用密码学做什么。协议范围从简单(一人向另一人发送加密消息)到复杂(在电话上抛掷硬币)再到深奥的(秘密的和匿名的数字货币交易)。这些协议中有些一目了然,有些却十分奇异。密码术能够解决大多数人绝没有认识到的许多问题。

    第二篇(第7~10章)讨论密码技术。对密码学的大多数基本应用来说,这一部分的四章都是很重要的。第七章和第八章讨论密钥:密钥应选多长才能保密,怎样产生、存储密钥,怎样处理密钥等等。密钥管理是密码学最困难的一部分,经常是保密系统的一个致命弱点;第九章讨论了使用密码算法的不同方法;第十章给出了与算法有关的细节:怎样选择、实现和使用算法。

    第三篇(第9~23章)列出了多个算法。第11章提供了数学背景,如果你对公开密钥算法感兴趣,这一章是需要了解的。如果你只想实现DES(或类似的东西),你可以跳过这一章;第12章讨论DES:DES算法、它的历史、它的安全性和它的一些变形;第13、14、15章讨论其它的分组算法。如果你需要比DES更保密的算法,请阅读IDEA和三重DES算法这节。如果你想阅读一系列比DES算法更安全的算法,就请读完整章;第16、17章讨论序列密码算法;第18章集中讨论单向hash函数;虽然讨论了好些单向hash函数,但MD5和SHA是最通用的;第19章讨论公开密钥加密算法。第20章讨论了公开密钥数字签名算法;第21章讨论了公开密钥鉴别算法;第22章讨论了公开密钥密钥交换算法。几种重要的公开密钥算法分别是RSA、DSA、Fiat-Shamir和Diffie-hellman算法;第23章有更深奥的公开密钥算法和协议。这一章的数学知识是非常复杂的,请系好你的安全带。

    第四篇(第24~25章)转向密码学的真实世界。第24章讨论这些算法和协议的一些实际实现;第25章接触到围绕密码学的一些政治问题,这些章节并不全面。

    此外,书中还包括在第三篇中讨论的10个算法的源代码清单,由于篇幅的限制,我不可能涉及所有的源代码,况且,密码的源代码不能出口(非常奇怪的是,国务院允许本书的第一版和源代码出口,但不允许含有同样源代码的计算机磁盘的出口)。配套的源代码盘包括的源代码比本书中列出的要多得多;这也许是除军事机构以外的最大的密码源代码集。我只能发送源代码盘给住在美国和加拿大的美国和加拿大公民,但我希望有一天这种情况会改变。如果你对这本书的实现或密码算法均感兴趣的话,设法得到这个磁盘。详细情况请看本书的最后一页。

    对这本书的一种批评,是它的广博性代替了可读性。这是对的,但我想给可能是偶然在学术文献或产品中需要一个算法的人提供一个参考。对于那些对教材更感兴趣的人,我只能抱歉。密码学领域正日趋热门,这是第一次把这么多资料收集在一本书中。即使这样,还是有许多东西限于篇幅舍弃了,我尽量保留了那些我认为是重要的、有实用价值的或者是有趣的专题,如果我对某一专题讨论不深,我会给出深入讨论这些专题的参考文献。

    笔者在写作过程中已尽力查出和根除书中的错误,但我相信不可能消除所有的错误。第二版肯定比第一版的错误少得多。谌误表可以从我这里得到,并且它被定期发往Usenet的新闻组sci.crypt。如果读者发现错误,请通知我,我将向发现每个错误的第一个人免费寄送一张源码盘,以示感谢。

致谢

    为本书提供帮助的人真是数不胜数,他们都值得提及。我谨感谢Don Alvarez, Ross Anderson, Dave Balenson, Karl Barrus, Steve Bellovin, Dan Bernstein, Eli Biham, Joan Boyar, Karen Cooper, Whit Diffie, Joan Feigenbaum, Phil Karn, Neal Kobitz, Xuejia Lai, Tom Leranth, Mike Markowitz, Ralph Merkle, Bill Patton, Peter Pearson, Charles Pfleegar, Ken Pizzini, Bart Preneel, Mark Riordan, Joachim Schurman和Marc Schwartz感谢他们对本书第一版的审阅和校订。感谢Marc Vauclair将它译成法文。感谢Abe Abraham, Ross Anderson, Dave Banisar, Steve Bellovin, Eli Biham, Matt Bishop, Matt Blaze, Gary Carter, Jan Camenisch, Claude Crepeau, Joan Daemen, Jorge Davila, Ed Dawson, Whit Diffie, Carl Ellison, Joan Feigenbaum, Niels Ferguson, Matt Franklin, Rosario Gennaro, Dieter Gollmann, Mark Goresky, Richard Graveman, Stuart Haber, Jingman He, Bob Hogue, Kenneth Iversen, Markus Jakobsson, Burt Kaliski, Phil Karn, John Kelsey, John Kennedy, Lars Knudsen, Paul Kocher, John Ladwig, Xuejia Lai, Arjen Lenstra, Paul Leyland, Mike Markowitz, Jim Massey, Bruce McNair, William Hugh Murray, Roger Needham, Clif Neuman, Kaisa Nyberg, Luke O’Connor, Peter Pearson, Rene Peralta, Bart Preneel, Yisrael Radai, Matt Robshaw, Michael Roe, Phil Rogaway, Avi Rubin, Paul Rubin, Selwyn Russell, Kazue Sako, Mahmoud Salmasizadeh, Markus Stadler, Dmitry Titov, Jimmy Upton, Marc Vauclair, Serge Vaudenay, Gideon Yuval, Glen Zorn和其它不愿透露姓名的政府官员们对第2版的审阅和校订。感谢Lawrie Brown, Leisa Condie, Joan Daemen, Peter Gutmann, Alan Insley, Chris Johnston, John Kelsey, Xuejia Lai, Bill Leininger, Mike Markowitz, Richard Outerbridge, Peter Pearson, Ken Pizzini, Colin Plumb, RSA Data Security, Inc.,Michael Wood和Phil Zimmermann提供的源代码。感谢Paul MacNerland为第一版制图;Karen Cooper为第二版排版;Beth Friedman为第二版核对;Carol Kennedy为第二版做索引;sci.crypt和Cypherpunks邮件列表的读者们在主意、答问和谌误方面的支持;Randy Seuss提供的Internet接入;Jeff Duntemann和Jon Erickson给我鼓励、支持、交谈和友情和食粮让我动手写作;还要感谢AT&T公司开除我,使这一切成为可能。没有这些人的帮助,仅靠我个人是不可能写出好书的。

B.施柰尔        

作者简介:

    BRUCE SCHNEIER是Counterpane Systems公司的总裁,该公司位于伊利诺依州的Oak公园,是一个密码学和计算机安全方面的专业咨询公司。Bruce还是《电子邮件安全》(E-Mail Security )和《保护您的计算机》(Protect Your Macintosh)两书的作著。在主要的密码学杂志上已发表数十篇论文。是Dr.Dobb’s杂志责任编辑之一,负责“算法幽经”栏目。同时担任《计算机和通信安全评论》(Computer and Communication Security Reviews)的编辑。Bruce是“国际密码研究协会”的理事会成员、“电子隐私信息中心”的顾问团成员和“新安全范例工作组”(New Security Paradigms Workshop)程序委员会成员。此外,他还经常开办密码学、计算机安全和隐私保护方面的学术讲座。

目录

    序 I
    W.迪菲(Whitfield Diffie) I
    前  言 IV
    怎样读这本书? V
    致谢 VI
    作者简介 VII

    第一章  基础知识 1

    1.1 专业术语 1
    1.2 隐写术 7
    1.3 代替密码和换位密码 8
    1.4 简单异或 11
    1.5 一次一密乱码本 12
    1.6 计算机算法 14
    1.7 大数 14

    第一篇 密码协议 16

    第二章  协议结构模块 16

    2.1  协议介绍 16
    2.2  使用对称密码术的通信 21
    2.3  单向函数 22
    2.4  单向Hash函数 23
    2.5  使用公开密钥密码术的通信 24
    2.6  数字签名 26
    2.7  带加密的数字签名 31
    2.8  随机和伪随机序列的产生 33

    第三章  基本协议 36

    3.1  密钥交换 36
    3.2  鉴别 40
    3.3  鉴别和密钥交换 43
    3.4  鉴别和密钥交换协议的形式分析 50
    3.5  多密钥公开密钥密码学 53
    3.6  秘密分割 54
    3.7  秘密共享 55
    3.8  数据库的密码保护 58

    第四章 中级协议 59

    4.1  时间戳服务 59
    4.2  阈下信道 62
    4.3  不可抵赖的数字签名 63
    4.4  指定的确认者签名 64
    4.5  代理签名 65
    4.6  团体签名 65
    4.7  失败-终止 数字签名 66
    4.8  用加密数据计算 67
    4.9  比特承诺 67
    4.10 公平的硬币抛掷 69
    4.11 智力扑克 72
    4.12 单向累加器 75
    4.13 秘密的全或无泄露 76
    4.14 密钥托管 76

    第五章 高级协议 79

    5.1  零知识证明 79
    5.2  身份的零知识证明 85
    5.3  盲签名 87
    5.4  基于身份的公钥密码 90
    5.5  不经意传输 90
    5.6  不经意签名 92
    5.7  同时签约 92
    5.8  数字证明邮件 95
    5.9  秘密的同时交换 97

    第六章 深奥的协议 98

    6.1  保密选举 98
    6.2  保密的多方计算 105
    6.3  匿名报文广播 107
    6.4  数字现金 109

    第二篇  密码技术 116

    第七章  密钥长度 116

    7.1 对称密钥长度 116
    7.2 公钥密钥长度 122
    7.3 对称密钥和公钥密钥长度的比较 128
    7.4 对单向Hash函数的生日攻击 128
    7.5 密钥应该多长 128
    7.6 总结 129

    第八章 密钥管理 130

    8.1  密钥生成 130
    8.2  非线性密钥空间 135
    8.3  发送密钥 135
    8.4  验证密钥 137
    8.5  使用密钥 138
    8.6  更新密钥 139
    8.7  存储密钥 139
    8.8  备份密钥 140
    8.9  泄露密钥 141
    8.10 密钥有效期 141
    8.11 销毁密钥 142
    8.12 公开密钥的密钥管理 143

    第九章  算法类型和模式 146

    9.1  电子密码本模式 146
    9.2  分组重放 147
    9.3  密码分组链接模式 149
    9.4  序列密码算法 152
    9.5  自同步序列密码 154
    9.6  密码反馈模式 155
    9.7  同步序列密码 157
    9.8  输出反馈模式 158
    9.9  计数器模式 160
    9.10 其他分组密码模式 161
    9.11 选择密码模式 163
    9.12 交错 164
    9.13 分组密码算法与序列密码算法 165

    第十章   使用算法 167

    10.1 选择算法 167
    10.2 公钥密码与对称密码 169
    10.3 通信信道加密 169
    10.4 加密数据存储 172
    10.5 硬件加密与软件加密 174
    10.6 压缩、编码、加密 176
    10.8 密文中隐藏密文 177
    10.9 销毁信息 178

    第三篇  密码算法 180

    第十一章  数学背景 180

    11.1  信息论 180
    11.2  复杂性理论 183
    11.3  数论 187
    11.4  因子分解 200
    11.5  素数产生 202
    11.6  有限域上的离散对数 205

    第十二章  数据加密标准(DES) 207

    12.1  背景 207
    12.2  DES描述 210
    12.3  DES的安全性 219
    12.4 差分及线性分析 224
    12.5 实际设计的准则 232
    12.6   DES变形 232
    12.7  DES现在的安全性如何? 238

    第十三章  其它分组密码算法 239

    13.1  LUCIFER算法 239
    13.2  MADEYGA算法 239
    13.3  NewDES算法 241
    13.4  FEAL算法 243
    13.5  REDOC算法 247
    13.6  LOKI算法 248
    13.7  KHUFU和KHAFRE算法 250
    13.8  RC2算法 252
    13.9  IDEA算法 253
    13.10  MMB算法 259
    13.11  CA—1.1算法 260
    13.12  SKIPJACK算法 261

    第十四章  其它分组密码算法(续) 263

    14.1 GOST算法 263
    14.2 CAST算法 265
    14.3 BLOWFISH算法 266
    14.4 SAFER算法 269
    14.5 3—WAY算法 271
    14.6 CRAB算法 271
    14.7 SXAL8/MBAL算法 273
    14.8 RC5算法 273
    14.9 其它分组密码算法 274
    14.10 分组密码设计理论 274
    14.11 使用单向散列函数的算法 278
    14.12 分组密码算法的选择 281

    第15章  组合的分组密码 283

    15.1 双重加密 283
    15.2 三重加密 284
    15.3 加倍分组长度 288
    15.4 其它一些多重加密方案 289
    15.5 缩短CDMF密钥 291
    15.6 白噪声 291
    15.7 级联多重加密算法 291
    15.8 组合多重分组算法 292

    第十六章  伪随机序列发生器和序列密码 293

    16.1  伪随机序列发生器 293
    16.2  线性反馈移位寄存器 297
    16.3  序列密码的设计与分析 304
    16.4  使用LFSR的序列密码 305
    16.5  A5 313
    16.6  Hughes XPD/KPD 313
    16.7  Nanoteq 314
    16.8  Rambutan 314
    16.9  附加式发生器 314
    16.10 GIFFORD 316
    16.11 M算法 317
    16.12 PKZIP 318

    第17章 其它序列密码和真随机序列发生器 320

    17.1  RC4 320
    17.2  SEAL 321
    17.3  WAKE 322
    17.4  带进位的反馈移位寄存器 323
    17.5  使用FCSR的序列密码 329
    17.6  非线性反馈移位寄存器 332
    17.7  其它序列密码 333
    17.8  序列密码设计的系统理论方法 334
    17.9  序列密码设计的复杂性理论方法 335
    17.10 序列密码设计的其它方法 336
    17.11 多个序列密码的级联 337
    17.12 序列密码的选择 337
    17.13 从单个伪随机序列发生器生成多个序列 338
    17.14 真随机序列产生器 339

    第十八章  单向hash函数 344

    18.1  背景 344
    18.2  SNEFRU 346
    18.3  N- hash 346
    18.4  MD4 349
    18.5  MD5 350
    18.6  MD2 354
    18.7  安全hash算法(SHA) 354
    18.8  RIPE- MD 357
    18.9  HAVAL 357
    18.10  其它单向hash函数 358
    18.11  使用对称分组算法的单向hash函数 358
    18.12  使用公开密钥算法 365
    18.13  单向hash函数的选择 365
    18.14  消息鉴别码 366

    第19章  公开密钥算法 370

    19.1 背景 370
    19.2 背包算法 371
    19.3 RSA算法 374
    19.4 POHLIG-HELLMAN算法 381
    19.5 RABIN算法 381
    19.6 ElGAMAL算法 383
    19.7 McELIECE算法 385
    19.8 椭圆曲线密码体制 386
    19.9 LUC算法 386
    19.10 有限自动机公开密钥密码体制 387

    第二十章  公开密钥数字签名算法 389

    20.1 数字签名算法(DSA) 389
    20.2 DSA的变形 396
    20.3 GOST数字签名算法 398
    20.4 离散对数签名方案 399
    20.5 ONG-SCHNORR-SHAMIR 401
    20.6 ESIGN 401
    20.7 细胞自动机 402
    20.8 其它公开密钥算法 403

    第21章 鉴别方案 405

    21.1 FEIGE—FIAT—SHAMIR算法 405
    21.2 GUILLOU—QUISQUATER算法 409
    21.3 SCHNORR算法 411
    21.4 身份识别方案转为数字签名方案 412
    22.1 Diffie-Hellman 算法 413
    22.2 站间协议 415
    22.3 Shamir的三次传递协议 415
    22.4 COMSET 416
    22.5 加密的密钥交换 416
    22.6 加强的密钥协商 420
    22.7 会议密钥分发和秘密广播 420
    23   协议的专用算法 423
    23.1 多重密钥的公开密钥密码学 423
    23.2 秘密共享算法 423
    23.3 阈下信道 426
    23.4 不可抵赖的数字签名 431
    23.5 指定的确认者签名 433
    23.6 用加密数据计算 434
    23.7 公平的硬币抛掷 435
    23.8 单向累加器 437
    23.9 秘密的全或无泄露 437
    23.10 公平和防错的密码体制 439
    23.11 知识的零知识证明 440
    23.12 盲签名 442
    23.13 不经意传输 443
    23.14 保密的多方计算 443
    23.15 概率加密 444
    23.16 量子密码学 446

    第四篇  真实世界 449

    24    实现方案范例 449
    24.1  IBM秘密密钥管理协议 449
    24.2  MITRENET 450
    24.3  ISDN 450
    24.4  STU-Ⅲ 452
    24.5  KERBEROS 452
    24.6  KRYPTOKNIGHT 457
    24.7  SESAME 457
    24.8  IBM 通用密码体系 458
    24.9  ISO鉴别框架 459
    24.10 保密性增强邮件(PEM) 462
    24.11 消息安全协议(MSP) 467
    24.12 PRETTY GOOD PRIVACY(PGP) 467
    24.13 智能卡 469
    24.14 公开密钥密码学标准(PKCS) 470
    24.15 通用的电子支付系统(UEPS) 471
    26.16 CLIPPER 473
    24.17 CAPSTONE 475
    24.18 AT&T   3600型电话保密设备(TSD) 475
    25    政治 476
    25.1  国家安全局(NSA) 476
    25.2  国家计算机安全中心(NCSC) 477
    25.3  国家标准技术所(NIST) 478
    25.4  RSA数据安全有限公司 481
    25.5  公开密钥合作者 481
    25.6  国际密码研究协会(IACR) 482
    25.7  RACE 完整性基本评估(RIPE) 483
    25.8  对欧洲的有条件访问(CAFE) 483
    25.9  ISO/IEC 9979 484
    25.10 专业人员、公民自由及产业性组织 484
    25.11 Sci. Crypt 485
    25.12 Cypherpunks 485
    25.13 专利 486
    25.14 美国出口法规 486
    25.15 其他国家的密码进出口 491
    25.16 合法性问题 492
    Matt Blaze 跋 493

    第五篇  源代码 495

    1. DES 495
    2. LOK191 505
    3. IDEA 510
    4. GOST 516
    5. BLOWFISH 520
    6. 3-Way 529
    7. RC5 535
    8. A5 539
    9. SEAL 545
    References 553