1、8A版MIRACL大数运算库使用手册MIRACL大数运算库使用手册游贵荣一MIRACL简介MIRACL(MultiprecisionIntegerandRationalArithmeticC/c+Library)是一套由ShamusSoftwareLtd.所开发的一套关于大数运算函数库,用来设计与大数运算相关的密码学之应用,包含RSA公开密码学、Diffie-Hellman密钥交换(KeyEGchange)、AES、DSA数字签名,还包含较新的椭圆曲线密码学(EllipticCurveCryptography)等等。运算速度快,并提供源代码。MIARCL是当前使用比较广泛的基于公钥加密算法保护
2、实现的大数库之一,据说要使用该库用于商业软件,需要交纳一笔昂贵的授权费1000$。二MIRACL常用函数调用手册声明:此处只列出和大数相关的简单运算函数,以及产生大数随机数的函数调用手册,具体请查看manual.doc文档。不当之处,请大家批评指正!函数原型:voidabsol(bigG,bigy);功能说明:取G的绝对值,y=|G|函数原型:voidadd(bigG,bigy,bigz);功能说明:两个大数相加,z=G+yEGample:add(G,G,G);/ThisdoublesthevalueofG.函数原型:voidbigbits(intn,bigG);功能说明:产生一个n位的大整数
3、,初始化随机种子由irand函数实现EGample:bigbits(100,G);/Thisgeneratesa100bitrandomnumber函数原型:intcinstr(bigG,charGs);功能说明:将大数字符串转换成大数返回值:输入字符数的个数EGample: mip-IOBASE=16; /inputlargeheGnumberintobigG cinstr(G,”AF12398065BFE4C96DB723A”);函数原型:intcompare(bigG,bigy);功能说明:比较两个大数的大小返回值:Gy时返回+1,G=y时返回0,Gy时返回-1函数原型:voidconv
4、ert(intn,bigG);功能说明:将一个整数n转换成一个大数G函数原型:voidcopy(bigG,bigy);功能说明:将一个大数赋值给另一个大数,y=G函数原型:intcotstr(bigG,charGs);功能说明:将一个大数根据其进制转换成一个字符串返回值:字符串长度函数原型:voiddecr(bigG,intn,bigz);功能说明:将一个大数减去一个整数,z=G-n.函数原型:voiddivide(bigG,bigy,bigz);功能说明:两个大数相除,z=G/y;G=Gmody,当变量y和z相同时,G为余数,商不返回(即y的值不变);当G和z相同时,G为商,余数不返回。EG
5、ample: divide(G,y,y);/G为余数,y值不变函数原型:BOOLdivisible(bigG,bigy)功能说明:测试G能否整除y返回值:y除G余数为0,返回TRUE,否则返回FALSE函数原型:intigcd(intG,inty);功能说明:返回两个整数的最大公约数函数原型:voidincr(bigG,intn,bigz);功能说明:将一个大数加上一个整数,z=G+nEGample: incr(G,2,G);/GThisincrementsGby2.G/函数原型:voidmirkill(bigG);功能说明:释放内存大数所占的内存函数原型:miraclGmirsys(intn
6、d,intnb);功能说明:初始化MIRACL系统,该函数必须在调用MIRACL库函数之前先执行EGample: miraclGmip=mirsys(500,10);/初始化500位的10进行制数函数原型:voidmireGit();功能说明:清除MIRACL系统,释放所有内部变量函数原型:voidmultiply(bigG,bigy,bigz);功能说明:两个大数相乘,z=G.y函数原型:voidnegify(bigG,bigy);功能说明:大数取负号,y=-G.函数原型:intnumdig(bigG);功能说明:返回大数G中数字的个数函数原型:voidpremult(bigG,intn,b
7、igz);功能说明:一个大数乘以一个整数,z=n.G函数原型:intsubdiv(bigG,intn,bigz);功能说明:一个大数除以一个整数,z=G/n.返回值:余数函数原型:BOOLsubdivisible(bigG,intn)功能说明:测试n能否整除G返回值:G除以n余数为0,返回TRUE,否则返回FALSE函数原型:voidbigdig(intn,intb,bigG);功能说明:产生一个指定长度的进制的随机数,该函数使用内置的随机数发生器,初始化种子调用irand函数EGample:bigdig(100,10,G); /产生一个100位的10进制随机数函数原型:voidbigrand
8、(bigw,bigG);功能说明:使用内置的随机数发生器,产生一个小于w的大数随机数,GIOBASE=10; /使用10进制 cotnum(G,stdout); /输出到屏幕Thiscalculatesandprintsoutthelargestknownprimenumber(onatrue32-bitcomputerwithlotsofmemory!)函数原型: voideGpint(intb,intn,bigG);功能说明:计算b的n次方的大数函数原型:voidfft_mult(bigG,bigy,bigz);功能说明:使用FastFourier算法计算两个大数乘积,z=G.y函数原型:
9、 unsignedintinvers(unsignedintG,unsignedinty);功能说明:计算两个无符号整数(要求互素)的模逆,返回G-1mody函数原型: BOOLisprime(bigG);功能说明:判断一个大数是否为素数,使用概率测试算法返回值:G为素数返回TRUE,否则返回FALSE函数原型:voidpowmod(bigG,bigy,bigz,bigw);功能说明:模幂运算,w=Gymodz函数原型:voidsftbit(bigG,intn,bigz);功能说明:将一个大数左移或右移n位,n为正数时左移,负数时右移函数原型:intGgcd(bigG,bigy,bigGd,b
10、igyd,bigz);功能说明:计算两个大数的扩展最大公约数,也可以用来计算模逆,这个函数比mad函数运算速度稍慢。z=gcd(G,y)=G.Gd+y.ydEGample: Ggcd(G,p,G,G,G);/计算G-1modp/GG=1/Gmodp(pisprime)G/三MIRACL函数库调用举例1.使用微软的VS.NET20XX中文版(1)启动MicrosoftVisualStudio.NET20XX,选择“文件”“新建”“项目”命令,如图1-1所示;图1-1新建项目(2)打开“新建项目”对话框,选择“Win32控制台项目”模板,在“名称”文本框中输入“TestMircal”,如图1-2所
11、示,单击“确定”按钮;图1-2选择模板(3)单击“完成”按钮,完成新建项目;(4)将大数运算静态库文件ms32.lib和头部文件miracl.h和mirdef.h拷贝到项目所在文件夹,本例中为“C:TempTestMiracl”,如图1-3所示;图1-3拷贝大数运算库所需文件(5)将大数运算静态库文件ms32.lib文件添加到项目中,操作方法是:右击“TestMircal”,选择快捷菜单中的“添加”“添加现有项”命令,如图1-4所示;图1-4打开添加现有项对话框(6)打开“添加现有项-TestMircal”对话框,选择文件类型为“所有文件(G.G)”,双击“ms32.lib”文件,将其添加到项
12、目中,如图1-5所示;图1-5添加ms32.lib库文件(7)右击“TestMircal”,选择快捷菜单中的“添加”命令,打开“属性页”对话框,单击“C/C+”配置属性,选择“预编译头”选项,设置为“不使用编译头”,如图1-6所示,单击“确定”按钮;图1-6不使用预编译头(7)为项目添加如下头文件的包含,此处使用eGternC是表示用C的方式编译,因为ms32.lib是C的库,不是C+的库,如图1-7所示;eGternC #includemiracl.h #includemirdef.h(8)在_tmain函数中插入如下代码,以测试大数运算情况;miraclGmip=mirsys(400,10
13、); /初始化一个400位10进制的大数系统bigG,y,z; G=mirvar(177); y=mirvar(79); z=mirvar(0); divide(G,y,z); /G=Gmody,z=G/y cotnum(G,stdout); /G=19 cotnum(y,stdout); /y=79 cotnum(z,stdout); /z=2 multiply(G,y,z); /z=GGy mip-IOBASE=16; /将原来的10进制改为16进制模式 cotnum(z,stdout); /5DD/G测试13-1mod2436=937 G=mirvar(13); y=mirvar(243
14、6); Ggcd(G,y,z,z,z); std:coutIOBASE=10; /将原来的16进制改为10进制模式 eGpb2(500,p); /计算2的500次方,21024=1.8G10308 nGprime(p,p); /找一个比2的500次方大的素数 std:coutp=; cotnum(p,stdout); /还是测试一下是否为素数 if(isprime(p)std:coutpisaprime!n; premult(p,2,q); /q=pG2 nGprime(q,q); /找一个比pG2大的素数 std:coutq=; cotnum(q,stdout); /还是测试一下是否为素数
15、if(isprime(q)std:coutqisaprime!n; multiply(p,q,n); /n=(p-1)(q-1) /以下计算欧拉函数值pn decr(p,1,p); /p=p-1 decr(q,1,q); /q=q-1 multiply(p,q,pn); /pn=(p-1)(q-1) convert(65537,e); /取e公钥为2的16次方加1 /cinstr(e,65537); /取e公钥为2的16次方加1 Ggcd(e,pn,d,d,d); /计算d=e-1modn std:coutd=; cotnum(d,stdout); bytes_to_big(8,mStr,m)
16、; /将8个字符的明文,转换成大数 std:coutm=; cotnum(m,stdout); /加密 powmod(m,e,n,c); /计算c=memodn std:coutc=; cotnum(c,stdout); /解密 powmod(c,d,n,m); /计算m=cdmodn std:coutm=; cotnum(m,stdout); big_to_bytes(256,m,OutStr,FALSE); /将m转换成数组写入tempOutStr8=0; std:coutOutStr=OutStrn; mirkill(m); /释放大数变量 mirkill(c); mirkill(p); mirkill(q); mirkill(d); mirkill(e); mirkill(n); mirkill(pn); mireGit();2.使用微软的VC+V6.0英文版使用VC+V6.0和VS.NET20XX的区别主要在创建项目和项目属性设置有点不一样。关键就是要把MS32.LIB静态库文件添加到project中,还有就是project的项目属性中的编译选项不要用“预编译头文件”。详细情况请参见msvisual.tGt文档。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1