密码学:C/C++语言实现(原书第2版)
作者 : [德] 迈克尔·威尔森巴赫(Michael Welschenbach)著
译者 : 杜瑞颖 何琨 周顺淦 译
丛书名 : 计算机科学丛书
出版日期 : 2015-10-21
ISBN : 978-7-111-51733-7
定价 : 69.00元
教辅资源下载
扩展信息
语种 : 简体中文
页数 : 311
开本 : 16
原书名 : Cryptography in C and C++,Second Edition
原出版社: Springer-Verlag
属性分类: 教材
包含CD :
绝版 :
图书简介

针对IT专业从业人员编写的密码书籍,讲述编写专家级的密码所需要掌握的知识和技术,安全并高效地实现密码学算法。新修订的第2版包括100多页的全新内容,同时对原有内容进行了修改和完善,使之涵盖密码学领域的最新技术进展。

图书特色

本书填补了公钥密码学的理论背景与其实现之间的文献空缺,对现代密码学理论进行解释,并提供了实现密码学算法的详细建议。你将会逐步掌握如何构建一个全面的源代码库,其中包括快速可靠的高精度算术函数、产生伪随机数的函数、散列函数、用于公钥密码学的函数,以及高级加密标准(Advanced Encryption Standard,AES)的一个实现。源代码中还加入了大量测试包。
即使你正在使用另一个高精度算术包构建密码学系统,你也能从本书给出的提示和说明中受益。尽管本书从数学的角度进行阐述,但尽力避免不必要的复杂性。本书的目标是透彻地解释复杂的C和C++源代码。该源代码可以从Apress的网站上下载,它包含所有实现现代密码学功能所需的基本构件。
无论你是关注密码学算法及其快速可靠的实现,还是对密码学软件的理论感兴趣,本书都适合你。对密码学或任何其他有关大整数算术的数论问题感兴趣的学生,也会发现本书的价值。

作者简介
迈克尔·威尔森巴赫(Michael Welschenbach) 任职于德国波恩的SRC安全研发和咨询公司。他是科隆大学数学硕士,长期从事纯密码和应用密码研究。当前,他最常采用C和C++语言来编写密码。

图书前言

英文第2版前言Cryptography in C and C++,Second Edition
当必须与数字打交道时,我宁愿把自己塞进地洞中,这样就看不见任何东西。如果我抬起头,看见大海、一棵树或者一个女人(即使只是一个老妇人),如果将所有的结果和数字都化作一阵轻烟。它们长出翅膀飞走了,我只能去追赶。
——Nikos Kazanzakis,《Zorba the Greek》本书的英文第2版又经历了一次修订与扩充。我们完全重写了随机数生成器这一章,并且大幅修订了素性检验这一节。Agrawal、Kayal和Saxena在素性检验方面的最新成果——曾经在2002年引起轰动的《PRIMES is in P》,也涵盖在内。我们重新安排了Rijndael/AES这一章的位置,以便达到更好的效果。同时也指出Rijndael的标准化作为高级加密标准(Advanced Encryption Standard)被美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)列为官方标准。
与本书之前的版本不同,英文第2版不再包含一张有程序源代码的光盘。相应地,源代码可以从www.apress.com的Downloads处下载。
感谢出版社和译者,他们使这本书有了中文、韩文、波兰文和俄文的版本,同时他们的仔细阅读也为该版本的质量做出了贡献。
再一次感谢David Kramer付出智慧与汗水将本书翻译为英文,还要感谢Apress的Gary Cornell愿意出版这本英文第2版。
最后,感谢Springer Science出版社,尤其是Hermann Engesser、Dorothea Glausinger和Ulrike Sricker,感谢他们的愉快合作。



