首页>参考读物>计算机科学与技术>计算机科学理论与基础知识

程序员密码学
作者 : Tom St Denis;Simon Johnson
译者 : 沈晓斌
丛书名 : 华章程序员书库
出版日期 : 2007-07-27
ISBN : 7-111-21660-5
定价 : 39.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 328
开本 : 16开
原书名 : Cryptography for Developers
原出版社:
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书特色
  这是一本针对那些需要学习密码学,同时还要安全、高效地实现密码学算法的程序员的书籍。
  这本书从第1章介绍密码学研究领域开始。第2章全面论述了怎样实现RSA和ECC公钥算法所需要的大整数算术。后面的章节讨论了对称分组密码、单向散列函数、消息认证码算法、组合认证和加密模式、公钥密码和可移植编码实践的实现,保密性、完整性、认证和不可否认四种密码学目标的特例,以及公钥算法和高级加密。每一章都深层次地讨论了内存、大小以及速度性能上的权衡,也讨论了这些特定的主题都解决了哪些密码学问题。
  本书还有一个与其相应的网站libtom.org,上面有关于实现多精度算术的超过300页的资料。

图书特色

图书前言

这是我的第二本书。读者朋友们,除了说这本书比上一本更加富有戏剧性并更加吸引人之外,我确实不知道该告诉你们什么。我不想解释过多的细节,但我只想说在MD5背后,RSA和SHA似乎有某些关系。下面让我们来认真地讨论正题吧。
  当我写这篇前言的时候,本书将接近印刷,我期望看到最终的成品并且希望达到预期的目标。这本书是经过一年努力的结果,时间约为2006年初到2006年11月。我花了许多工作时间之外的业余时间来写作本书,目的就是能够更好地满足读者的要求。当然这也是一个很有趣的过程,虽然有时会很费力,但正如我的第一本书一样,是非常值得这么做的。
  首先,在我深入讨论这本书之前,有必要介绍一下作者。这本书大部分是由我——Tom St Denis所写,并且在我的合著者技术审稿人Simon Johnson的帮助下共同完成的。我是一名来自加拿大安大略的计算机科学家,并且我对密码学相关的任何事情都很感兴趣。更加特别地是,我同时也是一名专用硬件和嵌入式系统开发的爱好者。
  我想读者之所以知道我和我的这本书,大概是因为LibTom系列项目。这些项目是一系列的密码学以及数学相关的算法库,写这些库主要是用来解决现实中软件开发者会碰到的各种各样的问题。开发它们的同时也是为了能对读者有些指导作用。我的第一个项目,LibTomCrypt,是将近五年工作的结果,它支持很多有用的密码学基本函数,并且实际上也是这本书的一个很好的参考资源。为了继续完成密码学项目,我在2002年又开始了LibTomMath项目。LibTomMath是一个操作大整数的可移植数学库,已经成为LibTomCrypt项目中数学函数的默认提供者,同时也是其他项目(如Tcl和Dropbear)的一个组成部分。为了改进LibTomMath,我又写了TomsFastMath,它的速度非常快,并且也可以很容易地为密码学运算提供数学运算库。
  我写的这些项目都是免费的,人们不仅可以直接免费获得,而且可以没有任何限制地使用。实际上它们都是完全公开的。至少对我来说,仅仅提供代码是不够的。我同时也提供了介绍如何使用这些算法库的文档。即使这样我认为还是不够。我还对代码进行了美化,同时也做了注释,这可以使这些代码本身具有一定的指导作用。第一个使用这种方式的是LibTomCrypt项目。2003年,我写了一本书,书名叫做BigNum Math:Implementing Cryptographic Multiple Precision Arithmetic的书(ISBN:1597491128),由Syngress出版社在2006年出版。这本书基本是把LibTomMath等项目里的代码直接插入到书中。这本书中同时也混有伪代码,它教会人们如何高效地操作大整数。
  LibTom这些项目系列的完成得益于我在数年的开发过程中总结出来的座右铭:“开放的源码,开放的学术,开放的思想。”
  其意思是说,通过提供有用的文档和参考资料的源代码,我们可以指导其他人并且使得他们产生新的想法和使用新的技术。由于这句座右铭具有指导意义,所以它扩充了原来的那种典型的开放源码哲学。例如,GNU C编译器(GCC)的开放源码做法是很好的,但是它并不是一个教育项目。虽然这种想法已经谈得有点多了,但是我还将在我的下一本书(大概在2009年的某个时候出版)中以此为主题继续讨论它。
  我继续开发我的LibTom项目,并且我也时刻提醒自己如果有可能的话,要尽力改进它们。我定期地参加如Toorcon这样的会议来传播“LibTom哲学”,以吸引新的开放源码开发者加入到这条教育战线上来。
  那么Simon又是谁呢?Simon Johnson是一名来自英国的计算机程序员。他把他的时间都用在阅读和学习计算机安全和密码学技术上。更确切地说,他是一名开发C#应用程序的安全项目师。Simon和我相遇在sci.crypt用户新闻组,并且一起合作开发了各种项目。在整本书中,Simon充当了技术审稿人的角色。即使他很想给这本书的工程提供更多的帮助,但是他的时间安排不允许他这样做,然而他的帮助却又是那么的关键。可以确定地说,在以后的几年中,我们可以看到Simon会出版几本他自己的书。
  本书讨论了什么?面向软件开发者的密码学。这种说法似乎是权威的并且不依赖于任何其他东西,但实际上是不全面的。对非密码专业人员开发者来说,这本书确实是一本必需的导引书籍。但是,这并不是说这是惟一一本关于这种主题的书籍。我们也经常把其他书作为参考书籍。毫无疑问,你需要一本“BigNum Math”,是介绍用于公钥算法中的大整数运算实现的必备书籍。另外一本必备书籍是The Guide to Elliptic Curve Cryptography(ISBN 038795273X),它很好地介绍了开发者所要了解的椭圆曲线密码学基本算法。出于对读者有益的角度考虑,我们主张读者看一些比较容易阅读的相关书籍。同时,你也可能需要阅读一些标准文档。例如,当你需要实现RSA加密体系时,确实需要一份PKCS#1拷贝(免费的)。虽然这本书也讲述了PKCS#1操作,但有一份标准文档也相当方便。最后,我强烈建议读者能够得到LibTom项目的拷贝,以获得第一手的密码学软件的使用经验。
  本书是为谁准备的?我写这本书是为了那些针对我的项目,给我发电子邮件让我进行技术支持的人。但是这并不是说本书就是关于我的那些项目的,也不仅仅是讨论用户在使用这些库的时候会碰到的问题。通常,那些具有解决安全问题任务的软件开发者并不是专业的密码人员。他们都是聪明人,如果能够得到细心的指导,那么他们就可以实现安全的加密系统。本书的目的就是引导软件开发人员在其开发过程中如何去解决各种密码学相关的问题。如果你曾坐下来问自己:“我怎样来使用AES?”那么,这本书就是为你准备的。
  本书不是为了那些需要可靠的密码学学术文章的人而写的。本并不是“应用密码学手册”,也不是“密码学基础”。简单地说,如果你并没有实现密码学算法的任务,也许这本书并不适合你。这是我在设计和写作这本书的时候所考虑的一部分。我们努力囊括足够的技术和学术理论上的细节,这可以让我们的讨论更加精确和有用。但是,我们省略了许多不适合这本书内容的密码学问题的讨论。
  我想感谢在整个项目过程中帮助过我的每一个人。Greg Rose帮助我审校了其中一章。他也给我提供了一些灵感和很有见解的注释。我还想感谢Simon加入到这个项目并且为了本书的质量做出了很大的贡献。我同样也想感谢Microsoft Word给我吃的那些苦头。我感谢Syngress出版社的Andrew、Erin和其他为本书的最终付梓做出努力的人们。我也想感谢使用LibTom项目的用户们,他们是这本书的灵感来源。没有他们的询问和分享他们的经验,我也绝不会首先写出这本书。
  最后,我还要感谢那些预定了本书的读者朋友,由于出版日期的一再推迟而给你们造成了不便,对此我非常抱歉。

  Tom St Denis
  于加拿大安大略渥太华
  2006年10月

