MIRACL大数运算库使用手册.docx
- 文档编号:3785108
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:13
- 大小:19.59KB
MIRACL大数运算库使用手册.docx
《MIRACL大数运算库使用手册.docx》由会员分享,可在线阅读,更多相关《MIRACL大数运算库使用手册.docx(13页珍藏版)》请在冰豆网上搜索。
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+y
Example:
add(x,x,x);//Thisdoublesthevalueofx.
函数原型:
voidbigbits(intn,bigx);
功能说明:
产生一个n位的大整数,初始化随机种子由irand函数实现
Example:
bigbits(100,x);//Thisgeneratesa100bitrandomnumber
函数原型:
intcinstr(bigx,char*s);
功能说明:
将大数字符串转换成大数
返回值:
输入字符数的个数
.
.
Example:
mip->IOBASE=16;//inputlargehexnumberintobigx
cinstr(x,”AF12398065BFE4C96DB723A”);
函数原型:
intcompare(bigx,bigy);
功能说明:
比较两个大数的大小
返回值:
x>y时返回+1,x=y时返回0,x 函数原型: 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+n Example: 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的大数随机数,x 函数原型: integcd(bigx,bigy,bigz); 功能说明: 计算两个大数的最大公约数,z=gcd(x,y) 函数原型: voidexpb2(intn,bigx) 功能说明: 计算2的n次方的大数 Example: expb2(1398269,x); //2^1398269 decr(x,1,x); //x=x-1 mip->IOBASE=10; //使用10进制 cotnum(x,stdout); //输出到屏幕 This calculates andprints outthelargestknownprimenumber(onatrue32-bit computerwithlotsofmemory! ) 函数原型: void expint(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); y 功能说明: 模幂运算,w=xmodz 函数原型: voidsftbit(bigx,intn,bigz); 功能说明: 将一个大数左移或右移n位,n为正数时左移,负数时右移 函数原型: intxgcd(bigx,bigy,bigxd,bigyd,bigz); 功能说明: 计算两个大数的扩展最大公约数,也可以用来计算模逆,这个函数比mad函数 运算速度稍慢。 z=gcd(x,y)=x.xd+y.yd Example: 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)为项目添加如下头文件的包含,此处使用extern"C"是表示用C的方式编译, 因为ms32.lib是C的库,不是C++的库,如图1-7所示; extern"C" { #include"miracl.h" #include"mirdef.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/y cotnum(x,stdout);//x=19 cotnum(y,stdout);//y=79 cotnum(z,stdout);//z=2 multiply(x,y,z);//z=x*y mip->IOBASE=16;//将原来的10进制改为16进制模式 cotnum(z,stdout);//5DD /*测试13^-1mod2436=937 x=mirvar(13); y=mirvar(2436); . . xgcd(x,y,z,z,z); std: : cout<<"z="; cotnum(z,stdout); */ mirkill(x);//释放大数变量 mirkill(y); mirkill(z); //======================================================== //下面进行RSA算法加密和解密运算 char OutStr[500]; char mStr[]="Computer"; bigm=mirvar(0); //m 明文 bigc=mirvar(0); //c 密文 bigp=mirvar(0); // 大素数p bigq=mirvar(0); // 大素数q bign=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^308 nxprime(p,p);//找一个比2的500次方大的素数 std: : cout<<"p="; cotnum(p,stdout); //还是测试一下是否为素数 if(isprime(p))std: : cout<<"pisaprime! "<<"\n"; . . premult(p,2,q);//q=p*2 nxprime(q,q);//找一个比p*2大的素数 std: : cout<<"q="; cotnum(q,stdout); //还是测试一下是否为素数 if(isprime(q))std: : cout<<"qisaprime! "<<"\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 xgcd(e,pn,d,d,d);//计算d=e^-1modn std: : cout<<"d="; cotnum(d,stdout); bytes_to_big(8,mStr,m);//将8个字符的明文,转换成大数 std: : cout<<"m="; cotnum(m,stdout); //加密 powmod(m,e,n,c);//计算c=m^emodn std: : cout<<"c="; cotnum(c,stdout); //解密 powmod(c,d,n,m);//计算m=c^dmodn std: : cout<<"m="; cotnum(m,stdout); big_to_bytes(256,m,OutStr,FALSE);//将m转换成数组写入temp OutStr[8]='\0'; std: : cout<<"OutStr="< . . mirkill(m);//释放大数变量 mirkill(c); mirkill(p); mirkill(q); mirkill(d); mirkill(e); mirkill(n); mirkill(pn); mirexit(); 2.使用微软的VC++V6.0英文版 使用VC++V6.0和VS.NET2003的区别主要在创建项目和项目属性设置有点不一样。 关 键就是要把MS32.LIB静态库文件添加到project中,还有就是project的项目属性中的 编译选项不要用“预编译头文件”。 详细情况请参见msvisual.txt文档。 .
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MIRACL 大数 运算 使用手册