英文第1版前言Cryptography in C and C++,Second Edition
数学是一门被误解甚至被中伤的学科。它不是在小学里我们被灌输的蛮力计算,也不是关于清算的科学。数学家不会把他们的时间花在想出更聪明的乘法方法、更快的加法方法以及更好的开立方方法上。
——Paul Hoffman,《The Man Who Loved Only Numbers》英文第1版翻译自德文第2版。德文第2版在许多方面对德文第1版进行了修订和扩充,增加了一些密码学算法实例,如Rabin和El Gamal函数,并在RSA函数的实现中采用了RIPEMD -160散列函数以及PKCS#1格式。同时,还讨论了导致程序缺陷的可能错误来源。许多文字部分都进行了扩充、澄清以及错误更正。另外,强化了讲授策略,因此有些程序的源代码与书中的描述存在某些细节上的区别。并不是所有技术细节都同样重要,快速有效的代码也不总是清晰易读、引人注意。
谈到效率,在附录D中将程序的运行时间与GNU多精度库中的特定函数进行了比较。在比较中,FLINT/C指数运算表现不俗。作为补充,附录F提供了一些算术和数论包以供参考。
软件扩充了一些函数,并在一些地方进行了大量完善工作,移除了一些错误和不精确的地方。软件开发了额外的测试函数,并扩充了现有的测试函数。软件还实现了一种安全模式,通过重写,删除了函数中与安全性密切相关的变量。附录中明确地引用了所有的C和C++函数并加以说明。
由于当前编译器支持的C++标准并不统一,所以FLINT/C包的C++模块被设计为在传统的形式为xxxxx.h的C++头文件和新的ANSI头文件中都可以使用。出于同样的原因,在使用new()运算符时将检查是否返回一个null指针。这类错误处理没有使用ANSI标准异常,但能在当前的编译器下工作。而遵从标准的方法,即new()通过throw()生成一个错误,并不总是可行的。
虽然本书专注于非对称密码学的基本原理,但是由于Rijndael最近被美国国家标准与技术研究院(NIST)提名为高级加密标准(AES),所以将这一算法的描述放到最后一章(第11章)。感谢Apress的Gary Cornell提出这个主题,并使我相信它值得成为本书的一部分。感谢Vincent Rijmen、Antoon Bosselaers、Paulo Barreto和Brian Gladman允许我们在本书的源代码中包含他们的Rijndael实现。
感谢所有第1版的读者,尤其是那些指出错误、给出评论或提出改进意见的人。我们非常愿意与他们交流。和往常一样,作者承担所有仍然留在本书或软件中的错误,以及任何新增错误的责任。
由衷地感谢Apress的Gary Cornell以及Springer-Verlag的Hermann Engesser、Dorothea Glaunsinger和Ulrike Stricker,感谢他们的无私奉献和友好合作。
感谢我的译者David Kramer,他以卓越的专业知识以及孜孜不倦的奉献精神提出了大量宝贵的意见,这些内容也融入了本书的德文版中。
警告
在使用包含在本书中的程序前,请参考相关软件和计算机的产品指南与技术说明。作者和出版社都不承担任何由于不正确地使用本书程序所带来的损失。可下载的源代码中的程序受到版权保护,未经出版社允许不能复制。



