MIRACL大数运算库使用手册分析Word文档格式.docx
- 文档编号:22299300
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:14
- 大小:108.83KB
MIRACL大数运算库使用手册分析Word文档格式.docx
《MIRACL大数运算库使用手册分析Word文档格式.docx》由会员分享,可在线阅读,更多相关《MIRACL大数运算库使用手册分析Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
返回值:
输入字符数的个数
mip->
IOBASE=16;
//inputlargehexnumberintobigx
cinstr(x,”AF12398065BFE4C96DB723A”);
intcompare(bigx,bigy);
比较两个大数的大小
x>
y时返回+1,x=y时返回0,x<
y时返回-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为商,余数不返回。
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
incr(x,2,x);
/*Thisincrementsxby2.*/
voidmirkill(bigx);
释放内存大数所占的内存
miracl*mirsys(intnd,intnb);
初始化MIRACL系统,该函数必须在调用MIRACL库函数之前先执行
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函数
bigdig(100,10,x);
//产生一个100位的10进制随机数
voidbigrand(bigw,bigx);
使用内置的随机数发生器,产生一个小于w的大数随机数,x<
w
integcd(bigx,bigy,bigz);
计算两个大数的最大公约数,z=gcd(x,y)
voidexpb2(intn,bigx)
计算2的n次方的大数
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
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"
{
#include"
miracl.h"
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
//将原来的10进制改为16进制模式
cotnum(z,stdout);
//5DD
/*测试13^-1mod2436=937
x=mirvar(13);
y=mirvar(2436);
xgcd(x,y,z,z,z);
std:
:
cout<
<
"
z="
*/
mirkill(x);
//释放大数变量
mirkill(y);
mirkill(z);
//========================================================
//下面进行RSA算法加密和解密运算
charOutStr[500];
charmStr[]="
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公钥
//将原来的16进制改为10进制模式
expb2(500,p);
//计算2的500次方,2^1024~=1.8*10^308
nxprime(p,p);
//找一个比2的500次方大的素数
p="
cotnum(p,stdout);
//还是测试一下是否为素数
if(isprime(p))std:
pisaprime!
\n"
premult(p,2,q);
//q=p*2
nxprime(q,q);
//找一个比p*2大的素数
q="
cotnum(q,stdout);
if(isprime(q))std:
qisaprime!
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"
);
xgcd(e,pn,d,d,d);
//计算d=e^-1modn
d="
cotnum(d,stdout);
bytes_to_big(8,mStr,m);
//将8个字符的明文,转换成大数
m="
cotnum(m,stdout);
//加密
powmod(m,e,n,c);
//计算c=m^emodn
c="
cotnum(c,stdout);
//解密
powmod(c,d,n,m);
//计算m=c^dmodn
big_to_bytes(256,m,OutStr,FALSE);
//将m转换成数组写入temp
OutStr[8]='
\0'
OutStr="
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 大数 运算 使用手册 分析