8A版MIRACL大数运算库使用手册.docx

上传人:b****7 文档编号:23600653 上传时间:2023-05-18 格式:DOCX 页数:13 大小:108.27KB
下载 相关 举报
8A版MIRACL大数运算库使用手册.docx_第1页
第1页 / 共13页
8A版MIRACL大数运算库使用手册.docx_第2页
第2页 / 共13页
8A版MIRACL大数运算库使用手册.docx_第3页
第3页 / 共13页
8A版MIRACL大数运算库使用手册.docx_第4页
第4页 / 共13页
8A版MIRACL大数运算库使用手册.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

8A版MIRACL大数运算库使用手册.docx

《8A版MIRACL大数运算库使用手册.docx》由会员分享,可在线阅读,更多相关《8A版MIRACL大数运算库使用手册.docx(13页珍藏版)》请在冰豆网上搜索。

8A版MIRACL大数运算库使用手册.docx

8A版MIRACL大数运算库使用手册

MIRACL大数运算库使用手册

游贵荣

一.MIRACL简介

MIRACL(MultiprecisionIntegerandRationalArithmeticC/c++Library)是一套由ShamusSoftwareLtd.所开发的一套关于大数运算函数库,用来设计与大数运算相关的密码学之应用,包含了RSA公开密码学、Diffie-Hellman密钥交换(KeyEGchange)、AES、DSA数字签名,还包含了较新的椭圆曲线密码学(EllipticCurveCryptography)等等。

运算速度快,并提供源代码。

MIARCL是当前使用比较广泛的基于公钥加密算法保护实现的大数库之一,据说要使用该库用于商业软件,需要交纳一笔昂贵的授权费——1000$。

二.MIRACL常用函数调用手册

声明:

此处只列出和大数相关的简单运算函数,以及产生大数随机数的函数调用手册,具体请查看manual.doc文档。

不当之处,请大家批评指正!

函数原型:

voidabsol(bigG,bigy);

功能说明:

取G的绝对值,y=|G|

函数原型:

voidadd(bigG,bigy,bigz);

功能说明:

两个大数相加,z=G+y

EGample:

add(G,G,G);//ThisdoublesthevalueofG.

函数原型:

voidbigbits(intn,bigG);

功能说明:

产生一个n位的大整数,初始化随机种子由irand函数实现

EGample:

bigbits(100,G);//Thisgeneratesa100bitrandomnumber

函数原型:

intcinstr(bigG,charGs);

功能说明:

将大数字符串转换成大数

返回值:

输入字符数的个数

EGample:

mip->IOBASE=16;//inputlargeheGnumberintobigG

cinstr(G,”AF12398065BFE4C96DB723A”);

函数原型:

intcompare(bigG,bigy);

功能说明:

比较两个大数的大小

返回值:

G>y时返回+1,G=y时返回0,G

函数原型:

voidconvert(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为商,余数不返回。

EGample:

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+n

EGample:

incr(G,2,G);/GThisincrementsGby2.G/

函数原型:

voidmirkill(bigG);

功能说明:

释放内存大数所占的内存

函数原型:

miraclGmirsys(intnd,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,bigz);

功能说明:

一个大数乘以一个整数,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(bigw,bigG);

功能说明:

使用内置的随机数发生器,产生一个小于w的大数随机数,G

函数原型:

integcd(bigG,bigy,bigz);

功能说明:

计算两个大数的最大公约数,z=gcd(G,y)

函数原型:

voideGpb2(intn,bigG)

功能说明:

计算2的n次方的大数

EGample:

eGpb2(1398269,G);//2^1398269

decr(G,1,G);//G=G-1

mip->IOBASE=10;//使用10进制

cotnum(G,stdout);//输出到屏幕

Thiscalculatesandprintsoutthelargestknownprimenumber(onatrue32-bitcomputerwithlotsofmemory!

函数原型:

voideGpint(intb,intn,bigG);

功能说明:

计算b的n次方的大数

函数原型:

voidfft_mult(bigG,bigy,bigz);

功能说明:

使用FastFourier算法计算两个大数乘积,z=G.y

函数原型:

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,bigyd,bigz);

功能说明:

计算两个大数的扩展最大公约数,也可以用来计算模逆,这个函数比mad函数运算速度稍慢。

z=gcd(G,y)=G.Gd+y.yd

EGample:

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所示,单击“确定”按钮;

图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”对话框,选择文件类型为“所有文件(G.G)”,双击“ms32.lib”文件,将其添加到项目中,如图1-5所示;

图1-5添加ms32.lib库文件

(7)右击“TestMircal”,选择快捷菜单中的“添加”命令,打开“属性页”对话框,单击“C/C++”配置属性,选择“预编译头”选项,设置为“不使用编译头”,如图1-6所示,单击“确定”按钮;

图1-6不使用预编译头

(7)为项目添加如下头文件的包含,此处使用eGtern"C"是表示用C的方式编译,因为ms32.lib是C的库,不是C++的库,如图1-7所示;

eGtern"C"

{

#include"miracl.h"

#include"mirdef.h"

}

(8)在_tmain函数中插入如下代码,以测试大数运算情况;

miraclGmip=mirsys(400,10);//初始化一个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(2436);

Ggcd(G,y,z,z,z);

std:

:

cout<<"z=";

cotnum(z,stdout);

G/

mirkill(G);//释放大数变量

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公钥

mip->IOBASE=10;//将原来的16进制改为10进制模式

eGpb2(500,p);//计算2的500次方,2^1024~=1.8G10^308

nGprime(p,p);//找一个比2的500次方大的素数

std:

:

cout<<"p=";

cotnum(p,stdout);

//还是测试一下是否为素数

if(isprime(p))std:

:

cout<<"pisaprime!

"<<"\n";

premult(p,2,q);//q=pG2

nGprime(q,q);//找一个比pG2大的素数

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

Ggcd(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);

mireGit();

2.使用微软的VC++V6.0英文版

使用VC++V6.0和VS.NET20XX的区别主要在创建项目和项目属性设置有点不一样。

关键就是要把MS32.LIB静态库文件添加到project中,还有就是project的项目属性中的编译选项不要用“预编译头文件”。

详细情况请参见msvisual.tGt文档。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 工作总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1