德文第1版前言Cryptography in C and C++,Second Edition
数学是科学的皇后。数论是数学的皇后。通常,她屈尊帮助天文学与其他自然科学,但在任何情况下,她都是最重要的。
——Carl Friedrich Gauss本书专注于整数算术及其在计算机程序中的应用,不过,为什么我们需要这样一本密码学的书?这与计算机科学一般所牵涉的重要问题比起来是否是一个微不足道的主题呢?只要我们把自己封闭在那些可以用编程语言标准数字类型表示的数的范围内,算术就是一件非常简单的事,那些熟悉的算术运算伴随着熟悉的符号+、-、/、*在程序中自然地出现。
但是,当我们需要长度远远大于16位或32位的结果时,情况就变得有趣了。即使是基本的算术运算也无法在这些数上实现,我们需要投入大量精力解决那些以前从来不是问题的问题。任何研究数论尤其是现代密码学课题的人,无论是专业人士还是业余爱好者,都熟知这样的情况:我们在学校里学到的算术技术都要重新思考,并且我们会发现自己有时候要解决难以置信的复杂过程。
那些想要在这些领域开发程序但不想从头开始的读者将发现,本书包含的一系列用于大整数计算的函数可以作为C和C++的扩展。我们并不讨论那些解释“它的工作原理是什么”的“小儿科”的例子。我们提供一套完整的函数和方法,它们满足行业的稳定与性能需求,并有着坚实的理论基础。
在理论和实践之间建立连接是本书的目标,即填补理论文献与实际编程问题之间的缝隙。在前面的几章中,我们逐步研究大的自然数的基本计算原理、有限环和域中的算术,以及一些更复杂的初等数论函数,并阐述将这些原理应用于现代密码学的各种可能性。我们对数学基本原理的解释足以帮助读者理解本书给出的程序,对于那些想要深入了解的人,我们提供了大量的参考文献。我们将开发的函数组织到一起并进行大量测试,最终形成一个有用且全面的编程接口。
我们从大数的表示开始,并在随后几章中探讨计算的基础。对于大数的加法、减法、乘法和除法,我们编写了强大的基本函数。基于这些函数,我们解释剩余类中的模算术,并在库函数中实现了相应的运算。我们划分了单独的一章专注于耗时的幂运算过程,该章设计并实现了一些针对模算术中应用的特定算法。
在经过大数输入与输出、不同基数之间的转换等准备后,我们使用这些基本的算术函数研究初等数论算法,然后从计算大数的最大公约数开始开发程序。接着我们转向研究计算Legendre和Jacobi符号、在有限环上求逆和计算平方根等问题,并熟悉中国剩余定理及其应用。
接下来,我们讨论识别大素数的原理的细节,并编写了强大的多阶段素性检验程序。
随后的一章致力于大随机数的生成,开发了密码学中使用的位生成器,并测试了其统计特征。
在第一部分的最后,我们测试了算术以及其他功能。我们从算术的数学规则中导出特殊的测试方法,并考虑了高效的外部工具的实现。
第二部分的主题是逐步构建C++类LINT(Large INTegers)。在此过程中,我们将第一部分的C函数嵌入面向对象编程语言C++的语法与语义中。我们特别关注使用灵活的流函数和操控器对LINT对象进行格式化输入和输出,以及基于异常的错误处理。用C++表示的算法的优雅令人印象深刻,尤其是标准类型和LINT对象的边界变得模糊,使得在实现算法时语法较为接近,并且更清晰和透明。
最后,我们通过实现用于加密和数字签名的扩展RSA密码系统展示如何应用我们开发的方法。在这个过程中,我们解释最具代表性的非对称密码系统RSA的理论及其操作。根据C++编程语言的面向对象原则,我们在一个自包含的例子里开发了一个可扩展的内核。
我们以对软件库进一步可能的扩展的讨论作为结束。作为最后的一个要点,我们给出4个用于乘法和除法的80x86汇编语言的函数,它们能改进软件的效率。附录D包含了使用和不使用汇编器情况下的典型计算时间的表格。
衷心地欢迎本书的所有读者加入我们,或者根据个人兴趣专注于某些章节,并试用给出的函数。作者用“我们”指代自己及读者,希望这一点不会引起误解。他希望借此鼓励他们在数学和计算机科学的前沿领域发挥积极的作用,并从本书中受益。至于软件,我们鼓励读者通过新的实现优化一个或多个函数的范围或速度。
感谢Springer-Verlag,特别是Hermann Engesser、Dorothea Glaunsinger和Ulrike Stricker,他们对本书的出版抱有兴趣,并开展了友好积极的合作。本书手稿由Jrn Garbers、Josef von Helden、Brigitte Nebelung、Johannes Ueberberg和Helga Welschenbach审阅。衷心地感谢他们至关重要的建议与改进,以及他们的细心与耐心。尽管我们付出了努力,但本书或软件中仍可能存在错误,作者将独自承担责任。非常感谢我的朋友及同事Robert Hammelrath、Franz-Peter Heider、Detlef Kraus和Brigitte Nebelung,在多年的合作中,他们对数学与计算机科学之间关联的洞察对我影响深远。

