基本信息

编辑推荐
专门为C/C++程序员编写的密码书籍,不仅分析密码学的理论基础,更详细讲述了如何安全并高效地实现密码学算法。
内容简介
作译者
目录
译者序
序
英文第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
译者序
密码技术从诞生之初就以保护军事机密和商业机密为目标。我们的日常生活也离不开密码技术,如无线网络接入认证、安全电子邮件系统等。因此,我们不仅要分析密码学的理论基础,更要研究密码学的具体实现。本书就是这样一本专注于密码学实现的书籍,这种独特的视角使其在众多密码学理论书籍中脱颖而出。
本书讨论了如何使用C语言和C++语言实现密码学算法。这一过程远比想象的复杂。公钥密码学以大整数计算为基础,而这些大整数远远超过了C语言和C++语言对整数的处理范围,因此实现密码学算法必须先实现大整数计算。在大整数计算的基础上,本书介绍了大量密码学算法的实现,并确保它们既高效又安全。
作为一本密码学的书籍,本书叙述了一个重要的对称加密算法AES的理论及实现,也完整地实现了一个重要的非对称密码系统——RSA加密和RSA签名。作为一本算法实现的书籍,本书严格遵循软件开发的原则,详细描述了设计思想及错误处理方法,并对所有函数进行了广泛的测试。
对于以实现真正实用的密码学算法为目的,并了解相关理论基础的读者而言,本书是一本极佳的读本。
由于译者的外语水平及专业知识有限,所以在翻译中难免有错误或不妥之处,请读者理解并指正。
译者
2015年8月
前言
当必须与数字打交道时,我宁愿把自己塞进地洞中,这样就看不见任何东西。如果我抬起头,看见大海、一棵树或者一个女人(即使只是一个老妇人),如果将所有的结果和数字都化作一阵轻烟。它们长出翅膀飞走了,我只能去追赶。
——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版前言
数学是一门被误解甚至被中伤的学科。它不是在小学里我们被灌输的蛮力计算,也不是关于清算的科学。数学家不会把他们的时间花在想出更聪明的乘法方法、更快的加法方法以及更好的开立方方法上。
——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版前言
序言
最近三十年的密码学历史是一段非同寻常的成功故事。最重要的事件无疑是20世纪70年代中期公钥密码学的发现。这是一场真正的革命:现在我们知道那些以前不敢想象的事物是可能的。Diffie和Hellman第一个公开表达了安全通信必须能自发地发生的愿景。在此之前,发送者和接收者必须首先通过保密通信建立一个共同的密钥。Diffie和Hellman提出了一个天真的问题:人们是否可以在不共享一个共同密钥的情况下进行保密通信?他们的想法是不使用其他人不知道的私钥加密信息。这个想法标志着公钥密码学的诞生。随着几年后RSA算法的出现,这一愿景不再只是一个大胆的猜测。
数学与计算机科学富有成效的合作使现代密码学成为可能。数学为算法的创造和分析提供了基础。没有数学,尤其是没有数论,公钥密码学就无法实现。数学提供了用于算法运算的成果。
若要实现密码学算法,则需要能够支持大整数计算的程序:这些算法不能仅在理论上发挥作用,还必须按现实世界的规范执行。这是计算机科学的任务所在。
本书区别于所有其他相关书籍的地方在于,本书阐明了数学和计算之间的关系。我没有看到任何其他的密码学书籍能在充分地呈现数学基础的同时,还能提供大量的实际应用,并且使所有内容都清晰易读。
本书是作者对其专业知识的精彩呈现。他了解理论,并且能清晰地表达它们;他了解应用,并且能展现许多程序来实现它们;他了解许多东西,但没有表现出无所不知的样子;他清晰地提出他的论据,以便读者能获得一个清晰的理解。简而言之,这是一本出色的书。
祝福作者!并祝福你,本书的读者!