miracl使用手册

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

MIRACL大数运算库使用手册游贵荣一.MIRACL简介MIRACL(MultiprecisionIntegerandRationalArithmeticC/c++Library)是一套由ShamusSoftwareLtd.所开发的一套关于大数运算函数库,用来设计与大数运算相关的密码学之应用,包含了RSA公开密码学、Diffie-Hellman密钥交换(KeyExchange)、AES、DSA数字签名,还包含了较新的椭圆曲线密码学(EllipticCurveCryptography)等等。运算速度快,并提供源代码。MIARCL是当前使用比较广泛的基于公钥加密算法保护实现的大数库之一,据说要使用该库用于商业软件,需要交纳一笔昂贵的授权费——1000$。二.MIRACL常用函数调用手册声明:此处只列出和大数相关的简单运算函数,以及产生大数随机数的函数调用手册,具体请查看manual.doc文档。不当之处,请大家批评指正!函数原型:voidabsol(bigx,bigy);功能说明:取x的绝对值,y=|x|函数原型:voidadd(bigx,bigy,bigz);功能说明:两个大数相加,z=x+yExample:add(x,x,x);//Thisdoublesthevalueofx.函数原型:voidbigbits(intn,bigx);功能说明:产生一个n位的大整数,初始化随机种子由irand函数实现Example:bigbits(100,x);//Thisgeneratesa100bitrandomnumber函数原型:intcinstr(bigx,char*s);功能说明:将大数字符串转换成大数返回值:输入字符数的个数Example:mip-IOBASE=16;//inputlargehexnumberintobigxcinstr(x,”AF12398065BFE4C96DB723A”);函数原型:intcompare(bigx,bigy);功能说明:比较两个大数的大小返回值:xy时返回+1,x=y时返回0,xy时返回-1函数原型:voidconvert(intn,bigx);功能说明:将一个整数n转换成一个大数x函数原型:voidcopy(bigx,bigy);功能说明:将一个大数赋值给另一个大数,y=x函数原型:intcotstr(bigx,char*s);功能说明:将一个大数根据其进制转换成一个字符串返回值:字符串长度函数原型:voiddecr(bigx,intn,bigz);功能说明:将一个大数减去一个整数,z=x-n.函数原型:voiddivide(bigx,bigy,bigz);功能说明:两个大数相除,z=x/y;x=xmody,当变量y和z相同时,x为余数,商不返回(即y的值不变);当x和z相同时,x为商,余数不返回。Example:divide(x,y,y);//x为余数,y值不变函数原型:BOOLdivisible(bigx,bigy)功能说明:测试x能否整除y返回值:y除x余数为0,返回TRUE,否则返回FALSE函数原型:intigcd(intx,inty);功能说明:返回两个整数的最大公约数函数原型:voidincr(bigx,intn,bigz);功能说明:将一个大数加上一个整数,z=x+nExample:incr(x,2,x);/*Thisincrementsxby2.*/函数原型:voidmirkill(bigx);功能说明:释放内存大数所占的内存函数原型:miracl*mirsys(intnd,intnb);功能说明:初始化MIRACL系统,该函数必须在调用MIRACL库函数之前先执行Example:miracl*mip=mirsys(500,10);//初始化500位的10进行制数函数原型:voidmirexit();功能说明:清除MIRACL系统,释放所有内部变量函数原型:voidmultiply(bigx,bigy,bigz);功能说明:两个大数相乘,z=x.y函数原型:voidnegify(bigx,bigy);功能说明:大数取负号,y=-x.函数原型:intnumdig(bigx);功能说明:返回大数x中数字的个数函数原型:voidpremult(bigx,intn,bigz);功能说明:一个大数乘以一个整数,z=n.x函数原型:intsubdiv(bigx,intn,bigz);功能说明:一个大数除以一个整数,z=x/n.返回值:余数函数原型:BOOLsubdivisible(bigx,intn)功能说明:测试n能否整除x返回值:x除以n余数为0,返回TRUE,否则返回FALSE函数原型:voidbigdig(intn,intb,bigx);功能说明:产生一个指定长度的进制的随机数,该函数使用内置的随机数发生器,初始化种子调用irand函数Example:bigdig(100,10,x);//产生一个100位的10进制随机数函数原型:voidbigrand(bigw,bigx);功能说明:使用内置的随机数发生器,产生一个小于w的大数随机数,xw函数原型:integcd(bigx,bigy,bigz);功能说明:计算两个大数的最大公约数,z=gcd(x,y)函数原型:voidexpb2(intn,bigx)功能说明:计算2的n次方的大数Example:expb2(1398269,x);//2^1398269decr(x,1,x);//x=x-1mip-IOBASE=10;//使用10进制cotnum(x,stdout);//输出到屏幕Thiscalculatesandprintsoutthelargestknownprimenumber(onatrue32-bitcomputerwithlotsofmemory!)函数原型:voidexpint(intb,intn,bigx);功能说明:计算b的n次方的大数函数原型:voidfft_mult(bigx,bigy,bigz);功能说明:使用FastFourier算法计算两个大数乘积,z=x.y函数原型:unsignedintinvers(unsignedintx,unsignedinty);功能说明:计算两个无符号整数(要求互素)的模逆,返回x-1mody函数原型:BOOLisprime(bigx);功能说明:判断一个大数是否为素数,使用概率测试算法返回值:x为素数返回TRUE,否则返回FALSE函数原型:voidpowmod(bigx,bigy,bigz,bigw);功能说明:模幂运算,w=xymodz函数原型:voidsftbit(bigx,intn,bigz);功能说明:将一个大数左移或右移n位,n为正数时左移,负数时右移函数原型:intxgcd(bigx,bigy,bigxd,bigyd,bigz);功能说明:计算两个大数的扩展最大公约数,也可以用来计算模逆,这个函数比mad函数运算速度稍慢。z=gcd(x,y)=x.xd+y.ydExample:xgcd(x,p,x,x,x);//计算x^-1modp/*x=1/xmodp(pisprime)*/三.MIRACL函数库调用举例1.使用微软的VS.NET2003中文版(1)启动MicrosoftVisualStudio.NET2003,选择“文件”→“新建”→“项目”命令,如图1-1所示;图1-1新建项目(2)打开“新建项目”对话框,选择“Win32控制台项目”模板,在“名称”文本框中输入“TestMircal”,如图1-2所示,单击“确定”按钮;图1-2选择模板(3)单击“完成”按钮,完成新建项目;(4)将大数运算静态库文件ms32.lib和头部文件miracl.h和mirdef.h拷贝到项目所在文件夹,本例中为“C:\Temp\TestMiracl”,如图1-3所示;图1-3拷贝大数运算库所需文件(5)将大数运算静态库文件ms32.lib文件添加到项目中,操作方法是:右击“TestMircal”,选择快捷菜单中的“添加”→“添加现有项”命令,如图1-4所示;图1-4打开添加现有项对话框(6)打开“添加现有项-TestMircal”对话框,选择文件类型为“所有文件(*.*)”,双击“ms32.lib”文件,将其添加到项目中,如图1-5所示;图1-5添加ms32.lib库文件(7)右击“TestMircal”,选择快捷菜单中的“添加”命令,打开“属性页”对话框,单击“C/C++”配置属性,选择“预编译头”选项,设置为“不使用编译头”,如图1-6所示,单击“确定”按钮;图1-6不使用预编译头(7)为项目添加如下头文件的包含,此处使用externC是表示用C的方式编译,因为ms32.lib是C的库,不是C++的库,如图1-7所示;externC{#includemiracl.h#includemirdef.h}(8)在_tmain函数中插入如下代码,以测试大数运算情况;miracl*mip=mirsys(400,10);//初始化一个400位10进制的大数系统bigx,y,z;x=mirvar(177);y=mirvar(79);z=mirvar(0);divide(x,y,z);//x=xmody,z=x/ycotnum(x,stdout);//x=19cotnum(y,stdout);//y=79cotnum(z,stdout);//z=2multiply(x,y,z);//z=x*ymip-IOBASE=16;//将原来的10进制改为16进制模式cotnum(z,stdout);//5DD/*测试13^-1mod2436=937x=mirvar(13);y=mirvar(2436);xgcd(x,y,z,z,z);std::coutz=;cotnum(z,stdout);*/mirkill(x);//释放大数变量mirkill(y);mirkill(z);//========================================================//下面进行RSA算法加密和解密运算charOutStr[500];charmStr[]=Computer;bigm=mirvar(0);//m明文bigc=mirvar(0);//c密文bigp=mirvar(0);//大素数pbigq=mirvar(0);//大素数qbign=mirvar(0);//n模数bigpn=mirvar(0);//欧拉函数值pn=(p-1)(q-1)bigd=mirvar(0);//d私钥bige=mirvar(0);//e公钥mip-IOBASE=10;//将原来的16进制改为10进制模式expb2(500,p);//计算2的500次方,2^1024~=1.8*10^308nxprime(p,p);//找一个比2的500次方大的素数std::coutp=;cotnum(p,stdout);//还是测试一下是否为素数if(isprime(p))std::coutpisaprime!\n;premult(p,2,q);//q=p*2nxprime(q,q);//找一个比p*2大的素数std::coutq=;cotnum(q,stdout);//还是测试一下是否为素数if(isprime(q))std::coutqisaprime!\n;multiply(p,q,n);//n=p*q//以下计算欧拉函数值pndecr(p,1,p);//p=p-1decr(q,1,q);//q=q-1multiply(p,q,pn);//pn=(p-1)(q-1)convert(65537,e);//取e公钥为2的16次方加1//cinstr(e,65537);//取e公钥为2的16次方加1xgcd(e,pn,d,d,d);//计算d=e^-1modpnstd::coutd=;cotnum(d,stdout);bytes_to_big(8,m

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功