封底文字

本书特色 这是一本针对那些需要学习密码学,同时还要安全、高效地实现密码学算法的程序员的书籍。 这本书从第1章介绍密码学研究领域开始。第2章全面论述了怎样实现RSA和ECC公钥算法所需要的大整数算术。后面的章节讨论了对称分组密码、单向散列函数、消息认证码算法、组合认证和加密模式、公钥密码和可移植编码实践的实现,保密性、完整性、认证和不可否认四种密码学目标的特例,以及公钥算法和高级加密。每一章都深层次地讨论了内存、大小以及速度性能上的权衡,也讨论了这些特定的主题都解决了哪些密码学问题。 本书还有一个与其相应的网站libtom.org,上面有关于实现多精度算术的超过300页的资料。

作者简介

Tom St Denis;Simon Johnson:Tom St Denis: Tom St Denis 是一名软件开发者,他因开发公共领域的LibTom系列加密算法而著名。在过去的5年时间里,他致力于宣传、开发和支持“开放源码的密码学”这一事业,并为其安全部署而努力工作。Tom目前受雇于Elliptic Semiconductor公司,为嵌入式系统设计和开发软件包。他和一个拥有各种硬件工程师的小组紧密合作,创建了一种BoB的硬件和软件组合系统。
Simon Johnson: Simon Johnson 是英国一名针对技术设备的安全工程师。Simon早在十几岁的时候就对密码学产生了兴趣,他研究了传统软件密码学的方方面面。他从17岁开始就活跃在密码学新闻组Sci.Crypt,参加了世界各地举行的各种安全会议,并积极促进安全计算实践。

