miracl大数运算库使用手册.docx
《miracl大数运算库使用手册.docx》由会员分享,可在线阅读,更多相关《miracl大数运算库使用手册.docx(12页珍藏版)》请在冰豆网上搜索。
![miracl大数运算库使用手册.docx](https://file1.bdocx.com/fileroot1/2022-10/18/d55c4e7c-b0f5-4434-bae6-8ff0f2cac557/d55c4e7c-b0f5-4434-bae6-8ff0f2cac5571.gif)
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);//输出到屏幕
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.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);
//===================