上架指导

计算机

封底文字

本书填补了公钥密码学的理论背景与其实现之间的文献空缺,对现代密码学理论进行解释,并提供了实现密码学算法的详细建议。你将会逐步掌握如何构建一个全面的源代码库,其中包括快速可靠的高精度算术函数、产生伪随机数的函数、散列函数、用于公钥密码学的函数,以及高级加密标准(Advanced Encryption Standard,AES)的一个实现。源代码中还加入了大量测试包。
即使你正在使用另一个高精度算术包构建密码学系统,你也能从本书给出的提示和说明中受益。尽管本书从数学的角度进行阐述,但尽力避免不必要的复杂性。本书的目标是透彻地解释复杂的C和C++源代码。该源代码可以从Apress的网站上下载,它包含所有实现现代密码学功能所需的基本构件。
无论你是关注密码学算法及其快速可靠的实现,还是对密码学软件的理论感兴趣,本书都适合你。对密码学或任何其他有关大整数算术的数论问题感兴趣的学生,也会发现本书的价值。

作者简介

[德] 迈克尔·威尔森巴赫(Michael Welschenbach)著:Michael Welschenbach任职于德国波恩的SRC安全研发和咨询公司。他是科隆大学数学硕士,长期从事纯密码和应用密码研究。当前,他最常采用C和C++语言来编写密码。

译者简介

杜瑞颖 何琨 周顺淦 译:暂无简介

译者序

密码学是一门有着悠久历史的科学,在人类历史中扮演着重要的角色。然而,密码学又是一门神秘的学问,许多人知道它,却不了解它;许多人研究它,却不能公开讨论它。早期的密码学研究作为各国的军事机密而讳莫如深,直到20世纪中叶,这一状况才开始改变。随着众多杰出科学家的介入,密码学由一门依靠设计者经验的编码艺术,转变为一门严谨的科学。尤其是公钥密码学的诞生,使得密码学具备了保密通信之外的更为广泛的功能,也使得密码学成为一门蓬勃发展的新兴学科。
密码技术从诞生之初就以保护军事机密和商业机密为目标。我们的日常生活也离不开密码技术,如无线网络接入认证、安全电子邮件系统等。因此,我们不仅要分析密码学的理论基础,更要研究密码学的具体实现。本书就是这样一本专注于密码学实现的书籍,这种独特的视角使其在众多密码学理论书籍中脱颖而出。
本书讨论了如何使用C语言和C++语言实现密码学算法。这一过程远比想象的复杂。公钥密码学以大整数计算为基础,而这些大整数远远超过了C语言和C++语言对整数的处理范围,因此实现密码学算法必须先实现大整数计算。在大整数计算的基础上,本书介绍了大量密码学算法的实现,并确保它们既高效又安全。
作为一本密码学的书籍,本书叙述了一个重要的对称加密算法AES的理论及实现,也完整地实现了一个重要的非对称密码系统——RSA加密和RSA签名。作为一本算法实现的书籍,本书严格遵循软件开发的原则,详细描述了设计思想及错误处理方法,并对所有函数进行了广泛的测试。
对于以实现真正实用的密码学算法为目的,并了解相关理论基础的读者而言,本书是一本极佳的读本。
由于译者的外语水平及专业知识有限,所以在翻译中难免有错误或不妥之处,请读者理解并指正。

译者
2015年8月

图书目录

出版者的话
译者序