译者简介

沈晓斌:暂无简介

译者序

信息安全越来越受到人们的重视,而对信息安全的基石—密码学的研究也是如火如荼。但是,许多信息安全软硬件产品的开发者并不是专业的密码学研究人员。虽然他们擅长程序设计,而且现在也有不少各种密码学算法库,如LibTomCrypt和Crypto++,但在实现各种复杂的密码学算法时,由于缺少一定的密码学理论知识以及对密码学算法理解上的偏差,造成了对算法的使用不当,这又往往导致其开发的产品中存在各种潜在的漏洞及安全风险。同时,许多密码学理论工作者在实现密码学算法时,由于缺少程序设计技巧方面的知识,在算法实现的易用性和高效性上遇到了不少障碍,从而也会导致算法实现上存在不少安全缺陷。
  本书的出版,在程序员和密码学研究人员之间架起了一座桥梁,使他们能够轻松地把理论和实践相结合。因此,本书也必将缓解信息安全业界的种种现实尴尬。本书的作者Tom St Denis既是一名密码学研究人员,也是一名开发人员,开发了各种软硬件安全产品,具有丰富的密码学相关产品的开发经验。同时,他自己也开发了Lib Tom系列密码学、数学算法库,如Lib TomCrypt、Lib TomMath、TomsFastMath。在这本书中,作者结合了Lib TomCrypt和LibTomMath等算法库,既介绍了实现各种密码学算法所必需的基本理论数学知识,也讨论了实现上的程序设计技巧;不仅有软件实现,也有硬件实现;不但从理论上分析了算法的安全性和性能,也从实现的角度讨论了如何正确并高效地使用各种算法,比如各种优化算法的实现,各种性能上的比较。
  本书涉及密码学的各个研究方向,分组密码、散列函数、公钥密码以及相关的攻击,同时也讲解了密码学算法实现上所常用的ASN.1编码、大整数算术相关内容。这是目前市面上惟一一本把密码学算法的理论和实现结合在一起的书,也是惟一一本能够如此深入浅出地把这个方面融合到一起的一本书,没有深厚的程序设计功力和广泛的密码学理论知识是不可能写出这样一本书的。这无论对于需要开发安全产品的开发者,还是密码学相关研究人员来说,都非常值得一读,对安全产品开发工作以及密码学理论研究工作都起到相当的辅助作用,可以起到事半功倍的作用。
  译者研究密码学数年有余,在国内知名的看雪软件安全论坛(http://bbs.pediy.com)任“软件调试论坛”版主(cnbragon),与论坛众多好手时常讨论密码学方面的问题,比较了解其在软件保护中的应用情况。译者也写了一个自己的加密算法库CryptoFBC。能够有机会把这样一本好的密码学应用书籍介绍给国内的广大程序员,译者感到非常荣幸。
  在翻译本书的过程中,得到了许多人的帮助,尤其是机械工业出版社华章分社的陈冀康编辑、看雪论坛的负责人段钢所给予的指导、建议与批评,使得译者受益匪浅,在此表示衷心的感谢!同时,我还要感谢iPB、RCT组织的成员以及看雪论坛上的其他朋友,他们总是在我最困难的时候给予无私和热情的帮助!我也要感谢我的导师,扬州大学信息工程学院殷新春教授,他对我的关怀与鼓励,以及在密码学研究方向上的指导是我不断前进的动力!最后,我要感谢我的父母和我可爱的妹妹,他们总是给我无私地关怀、支持和理解!谨以此拙译献给所有帮助过我的人。
  由于时间仓促,再加上译者水平有限,本书的翻译难免存在不妥甚至错误之处,敬请广大读者朋友不吝赐教和批评指正,译者深表谢意。

  沈晓斌
  2007年5月
  http://bbs.pediy.com

图书目录

译者序
前言
第1章  概述 1
1.1  简介 1
1.2  威胁模型 2
1.3  什么是密码学 3
1.3.1  密码学的目标 3
1.4  资产管理 7
1.4.1  保密性和认证 8
1.4.2  数据的生命周期 8
1.5  常识 9
1.6  开发工具 10
1.7  总结 11
1.8  本书的组织结构 11
1.9  常见问题 13
第2章  ASN.1编码 14
2.1  ASN.1概述 14
2.2  ASN.1语法 15
2.2.1  ASN.1显式值 15
2.2.2  ASN.1容器 16
2.2.3  ASN.1修改器 17
2.3  ASN.1数据类型 19
2.3.1  ASN.1头字节 19
2.3.2  ASN.1长度编码 21
2.3.3  ASN.1布尔类型 22
2.3.4  ASN.1整数类型 22
2.3.5  ASN.1位串类型 23
2.3.6  ASN.1八位位组串类型 24
2.3.7  ASN.1空类型 24
2.3.8  ASN.1对象标识符类型 24
2.3.9  ASN.1序列和集合类型 25
2.3.10  ASN.1可打印字符串和IA5String类型 28
2.3.11  ASN.1世界协调时类型 28
2.4  实现 29
2.4.1  ASN.1长度程序 29
2.4.2  ASN.1原始编码器 32
2.5  总结 65
2.5.1  创建链表 65
2.5.2  解码链表 68
2.5.3  Flexi链表 69
2.5.4  其他提供者 70
2.6  常见问题 70
第3章 随机数生成 72
3.1  简介 72
3.2  熵的度量 74
3.2.1  位计数 75
3.2.2  字计数 75
3.2.3  间隙计数 75
3.2.4  自相关测试 75
3.3  它能有多糟 77
3.4  RNG设计 78
3.4.1  RNG事件 78
3.4.2  RNG数据收集 82
3.4.3  RNG处理和输出 85
3.4.4  RNG估算 89
3.4.5  RNG的设置 91
3.5  PRNG算法 92
3.5.1  PRNG的设计 92
3.5.2  PRNG的攻击 93
3.5.3  Yarrow PRNG 94
3.5.4  Fortuna PRNG 96
3.5.5  NIST的基于散列的DRBG 100
3.6  总结 104
3.6.1  RNG与PRNG 104
3.6.2  PRNG的使用 105
3.6.3  示例平台 105
3.7  常见问题 107
第4章  高级加密标准 109
4.1  简介 109
4.1.1  分组密码 110
4.1.2  AES的设计 111
4.2  实现 121
4.2.1  一个8位的实现 122
4.2.2  优化的8位实现 127
4.2.3  优化的32位实现 129
4.3  实用的攻击 143
4.3.1  侧信道 144
4.3.2  处理器缓存 144
4.3.3  Bernstein 攻击 145
4.3.4  Osvik 攻击 146
4.3.5  挫败侧信道 146
4.4  链接模式 147
4.4.1  密码分组链接 148
4.4.2  计数器模式 151
4.4.3  选择一个链接模式 153
4.5  总结 153
4.5.1  荒诞的说法 156
4.5.2  提供者 157
4.6  常见问题 158
第5章  散列函数 161
5.1  简介 161
5.1.1  散列摘要长度 162
5.2  SHS的设计与实现 164
5.2.1  MD 强化 165
5.2.2  SHA-1的设计 165
5.2.3  SHA-256的设计 173
5.2.4  SHA-512的设计 180
5.2.5  SHA-224的设计 186
5.2.6  SHA-384的设计 187
5.2.7  零复制散列 188
5.3  PKCS #5 密钥衍生 189
5.4  总结 191
5.4.1  散列算法可以做哪些事 191
5.4.2  散列算法不能用来做哪些事 192
5.4.3  和口令一起工作 194
5.4.4  性能上的考虑 196
5.4.5  PKCS #5的例子 197
5.5  常见问题 199
第6章  消息认证码算法 202
6.1  简介 202
6.2  安全准则 203
6.2.1  MAC密钥的寿命 204
6.3  标准 204
6.4  分组消息认证码 204
6.4.1  CMAC的安全性 206
6.4.2  CMAC的设计 207
6.5  散列消息认证码 215
6.5.1  HMAC的设计 216
6.5.2  HMAC的实现 217
6.6  总结 222
6.6.1  MAC函数可以做哪些事 222
6.6.2  MAC函数不能用来做哪些事 224
6.6.3  CMAC与HMAC 224
6.6.4  重放保护 225
6.6.5  先加密再MAC 226
6.6.6  加密和认证 227
6.7  常见问题 236
第7章  加密和认证模式 239
7.1  简介 239
7.1.1  加密和认证模式 239
7.1.2  安全目标 240
7.1.3  标准 240
7.2  设计与实现 240
7.2.1  额外的认证数据 240
7.2.2  GCM的设计 241
7.2.3  GCM的实现 244
7.2.4  GCM的优化 262
7.2.5  CCM的设计 264
7.2.6  CCM的实现 265
7.3  总结 274
7.3.1  这些模式可以用来做哪些事 275
7.3.2  选择一个Nonce 275
7.3.3  额外的认证数据 276
7.3.4  MAC标记数据 276
7.3.5  构造举例 277
7.4  常见问题 281
第8章  大整数算术 283
8.1  简介 283
8.2  什么是BigNum 283
8.3  算法 284
8.3.1  表示 284
8.3.2  乘法 285
8.3.3  平方 293
8.3.4  Montgomery约简 299
8.4  总结 303
8.4.1  核心算法 303
8.4.2  大小与速度 304
8.4.3  BigNum库的性能 304
8.4.4  TomsFastMath算法库 305
8.5  常见问题 306
第9章  公钥算法 307
9.1  简介 307
9.2  公钥密码的目标 308
9.2.1  保密性 308
9.2.2  不可否认和真实性 308
9.3  RSA公钥密码 309
9.3.1  RSA简述 309
9.3.2  PKCS #1 310
9.3.3  RSA的安全 314
9.3.4  RSA参考资料 315
9.4  椭圆曲线密码学 316
9.4.1  什么是椭圆曲线 316
9.4.2  椭圆曲线代数 317
9.4.3  椭圆曲线加密系统 318
9.4.4  椭圆曲线的性能 323
9.5  总结 324
9.5.1  ECC与RSA 324
9.5.2  标准 326
9.5.3  参考资料 326
9.6  常见问题 327

教学资源推荐
作者: 孙世新 卢光辉 张艳 顾小丰 戴波 等
作者: Behrouz Forouzan;Firouz Mosharraf
作者: (英)Alan Watt
作者: 檀凤琴 何自强 编著
参考读物推荐
作者: [美] 伊丽莎白·A.斯蒂芬(Elizabeth A. Stephan)大卫·R.鲍曼(David R. Bowman) 威廉·J.帕克(William J. Park) 本杰明·L.西尔(Benjamin L. Sill) 马修·W.奥兰(Matthew W. Ohland) 著
作者: 华诚科技 编著
作者: 高扬 卫峥 尹会生 著 万娟 插画设计