大整数乘法的实现与分析Word文档格式.docx
《大整数乘法的实现与分析Word文档格式.docx》由会员分享,可在线阅读,更多相关《大整数乘法的实现与分析Word文档格式.docx(67页珍藏版)》请在冰豆网上搜索。
![大整数乘法的实现与分析Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-10/20/aaded0bf-a6dc-4dbb-8716-84fa19dd4775/aaded0bf-a6dc-4dbb-8716-84fa19dd47751.gif)
专业班级______________________
学号______________________
学生姓名______________________
指导教师______________________
2008年6月
摘要
随着计算机信息安全要求的不断提高,密码学被大量应用到生活中。
RSA、ElGamal、DSA、ECC等公钥密码算法和数字签名算法都建立在大整数运算的基础上,比较耗时的大整数乘法、模乘、幂运算、模幂乘运算等却被上述算法大量使用,它们的运算速度对这些算法的高效实现起着重要的作用,如何快速实现上述几种运算是公钥密码领域普遍关注的热点问题。
本文基于32位的系统,首先采用模块化的思想建立大整数运算库的基础框架,在实现一些辅助函数后在此框架上讨论并实现多精度大整数的基本乘法、Comba乘法、Karatsuba乘法、各种平方算法、Barrett缩减、Mentgomery缩减、模乘、Mentgomery模幂乘等算法及相关的算法。
本文讨论的所用程序均采用C语言编写,所采用的优化也均建立在C语言这一层面上,在保证算法有足够高的效率的同时力求代码清晰易懂,函数接口简单明了,具有可移植性和稳定性。
关键词:
多精度大整数,缩减,模幂乘,滑动窗口
Abstract
Nowadays,ascomputerinformationsecurityrequirementsimprovecontinuously,thecryptologyiswidelyappliedtolife.PublickeycryptographicalgorithmsanddigitalsignaturealgorithmssuchasRSA,ElGamal,DSA,ECCareallbaseonmultipleprecisionarithmetic.Multipleprecisionmultiplication,modularmultiplication,exponentiation,modularexponentiationwhichneedmoreworkingtimeisusedbypublickeycryptographicalgorithmswidely,theirspeedisveryimportanttotheimplementationsofthosealgorithms.Howtofastimplementthosearithmeticaboveisthehottopicinthepublickeycryptographicfield.
Thispaperisbasedonthe32bitsystem.First,wefoundthemodularfoundationofmultipleprecisionarithmeticlibrary;
Aftersomeauxiliaryfunctionisformed,wediscussandimplementthemultipleprecisionintegerbasicmultiplication,Combamultiplication,Karatsubamultiplication,kindsofsquarealgorithms,Barrettreduction,Montgomeryreduction,MontgomeryModularExponentiationalgorithmandsomerelationalfunction.AllthealgorithmsdiscussinthispaperisimplemententirelyinportableISOCandtheoptimizationofthosealgorithmsimplementationsisbuiltontheclanguagelevel.Clearcode,simpleapplicationprogramminginterfaceisasimportantastheefficiency,therobustnessandtheportability.
Keywords:
MultiplePrecisionInteger,Reduction,ModularExponentiation,SlidingWindow
1绪论
1.1题目背景
科技的发展特别是网络的发展使计算机深入到了各行各业的方方面面,计算机在带来方便和提高了工作效率的同时却也带来了各种各样的新问题,其中信息安全问题最为突出,随着计算机信息安全要求的不断提高,计算机保密系统已变得越来越重要,密码学应用不再是局限于军事、国防等有限领域,而是迅速的走进了千家万户,如CA认证、电子政务、电子商务、数字签名、身份认证、密钥分发等。
RSA、ElGamal、DSA、ECC等公钥密码算法和数字签名算法都建立在大整数运算的基础上,耗时的大整数乘法、模乘、幂运算、模幂乘运算等更是被上述算法大量使用,它们的运算速度对这些算法的高效实现起着重要的作用,如何快速实现上述几种运算是公钥密码领域普遍关注的热点问题。
1.2国内外研究状况
长期以来,各方面的工作者对大数模幂的快速实现问题进行了大量研究,主要围绕模幂算法设计与优化、模乘算法设计与优化、专用芯片设计等,并且已经取得不少研究成果。
模幂通常都转化为一系列模乘和模平方运算,目前较好的算法已经能够将1次n比特数的模幂运算转化为约5n/4次n比特的模乘运算,再减少模乘的次数的难度很大,因此,提高模乘的速度是模幂快速实现的关键[1]。
目前,模乘主要有估商型、加法型和Montgomery型3类方法。
1960年,Pope和Stein就提出了采用估商方法将模乘转化为一系列乘法和除法进行计算的思想;
1981年,Knuth具体给出了一种转换为乘法和除法的估商型模乘算法[2];
1987年,Barrett提出了一种转换为乘法和加法而没有除法的估商型模乘算法[3]。
1983年,Blakley提出了一种加法型模乘算法,其设计思想是将模乘转换为一系列加法[4]。
为减少加法次数,人们提出了窗口模乘算法和滑动窗口模乘算法,并相继提出了不少改进方法,获得较理想的结果。
1985年Montgomery提出了一种计算模乘的有效算法,其设计思想是将普通模乘转换为易于计算的特殊模乘[5]。
此后,人们提出了不少基于Montgomery思想的改进算法,并得到了广泛的实际应用。
大多数情况下,一种算法的理论描述和实际实现之间有不小的差距,是两个完全的不同的概念,因此,众多学者为这些优秀算法的具体的软、硬件实现、优化付出了辛勤的汗水,在软件实现方面这些算法多数被包含在某些算法库中,其中也有不少是开放源代码的算法函数库,最著名的就是GNU的号称地球上最快的多精度大数库GMP,还有Miracl、openssl、cryptopp、cryptlib、flint等优秀的算法库,而我国的郭先强先生的HugeCalc.dll库也同样出名,虽然它不是开放源码的,但它的速度赶得上GMP甚至在某些方面超越了GMP[6]。
然而,正如TomStDenis所说,不存在一个易懂的大数库[7]!
从目前收集到的信息看,凡是效率高的算法实现,要么结构复杂、层次庞大,要么编码风格奇特;
所有速度快的库都使用了汇编,同时大部分都使用了MMX、SSE2、SIMD系列指令作加速,也对多核心CPU进行了优化,使用了多线程等,甚至运行时监测CPU类型而使用相关的特殊优化,最大限度地榨取CPU的性能。
然而,这些很好的优化技术却大大地降低了代码的可读性,极大地提高了理解、学习的门槛。
在学术专著方面,大数算术也备受欢迎,DonaldE.Knuth也用了一整本书——《TheArtofComputerProgrammingVolume2》来从理论的角度讲述了多精度算术,并讲解了高效的算法背后关键的数学概念;
《HandbookofAppliedCryptography》[8]也讲述了应用密码学相关的大数算术算法的有效实现;
而《KryptographieinCundC++》[9]和《BigNumMath:
ImplementingCryptographicMultiplePrecisionArithmetic》等则从编码学的角度对大数算术进行了多方面的讨论。
1.3本文构成及研究内容
本文所讨论的所有算法的实现都不使用汇编、多媒体加速指令、多线程等技术,本文讨论的所用程序均采用C语言编写,所采用的优化也均建立在C语言这一层面上,在保证算法有足够高的效率的同时力求代码清晰易懂,函数接口简单明了,具有可移植性和稳定性。
2基础设置
大整数运算是一些相当复杂的运算,虽然本文要实现的只是乘法类运算,但还是很有必要采用模块化思想按照层次结构来设计及实现一些其它的辅助函数,而不是把它们内嵌在算法函数内,这样既能够避免算法函数的程序代码的过分冗长、使代码清晰易懂、突出算法过程又能够使程序易于测试、排错、更新和复用。
由于本文重点在乘法类算法,下面只介绍一些关键的辅助函数,其它辅助函数要到相关算法使用到时再简略介绍。
2.1大整数的表示
大数的表示方式有很多种,最容易想到也是最直接易懂的跟手工计算方式最接近的方式是通过字符数组来保存大数,数组的每个元素保存大数的一个十进制数字,这种方式操作比较简单,但这种方式需要较多的额外运算,而且效率明显不高,也需要比较多的存储空间;
另一种方式是采用链表作为存储结构,这种方式可以适应不同长度的大数,但这种方式的存储效率不高,对本身就需要不少内存空间的大数运算来说是个明显的负担,而且频繁的堆操作和解引用操作势必大量增加开销,而链表的不连续的存储方式也大大的降低了CPU的高速缓存cache的命中率,不利于编译器优化速度;
效率比较高的,被采用的比较多的方式是用B进制数组存储大数,即把大数转化B进制表示,数组的每个元素存储这个B进制数的一个B进制的数位,这样既方便计算机处理又提高了内存的利用率,同时缩短了大数的实际表示长度,减少了循环的次数,有利于提高效率。
根据内存管理方式的不同,B进制数组的方式还可以细分为两种方式——多精度和固定精度。
在多精度算法中,我们通过分配所需要的新的内存来表示运算的结果,试图容纳任意大小的整数,增加了对数字大小的兼容性,这对于处理未知大小的数字很有用,但是,它有在计算过程中可能需要执行堆操作,这会带来一定的开销;
固定精度算法只有一个有限(固定的)空间来存储一个大数的表示,所以计算过程不需要堆操作,但它需要注意溢出问题对运算结果的准确性所带来的影响。
固定精度非常适合用于输入的大小是事先已知的任务中[10]。
为了更好的适应各种算法的需要及避免过度浪费存储空间,本文采用多精度的方式。