英文第2版前言
英文第1版前言
德文第1版前言
第一部分 算术与数论:C实现
第1章 绪论2
第2章 数的格式:C中大数的表示7
第3章 接口语义10
第4章 基本运算12
 4.1 加法和减法12
 4.2 乘法19
  4.2.1 小学乘法方法20
  4.2.2 更快的平方运算24
  4.2.3 Karatsuba能否做得更好27
 4.3 带余除法30
第5章 模算术:剩余类计算40
第6章 百川归海:模幂运算48
 6.1 第一种方法48
 6.2 M进制取幂52
 6.3 加法链及窗口61
 6.4 Montgomery约简和取幂64
 6.5 取幂运算的密码学应用72
第7章 位运算与逻辑函数77
 7.1 移位运算77
 7.2 有或无:位关系81
 7.3 对单个二进制数字的直接访问85
 7.4 比较运算符87
第8章 输入、输出、赋值和转换91
第9章 动态寄存器98
第10章 基本数论函数104
 10.1 最大公约数104
 10.2 剩余类环中的乘法逆109
 10.3 根与对数114
 10.4 剩余类环中的平方根120
  10.4.1 Jacobi符号120
  10.4.2 模pk的平方根125
  10.4.3 模n的平方根128
  10.4.4 基于二次剩余的密码学133
 10.5 素性检验135
第11章 Rijndael:数据加密标准的后继者151
 11.1 多项式运算152
 11.2 Rijndael算法155
 11.3 计算轮密钥157
 11.4 S盒158
 11.5 行移位变换160
 11.6 列混合变换160
 11.7 轮密钥加161
 11.8 一个完整的加密过程161
 11.9 解密164
 11.10 性能166
 11.11 运行模式166
第12章 大随机数167
 12.1 一个简单的随机数生成器169
 12.2 密码学的随机数生成器171
  12.2.1 初始值的生成172
  12.2.2 BBS随机数生成器175
  12.2.3 AES生成器178
  12.2.4 RMDSHA-1生成器181
 12.3 质量测试183
  12.3.1 卡方检验183
  12.3.2 单位检验184
  12.3.3 扑克检验184
  12.3.4 游程检验184
  12.3.5 长游程检验185
  12.3.6 自相关检验185
  12.3.7 FLINT/CLINT随机数生成器的质量185
 12.4 更复杂的函数186
第13章 测试LINT的策略194
 13.1 静态分析195
 13.2 运行时测试196
第二部分 算术:C++实现与LINT类
第14章 用C++精简生活202
 14.1 非公共事务:LINT中数的表示205
 14.2 构造函数206
 14.3 重载运算符208
第15章 LINT公共接口:成员函数和友元函数213
 15.1 算术213
 15.2 数论219
 15.3 LINT对象的I/O流222
  15.3.1 LINT对象的格式化输出223
  15.3.2 操纵器228
  15.3.3 LINT对象的文件I/O230
第16章 错误处理233
 16.1 杜绝慌乱233
 16.2 用户定义的错误处理234
 16.3 LINT异常235
第17章 一个应用实例:RSA密码体制239
 17.1 非对称密码体制239
 17.2 RSA算法240
 17.3 RSA数字签名250
 17.4 C++的RSA类255
第18章 自己动手测试LINT263
第19章 更进一步的扩展方法265
第三部分 附录
附录A C函数目录268
附录B C++函数目录275
附录C 宏286
附录D 计算时间290
附录E 符号292
附录F 运算和数论软件包293
参考文献295

教学资源推荐
作者: (美)詹姆斯·兰萨姆(James Ransome) 安莫尔·米斯拉(Anmol Misra)著
作者: 黄欣沂 赖建昌 著
作者: 贾春福 李瑞琪 袁科 编著
参考读物推荐
作者: (美)Ryan Russell 等
作者: (美)Stephen Northcutt
作者: 吴世忠 江常青 孙成昊 李华 李静 编著