大整数基本运算实现研究报告及分析.docx
《大整数基本运算实现研究报告及分析.docx》由会员分享,可在线阅读,更多相关《大整数基本运算实现研究报告及分析.docx(20页珍藏版)》请在冰豆网上搜索。
大整数基本运算实现研究报告及分析
课程设计
课程名称应用密码学
题目名称大整数基本运算的实现研究及分析
学生学院应用数学
专业班级信息安全081班
学号3108008921,3108008945,3108008944
学生姓名洪亿鹏,熊邦名,伍尚鹏
指导教师李峰
2018年12月19日
广东工业大学课程设计任务书
题目名称
大整数基本运算的实现研究及分析
学生学院
应用数学学院
专业班级
08级信息安全<1)班
姓名
洪亿鹏,熊邦名,伍尚鹏
学号
3108008921,3108008945,3108008944
一、课程设计的内容
本文介绍了一种这样的大整数在程序设计语言中的表示的方法,并对这种方法表示的大整数的基本运算进行了分析,给出了实现算法,并提供良好的用户界面。
二、课程设计的要求与数据
1.实现大整数的基本运算;
2.提供友好的用户界面;
三、课程设计应完成的工作
1、查阅相关资料,了解关于大整数基本运算的实现研究及分析;
2、在VisualC++6.0进行编程,设计出合乎要求的程序;
3、测试程序的正确性和稳定性;
4、根据<<广东工业大学课程设计管理规定>>,写出课程设计说明书。
四、课程设计进程安排
序号
设计各阶段内容
地点
起止日期
1
领取课程设计任务
课室
2018.12.13
2
组员讨论选取课程设计题目
课室
2018.12.13
3
查阅相关课题的各种资料
图书馆,宿舍
2018.12.13~2018.12.14
4
组员直接讨论课题,并且分配各部分任务
课室
2018.12.14
5
各自编写各部分代码
宿舍
2018.12.15~2018.12.17
6
汇集已写好的各部分代码,并进去测试
宿舍
2018.12.18
7
代码顺利运行,运用MFC可视化方法为程序提供友好的用户界面
宿舍
2018.12.19
8
分工合作拟写课程设计报告书
宿舍
2018.12.19
五、应收集的资料及主要参考文献
[1]宋震.密码学[M].北京:
中国水利水电出版社.2002:
87-151.
[2](美>GarlisleAdamsSteveLloyd著冯登国等译.公开密钥基础设施——概念、标准和实施[M].北京:
人民邮电出版社.2001:
71-98.
[3]王永祥.超高精度超大数算法与程序设计[M].陕西:
西安交通大学出版社,1990:
75-105.
[4]胡向东,魏琴芳编著.应用密码学.北京:
电子工业出版社,2006.11
[5]谭浩强,C程序设计<第三版)北京:
清华大学出版社,2005
[6]郑莉,C++语言程序设计<第三版)北京:
清华大学出版社,2006
发出任务书日期:
年月日指导教师签名:
计划完成日期:
年月日基层教案单位责任人签章:
主管院长签章:
摘要
随着计算机信息安全要求的不断提高,密码学被大量应用到生活中。
在现代密码学中,安全性基于复杂数学问题的难解性假设的加密方法,往往需要进行大整数运算,这些大整数已经远远超过了程序设计语言所能表示的最大整数值范围。
也不能使用一般的四则运算法则进行运算。
本文介绍了一种这样的大整数在程序设计语言中的表示的方法,并对这种方法表示的大整数的基本运算进行了分析,给出了实现算法。
RSA、ElGamal、DSA、ECC等公钥密码算法和数字签名算法都建立在大整数运算的基础上,比较耗时的大整数乘法、除法、模乘、幂运算、幂乘等运算却被上述算法大量使用,它们的运算速度对这些算法的高效实现起着重要的作用,如何快速实现上述几种运算是公钥密码领域普遍关注的热点问题。
关键词:
大整数、存储、模块、数组。
1绪论1
1.1大整数的概念1
1.2大整数处理的应用价值1
1.3大整数处理的研究现状1
1.4本文主要研究内容2
2大整数概述2
2.1本文研究的大整数特定含义2
2.2大整数的存储2
2.3大整数的输入与读取3
2.4大整数的基本运算处理3
3大整数的类的开发3
3.1如何表示一个大整数(12345678901234567890>3
3.2用C++编写大整数类3
3.3本章小结5
4基本运算的原理和代码实现5
4.1加法运算5
4.11实现原理5
4.12代码实现6
4.13数据测试结果8
4.2减法运算8
4.21减法运算代码实现8
4.22数据测试结果10
4.3乘法运算11
4.31乘法运算原理11
4.32乘法运算代码实现12
4.33数据测试结果14
4.4除法运算14
4.41除法运算代码实现14
4.42数据测试结果16
结论17
参考文献17
附录A17
1绪论
1.1大整数的概念
“大整数”一般指位数达到十几或成百上千甚至更多的整数,而更准确地说,应该是指普通程序设计语言中的整数类型值集范围以上的整数。
如标准的C的Unsignedlong型整数所能处理的整数范围最大,有效数位也最多,为4294967295(
>占据32位<4个字节)存贮空间,此时,大整数就是指十位以上的十进制整数了。
“大整数”运算是指“大整数”之间的加减乘除等运算结果依然保持其数学理论上准确和精确的结果。
1.2大整数处理的应用价值
“大整数”运算在数学验证方面有重要的应用价值。
数学中的大整数运算验证工作如果靠手工计算完成,从时间上看几乎是不可能,而借助于计算机,由于传统编程方法精确度远远达不到要求,所以也无法完成。
有了大整数运
算程序,这些工作才能得以进行。
大整数运算在密码学中具有实用价值。
随着计算机发展,密码运算对整数运算长度、速度等要求越来越高,因而对大整数运算的精准精度也越来越高,高效的大整数运算系统不仅可用于密码学的实践教案环节,也可用于实际的密码处理工作中。
大整数运算在微观模拟(如生物信息、基因工程、数量遗传>中的应用前景广泛。
微观世界中的许多对象的活动可以进行数字化模拟,而且其活动变化也可以通过大整数的运算来表示,其表达与处理就非常方便了。
1.3大整数处理的研究现状
由于“大整数”超出了程序设计语言本身整数类型值集范围,所以它的表达、存储、读取、处理(各种运算>、输出等问题用一般编程方法难以解决。
一般的程序设计语言数值处理范围均有限。
C++及其系列语言的数值处理的有效数位是整型4个字节,数值型可达到8个字节。
新版的微软操作系统自带的“运算器”的处理能力非常强,但精确数位也只能达到32个十进制位。
因而大整数运算处理系统的研究与开发有极强的实际意义。
由于大整数处理系统的复杂性,以及其一般用于高尖新技术领域,所以系统
化研究及其开发工作主要集中在一些国家级的计算中心、安全中心。
但随着大整
数应用领域逐渐扩大及个人计算机处理能力的快速发展,这项工作已经受到越来
越多的科技工作者的关注。
1.4本文主要研究内容
本文基于MFC应用框架,首先采用模块化的思想建立大整数运算库,利用数组存储不大于310位的大整数,在实现一些辅助函数后在此运算库框架上讨论并实现多精度大整数的基本加法、减法、乘法、除法等基本算法。
本文采用C++为主要语言编写程序代码。
在保证算法有足够高的效率的同时力求代码清晰易懂,函数接口简单明了,具有可移植性和稳定性。
2大整数概述
2.1本文研究的大整数特定含义
为了系统地研究大整数的处理,本文提到的大整数处理程序中所指的大整数是指最大位数为310位的大整数。
采用数组存储方式存储。
2.2大整数的存储
我们采用数组存储的方式存储,也可以采用字符串的方式存储,但最终还是要转化为“数组”的方式存储,并且存储的位数不能大于310位,否则会发生溢出错误而导致大整数处理错误。
2.3大整数的输入与读取
如果是从键盘输入大整数,要求连续输入正负号及全部数字,程序将实现专用处理命令自动完成分组。
2.4大整数的基本运算处理
本程序可以实现位数少于310位的大整数的加,减,乘,除等运算,输出位数同样不可以大于310位,对于负数,程序将不能处理,并且不能直接输入。
3大整数的类的开发
3.1如何表示一个大整数(12345678901234567890>
3.2用C++编写大整数类
classCBigInt
{
public:
//大数在0x100000000进制下的长度
unsignedm_nLength。
//用数组记录大数在0x100000000进制下每一位的值
unsignedlongm_ulValue[BI_MAXLEN]。
CBigInt(>。
~CBigInt(>。
/*
基本操作与运算
Mov,赋值运算,可赋值为大数或普通整数,可重载为运算符“=”
Cmp,比较运算,可重载为运算符“==”、“!
=”、“>=”、“<=”等
Add,加,求大数与大数或大数与普通整数的和,可重载为运算符“+”
Sub,减,求大数与大数或大数与普通整数的差,可重载为运算符“-”
Mul,乘,求大数与大数或大数与普通整数的积,可重载为运算符“*”
Div,除,求大数与大数或大数与普通整数的商,可重载为运算符“/”
*/
voidMov(unsigned__int64A>。
voidMov(CBigInt&A>。
CBigIntAdd(CBigInt&A>。
CBigIntSub(CBigInt&A>。
CBigIntMul(CBigInt&A>。
CBigIntDiv(CBigInt&A>。
CBigIntAdd(unsignedlongA>。
CBigIntSub(unsignedlongA>。
CBigIntMul(unsignedlongA>。
CBigIntDiv(unsignedlongA>。
intCmp(CBigInt&A>。
voidGet(CString&str,unsignedintsystem=HEX>。
//Get,从字符串按10进制或16进制格式输入到大数
voidPut(CString&str,unsignedintsystem=HEX>。
//Put,将大数按10进制或16进制格式输出到字符串
CBigIntEuc(CBigInt&A>。
CBigIntRsaTrans(CBigInt&A,CBigInt&B>。
}。
3.3本章小结
基于面向对象程序设计开发的基本思想,本章介绍了大整数“类”的结构,包括大整数的构造,加,减,乘,除基本运算的函数模块和大整数的获取、赋值函数模块。
4基本运算的原理和代码实现
4.1加法运算
4.11实现原理
如何进行大整数的加法运算
4.12代码实现
CBigIntCBigInt:
:
Add(CBigInt&A>
{//大数相加,调用形式:
N.Add(A>,返回值:
N+A
CBigIntX。
X.Mov(*this>。
unsignedcarry=0。
//进位
unsigned__int64sum=0。
if(X.m_nLengthX.m_nLength=A.m_nLength。
for(unsignedi=0。
ii++>
{
sum=A.m_ulValue[i]。
sum=sum+X.m_ulValue[i]+carry。
X.m_ulValue[i]=(unsignedlong>sum。
carry=(unsigned>(sum>>32>。
}
X.m_ulValue[X.m_nLength]=carry。
X.m_nLength+=carry。
returnX。
}
CBigIntCBigInt:
:
Add(unsignedlongA>
{
CBigIntX。
X.Mov(*this>。
unsigned__int64sum。
sum=X.m_ulValue[0]。
sum+=A。
X.m_ulValue[0]=(unsignedlong>sum。
if(sum>0xffffffff>
{
unsignedi=1。
while(X.m_ulValue[i]==0xffffffff>{X.m_ulValue[i]=0。
i++。
}
X.m_ulValue[i]++。
if(m_nLength==i>m_nLength++。
}
returnX。
}
4.13数据测试结果
图4.13
4.2减法运算
4.21减法运算代码实现
CBigIntCBigInt:
:
Sub(CBigInt&A>
{//大数相减调用形式:
N.Sub(A>返回值:
N-A
CBigIntX。
X.Mov(*this>。
if(X.Cmp(A><=0>{X.Mov(0>。
returnX。
}
unsignedcarry=0。
unsigned__int64num。
unsignedi。
for(i=0。
ii++>
{
if((m_ulValue[i]>A.m_ulValue[i]>||((m_ulValue[i]==A.m_ulValue[i]>&&(carry==0>>>
{
X.m_ulValue[i]=m_ulValue[i]-carry-A.m_ulValue[i]。
carry=0。
}
else
{
num=0x100000000+m_ulValue[i]。
X.m_ulValue[i]=(unsignedlong>(num-carry-A.m_ulValue[i]>。
carry=1。
}
}
while(X.m_ulValue[X.m_nLength-1]==0>X.m_nLength--。
returnX。
}
CBigIntCBigInt:
:
Sub(unsignedlongA>
{
CBigIntX。
X.Mov(*this>。
if(X.m_ulValue[0]>=A>{X.m_ulValue[0]-=A。
returnX。
}
if(X.m_nLength==1>{X.Mov(0>。
returnX。
}
unsigned__int64num=0x100000000+X.m_ulValue[0]。
X.m_ulValue[0]=(unsignedlong>(num-A>。
inti=1。
while(X.m_ulValue[i]==0>{X.m_ulValue[i]=0xffffffff。
i++。
}
X.m_ulValue[i]--。
if(X.m_ulValue[i]==0>X.m_nLength--。
returnX。
}
4.22数据测试结果
图4.22
4.3乘法运算
4.31乘法运算原理
4.32乘法运算代码实现
CBigIntCBigInt:
:
Mul(CBigInt&A>
{//大数相乘调用形式:
N.Mul(A>返回值:
N*A
if(A.m_nLength==1>returnMul(A.m_ulValue[0]>。
CBigIntX。
unsigned__int64sum,mul=0,carry=0。
unsignedi,j。
X.m_nLength=m_nLength+A.m_nLength-1。
for(i=0。
ii++>
{
sum=carry。
carry=0。
for(j=0。
jj++>
{
if(((i-j>>=0>&&((i-j>>
{
mul=m_ulValue[i-j]。
mul*=A.m_ulValue[j]。
carry+=mul>>32。
mul=mul&0xffffffff。
sum+=mul。
}
}
carry+=sum>>32。
X.m_ulValue[i]=(unsignedlong>sum。
}
if(carry>{X.m_nLength++。
X.m_ulValue[X.m_nLength-1]=(unsignedlong>carry。
}
returnX。
}
CBigIntCBigInt:
:
Mul(unsignedlongA>
{
CBigIntX。
unsigned__int64mul。
unsignedlongcarry=0。
X.Mov(*this>。
for(unsignedi=0。
ii++>
{
mul=m_ulValue[i]。
mul=mul*A+carry。
X.m_ulValue[i]=(unsignedlong>mul。
carry=(unsignedlong>(mul>>32>。
}
if(carry>{X.m_nLength++。
X.m_ulValue[X.m_nLength-1]=carry。
}
returnX。
}
4.33数据测试结果
图4.33
4.4除法运算
4.41除法运算代码实现
CBigIntCBigInt:
:
Div(CBigInt&A>
{//大数相除调用形式:
N.Div(A>返回值:
N/A
if(A.m_nLength==1>returnDiv(A.m_ulValue[0]>。
CBigIntX,Y,Z。
unsignedi,len。
unsigned__int64num,div。
Y.Mov(*this>。
while(Y.Cmp(A>>=0>
{
div=Y.m_ulValue[Y.m_nLength-1]。
num=A.m_ulValue[A.m_nLength-1]。
len=Y.m_nLength-A.m_nLength。
if((div==num>&&(len==0>>{X.Mov(X.Add(1>>。
break。
}
if((div<=num>&&len>{len--。
div=(div<<32>+Y.m_ulValue[Y.m_nLength-2]。
}
div=div/(num+1>。
Z.Mov(div>。
if(len>
{
Z.m_nLength+=len。
for(i=Z.m_nLength-1。
i>=len。
i-->Z.m_ulValue[i]=Z.m_ulValue[i-len]。
for(i=0。
ii++>Z.m_ulValue[i]=0。
}
X.Mov(X.Add(Z>>。
Y.Mov(Y.Sub(A.Mul(Z>>>。
}
returnX。
}
CBigIntCBigInt:
:
Div(unsignedlongA>
{
CBigIntX。
X.Mov(*this>。
if(X.m_nLength==1>{X.m_ulValue[0]=X.m_ulValue[0]/A。
returnX。
}
unsigned__int64div,mul。
unsignedlongcarry=0。
for(inti=X.m_nLength-1。
i>=0。
i-->
{
div=carry。
div=(div<<32>+X.m_ulValue[i]。
X.m_ulValue[i]=(unsignedlong>(div/A>。
mul=(div/A>*A。
carry=(unsignedlong>(div-mul>。
}
if(X.m_ulValue[X.m_nLength-1]==0>X.m_nLength--。
returnX。
}
4.42数据测试结果
图4.42
结论
一个星期的课程设计结束,通过我们组成员的合作,终于完成了本次课程设计。
中间,我们也遇到了很多的问题,例如MFC的应用,数据存储的方式,算法的实现等。
通过我们的共同努力,看了不同的资料。
总算找到了解决的方案。
这次课程设计,我们组员之间分工明确,都很出色的做好了自己的工作。
其中,洪亿鹏同学完成了大数算法的乘法部分,并且领导全体组员一起完成了除法部分的算法,在MFC的实现过程中,成为核心角色,而在最后的论文编写中,也给出了也重要的指示,带领大家完成任务;熊邦名同学完成了大数算法的加法部分,协调组员之间的关系,大家团结一致完成认为,并且在论文编写中做出了比较大的贡献;伍尚鹏同学完成了大数算法的减法部分;发扬不怕苦不怕累的精神,拼搏精神感染了大家,为这次课程设计的圆满完成作出了很大的贡献,同时论文编写部分也是以伍尚鹏同学为核心完成的,大家通力合作。
本文讨论的主要是大数运算中的基本算法,而要实现一个比较好的大数运算库则除此之外还有很多工作要做。
大数算法是一个很大的考验,既要有不错的软件编码知识又要对硬件细节有足够的了解,还要求会根据情况自己推导数学公式,优化算法,同时也需要很强的耐心、足够的细心和大量的时间。
参考文献
[4]宋震.密码学[M].北京:
中国水利水电出版社.2002:
87-151.
[5](美>GarlisleAdamsSteveLloyd著冯登国等译.公开密钥基础设施——概念、标准和实施[M].北京:
人民邮电出版社.2001:
71-98.
[6]王永祥.超高精度超大数算法与程序设计[M].陕西:
西安交通大学出版社,1990:
75-105.
[4]胡向东,魏琴芳编著.应用密码学.北京:
电子工业出版社,2006.11
[5]谭浩强,C程序设计<第三版)北京:
清华大学出版社,2005
[6]郑莉,C++语言程序设计<第三版)北京:
清华大学出版社,2006
附录A
#ifndefBI_MAXLEN
#defineBI_MAXLEN35
#defineDEC10
#defineHEX16
/***************************************************************************
从字符串按10进制或16进制格式输入到大数
调用格式:
N.Get(str,sys>
返回值:
N被赋值为相应大数
sys暂时只能为10或16
***************************************************************************/
voidCBigInt:
:
Get(CString&str,unsignedintsystem>
{
intlen=str.GetLength(>,k。
Mov(0>。
for(inti=0。
ii++>
{
Mov(Mul(system>>。
if((str[i]>='0'>&&(str[i]<='9'>>k=str[i]-48。
elseif((str