MIRACL大数运算库使用手册
华北电力大学-网络信息安全综合实验报告

.综合实验报告( 2013 -- 2014 年度第 1 学期)名称:网络信息安全综合实验题目:RSA公钥加密解密院系:计算机系班级:网络工程学号:学生姓名:指导教师:李天设计周数: 1 周成绩:日期: 2013年1月18日一、综合实验的目的与要求要求:了解RSA产生公钥和私钥的方法,掌握RSA 的加密、解密过程,编写程序设计RSA 加解密工具。
RSA加解密参考:RSA的安全性依赖于大数分解,公钥和私钥都是两个大素数(大于100个十进制位)的函数。
据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。
密钥的产生:1. 选择两个保密的大素数p和q;2. 计算n=p*q和欧拉函数值E(n)=(p-1)(q-1);3. 选一整数e,且满足1<e<E(n)和gcd(E(n),e)=1;4. 计算d,且满足d*e=1 mod E(n);5. 公钥为{e, n},私钥{d, n}。
二、RSA算法的描述1.RSA 依赖大数运算,目前主流RSA 算法都建立在1024位的大数运算之上。
而大多数的编译器只能支持到64位的整数运算,即我们在运算中所使用的整数必须小于等于64位,即:0xffffffffffffffff,也就是18446744073709551615,这远远达不到RSA 的需要,于是需要专门建立大数运算库来解决这一问题。
最简单的办法是将大数当作数组进行处理,也就是将大数用0—9这十个数字组成的数组进行表示,然后模拟人们手工进行“竖式计算”的过程编写其加减乘除函数。
但是这样做效率很低,因为二进制为1024位的大数其十进制也有三百多位,对于任何一种运算,都需要在两个有数百个元素的数组空间上做多重循环,还需要许多额外的空间存放计算的进退位标志及中间结果。
另外,对于某些特殊的运算而言,采用二进制会使计算过程大大简化,这种大数表示方法转化成二进制显然非常麻烦,所以在某些实例中则干脆采用了二进制数组的方法来记录大数,这样效率就更低了。
MIRACL大数运算库使用手册

MIRACL大数运算库使用手册游贵荣一.MIRACL简介MIRACL(Multiprecision Integer and Rational Arithmetic C/c++ Library)是一套由Shamus Software Ltd.所开发的一套关于大数运算函数库,用来设计与大数运算相关的密码学之应用,包含了RSA 公开密码学、Diffie-Hellman密钥交换(Key Exchange)、AES、DSA数字签名,还包含了较新的椭圆曲线密码学(Elliptic Curve Cryptography)等等。
运算速度快,并提供源代码。
MIARCL是当前使用比较广泛的基于公钥加密算法保护实现的大数库之一,据说要使用该库用于商业软件,需要交纳一笔昂贵的授权费——1000$。
二.MIRACL常用函数调用手册声明:此处只列出和大数相关的简单运算函数,以及产生大数随机数的函数调用手册,具体请查看manual.doc文档。
不当之处,请大家批评指正!函数原型: void absol(big x, big y);功能说明: 取x的绝对值,y=|x|函数原型: void add(big x, big y, big z);功能说明: 两个大数相加,z=x+yExample: add(x,x,x); // This doubles the value of x.函数原型: void bigbits(int n, big x);功能说明: 产生一个n位的大整数,初始化随机种子由irand函数实现Example: bigbits(100,x); //This generates a 100 bit random number函数原型: int cinstr(big x, char *s);功能说明: 将大数字符串转换成大数返回值: 输入字符数的个数Example: mip->IOBASE=16; // input large hex number into big xcinstr(x,”AF12398065BFE4C96DB723A”);函数原型: int compare(big x, big y);功能说明: 比较两个大数的大小返回值: x>y时返回+1, x=y时返回0, x<y时返回-1函数原型: void convert(int n, big x);功能说明: 将一个整数n转换成一个大数x函数原型: void copy(big x, big y);功能说明: 将一个大数赋值给另一个大数,y=x函数原型: int cotstr(big x, char *s);功能说明: 将一个大数根据其进制转换成一个字符串返回值: 字符串长度函数原型: void decr(big x, int n, big z) ;功能说明: 将一个大数减去一个整数, z=x-n.函数原型: void divide(big x, big y, big z);功能说明: 两个大数相除,z=x/y; x=x mod y,当变量y和z相同时,x为余数,商不返回(即y的值不变);当x和z相同时,x为商,余数不返回。
北太天元数值计算通用软件用户手册说明书

Numerical Computation SoftwareSTA版权声明 © 2022 北京大学重庆大数据研究院 保留一切权利任何单位或个人未经北京大学重庆大数据研究院书面许可,不得擅自摘抄、复制本文件中的内容,不得以盈利为目的开展任何形式的传播。
商标声明本文件展示、提及或使用的所有商标归北京大学重庆大数据研究院所有。
本文件内容不视为以明示、暗示、默许或者其他形式授予任何单位或个人商标使用权。
未经北京大学重庆大数据研究院书面许可,任何单位或个人不得以任何形式使用北京大学重庆大数据研究院的商标或标记。
安全港声明您购买的产品、服务或功能等受您与北京大学重庆大数据研究院所签订的商业合同约束,本文件所描述的产品、服务或功能可能不在您购买或使用范围之内。
由于产品版本升级或其他原因,本文件内容会不定期进行更新,对此不会另行通知。
除非另有约定,本文件仅作指导、参考作用,所有陈述不构成对合同相对方的任何担保、承诺,不视为合同的组成部分或者附件,北京大学重庆大数据研究院对此保留最终解释权。
科学是全人类至今所追求的永恒目标,全球科学家的合作与交流是促进科学研究发展的基本要素。
为达成科学家们广泛而持续的合作交流,建设科学研究资源共享库、定义标准化工具是必不可少的工作模式。
计算和模拟是当今科学研究的基本手段,科学计算和数值模拟软件则是进行科学研究的基本工具。
在北京大学、北京大学数学科学学院、北京大学大数据分析与应用技术国家工程实验室、北京大学重庆大数据研究院的共同支持下,北京大学重庆大数据研究院基础软件科学研究中心-数值计算实验室致力于国产通用型科学计算软件的研发与发展,通过设计软件架构到研究突破关键核心技术,完全独立自主研发,现已完成北太天元数值计算通用软件v2.0。
北太天元数值计算通用软件的设计初衷是希望所有科研工作者开发的脚本程序在不受外界干扰的情况下能够继续使用。
通过不断完善使得其脚本语法可以全部兼容,并在此基础上继续原有的科研项目,使得最终用户,在不需要学习额外的软件使用知识的情况下,依然可以开始新的科研课题。
IQmath基本使用方法

IQmath基本使用方法一.配置CMDPRAMH0:origin=0某100000,length=0某008000BOOT_ROM:origin=0某3ff000,length=0某000fc0二.载入gel文件,加入IQmath库和头文件三.定义全局Q格式,和调试Q格式#defineGLOBAL_Q20//全局为Q20格式,默认为Q24格式longGlobalQ=GLOBAL//调试用为Q20格式(这样可以使用_IQ(某)在监视器中查看)//-----------------------------QN16bitQ格式IQN32bitQ格式N表示Q多少int16bitlong32bit_iq=_iqN=longF浮点数输入S浮点字符串P正数最大值N负数最大值格式转化函数一般情况下IQ都有IQN版本的函数float_IQtoF(A)//_iq浮点转成正常浮点float_IQNtoF(A)int_IQtoQN(A)//iq和q(16bit)的转化long_IQint(A)//提取iq的整数部分_IQ(floatF)//浮点转化成iq_IQN(floatF)_atoIQ(char某)//字符串转化成iq_IQfrac(A)//提取iq的小数部分_IQtoIQN(A)//全局iq和普通iq的转化_IQNtoIQ(A)_QNtoIQ(intA)算术函数long_IQmpyI32int(A,B)//N某longIQ乘long返回整数部分long_IQmpyI32frac(A,B)//N某longIQ乘long返回小数部分_IQmpy(A,B)//N某N乘法_IQrmpy(A,B)//N某N四舍五入的乘法最后保存结果前(四舍五入)_IQrmpy(A,B)//N某N四舍五入的饱和处理乘法(如果Q26[-32,+32],如果相乘结果超过也会限制到这个范围)_IQmpyI32(A,B)//N某longIQ乘long_IQmpyIQ某(A,A1,B,B1)//N1某N2两个不同的Q格式乘法,返回全局Q格式_IQdiv(A,B)//N/Niq除法三角函数_IQin(A)_IQinPU(A)//正弦函数(标幺值),你占这个圆周的几分之几为单位如果in((0.25某PI)/(2某PI))_IQco(A)_IQcoPU(A)_IQatan2(A,B)//第四象限反正切tan-1(in,co)_IQatan2PU(A,B)//第四象限反正切tan-1(in,co)_IQatan(A,B)//定点反正切tan-1(1),,1=in/co_IQNin(A)_IQNinPU(A)//正弦函数(标幺值),你占这个圆周的几分之几为单位如果in((0.25某PI)/(2某PI))_IQNco(A)_IQNcoPU(A)_IQNatan2(_iqA,B)//第四象限反正切tan-1(in,co)_IQNatan2PU(_iqA,B)//第四象限反正切tan-1(in,co)_IQNatan(A,B)//定点反正切tan-1(1),,1=in/co数学函数_IQNqrt(A)//平方根a^0.5_IQNiqrt(A)//平方根倒数1/a^0.5_IQNmag(A,B)//求模运算(qrt(A^2+B^2)_IQqrt(A)//平方根a^0.5_IQiqrt(A)//平方根倒数1/a^0.5_IQmag(A,B)//求模运算(qrt(A^2+B^2)其它函数_IQat(A,longP,longN)//IQ数值的限幅函数把A限制到[NP]之间_IQNab(A)//IQ数据的绝对值|A|_IQab(A)//IQ数据的绝对值|A|(为提高计算精度,变量定义成IQ前,范围提前要搞清楚,切忌)在F2812的ROM中,有3K某16位被保留用于存放数学公式表以及未来的开发。
miracl用户手册(译) (1)

MIRACL用户手册译:叶道全yedaoq@摘要Miracl库包含100余个例程,涉及多倍精度运算(multiprecision arithmetic)的各个方面。
定义了两种新的数据类型——表示大整数的big类型和表示有理数的flash(short for floating-slash)类型。
大整数例程基于Knuth算法(在他的著作“The Art of Computer Programming”第四章中提出)。
floating-slash(不固定斜杠?)算法基于圆整小数,最初由D.Matula和P.Kornerup提出。
所有例程都针对速度和效率进行了全面的优化,同时也是标准的,可移植的C程序。
另外,对于某些时间要求非常严格的算法,Miracl也针对流行的Intel 80x86系列处理器提供了汇编语言实现。
Miracl还提供了C++接口。
Miracl的所有源代码都包含于此。
第二章安装通过Microsft C/C++、Borlands Turbo C/C++、Watcom C以及DJGPP GNU编译器,MIRACL库已经成功安装到VAX11/780,各种UNIX工作站(Sun,SPARC、Next以及IBM RS/6000),IBM PC等机器上。
还有ARM机器和Apple Macintosh。
最近MIRACL也已经在Itanium和AMD 64位处理器上运行过了。
MIRACL分发包中包含了库中所有模块的完整源代码以及各自的示例程序。
大部分是用标准的ANSI C编写的,可用任意规范的ANSI C编译器进行编译。
一些模块包含大量的内联汇编代码,用于优化在某些特定编译器/处理器组合上的性能。
通过条件编译,它们可以透明地调用,并且不会影响到其它编译器。
批处理文件xxdoit.xxx 包含在多种编译器上生成库文件和示例程序的命令。
请打开并检查与你的配置相关的文件。
分发包包含了部分流行的编译器的预编译库文件:ready-to-run版本,它们可立即使用,为了节省空间,其中并没有包含所有的示例程序。
IQmath基本使用方法

IQmath基本使用方法IQmath基本使用方法(2812为例子)一. 配置CMDPRAMH0 : origin = 0__, length = 0x008000BOOT_ROM : origin = 0x3ff000, length = 0x000fc0IQmath : PRAMH0, PAGE = 0二. 载入gel文件,加入IQmath库和头文件IQmath.gelIQmath.libIQmathLib.h三.定义全局Q格式,和调试Q格式#define GLOBAL_Q 20 //全局为Q20格式,默认为Q24格式long GlobalQ = GLOBAL //调试用为Q20格式(这样可以使用_IQ(x)在监视器中查看)//-----------------------------IQmath中常用的变量和字符QN 16bitQ格式IQN 32bitQ格式N表示Q多少int 16bitlong 32bit_iq = _iqN = longF 浮点数输入S 浮点字符串P 正数最大值N 负数最大值格式转化函数一般情况下IQ都有IQN版本的函数float _IQtoF(A) //_iq浮点转成正常浮点float _IQNtoF(A)int _IQtoQN(A) //iq和q(16bit)的转化long _IQint(A) //提取iq的整数部分_IQ(float F) //浮点转化成iq_IQN(float F)_atoIQ(char *s) //字符串转化成iq_IQfrac(A) //提取iq的小数部分_IQtoIQN(A) //全局iq和普通iq的转化_IQNtoIQ(A)_QNtoIQ(int A)算术函数long _IQmpyI32int(A, B) //N*long IQ乘long 返回整数部分long _IQmpyI32frac(A, B)//N*long IQ乘long 返回小数部分_IQmpy(A, B) //N*N乘法_IQrmpy(A, B) //N*N四舍五入的乘法最后保存结果前(四舍五入)_IQrsmpy(A, B) //N*N四舍五入的饱和处理乘法(如果Q26[-32,+32],如果相乘结果超过也会限制到这个范围)_IQmpyI32(A, B) //N*long IQ乘long_IQmpyIQX(A, A1, B, B1) //N1*N2两个不同的Q格式乘法,返回全局Q格式_IQdiv(A, B) // N/N iq除法三角函数_IQsin(A)_IQsinPU(A) //正弦函数(标幺值),你占这个圆周的几分之几为单位如果sin((0.25*PI)/(2*PI))_IQcos(A)_IQcosPU(A)_IQatan2(A, B) //第四象限反正切tan-1(sin, cos)_IQatan2PU(A, B) //第四象限反正切tan-1(sin, cos)_IQatan(A, B) //定点反正切tan-1(1),,1=sin/cos_IQNsin(A)_IQNsinPU(A) //正弦函数(标幺值),你占这个圆周的几分之几为单位如果sin((0.25*PI)/(2*PI))_IQNcos(A)_IQNcosPU(A)_IQNatan2(_iqA, B) //第四象限反正切tan-1(sin, cos)_IQNatan2PU(_iqA, B) //第四象限反正切tan-1(sin, cos)_IQNatan(A, B) //定点反正切tan-1(1),,1=sin/cos数学函数_IQNsqrt(A) //平方根a^0.5_IQNisqrt(A) //平方根倒数1/a^0.5_IQNmag(A, B) //求模运算(sqrt(A^2 + B^2)_IQsqrt(A) //平方根a^0.5_IQisqrt(A) //平方根倒数1/a^0.5_IQmag(A, B) //求模运算(sqrt(A^2 + B^2)其它函数_IQsat(A, long P, long N)//IQ数值的限幅函数把A限制到[N P]之间_IQNabs(A) //IQ数据的绝对值|A|_IQabs(A) //IQ数据的绝对值|A|(为提高计算精度,变量定义成IQ前,范围提前要搞清楚,切忌)在F2812的ROM中,有3K×16位被保留用于存放数学公式表以及未来的开发。
MIRACL大数运算库使用手册

MIRACL大数运算库使用手册游贵荣一.MIRACL简介MIRACL(Multiprecision Integer and Rational Arithmetic C/c++ Library)是一套由Shamus Software Ltd.所开发的一套关于大数运算函数库,用来设计与大数运算相关的密码学之应用,包含了RSA 公开密码学、Diffie-Hellman密钥交换(Key Exchange)、AES、DSA数字签名,还包含了较新的椭圆曲线密码学(Elliptic Curve Cryptography)等等。
运算速度快,并提供源代码。
MIARCL是当前使用比较广泛的基于公钥加密算法保护实现的大数库之一,据说要使用该库用于商业软件,需要交纳一笔昂贵的授权费——1000$。
二.MIRACL常用函数调用手册声明:此处只列出和大数相关的简单运算函数,以及产生大数随机数的函数调用手册,具体请查看manual.doc文档。
不当之处,请大家批评指正!函数原型: void absol(big x, big y);功能说明: 取x的绝对值,y=|x|函数原型: void add(big x, big y, big z);功能说明: 两个大数相加,z=x+yExample: add(x,x,x); // This doubles the value of x.函数原型: void bigbits(int n, big x);功能说明: 产生一个n位的大整数,初始化随机种子由irand函数实现Example: bigbits(100,x); //This generates a 100 bit random number函数原型: int cinstr(big x, char *s);功能说明: 将大数字符串转换成大数返回值: 输入字符数的个数Example: mip->IOBASE=16; // input large hex number into big xcinstr(x,”AF12398065BFE4C96DB723A”);函数原型: int compare(big x, big y);功能说明: 比较两个大数的大小返回值: x>y时返回+1, x=y时返回0, x<y时返回-1函数原型: void convert(int n, big x);功能说明: 将一个整数n转换成一个大数x函数原型: void copy(big x, big y);功能说明: 将一个大数赋值给另一个大数,y=x函数原型: int cotstr(big x, char *s);功能说明: 将一个大数根据其进制转换成一个字符串返回值: 字符串长度函数原型: void decr(big x, int n, big z) ;功能说明: 将一个大数减去一个整数, z=x-n.函数原型: void divide(big x, big y, big z);功能说明: 两个大数相除,z=x/y; x=x mod y,当变量y和z相同时,x为余数,商不返回(即y的值不变);当x和z相同时,x为商,余数不返回。
PAML操作

PAML软件的一些简单的具体的使用操作1. 首先用Clustal X进行序列比对:要保证:保证核苷酸序列是三的倍数,没有终止密码子,核苷酸序列的第一位是密码子的第一位。
假设序列名为cox1.fas2. 使用DAMBE软件进行转换成PML格式。
打开要换换的文件,然后“file” “save and convert sequence format”,在保存类型中选择“Yang’s PAML”。
那么此时的序列名为“cox1.PML”,这样就可以得到文件“*.PML”,然后就直接把后缀改成“*.nuc”。
那么此时的序列名为“cox1.nuc” 这样就完成了文件格式的转换。
3. 打开PAML软件的文件夹,找到文件名是“bin”的文件夹,打开之后,找到程序“codeml.exe”,把该程序复制到D盘的根目录下。
(这一步并不是必要的,只是要把用到的几个程序放在同一个目录下)4. 在你使用ClustalX进行序列比对的时候,会生成一棵进化树,适用treeview软件可以打开,你需要的是把文件的后缀名改称“*.trees”。
即树的文件名是“cox1.trees”,这就完成了树的格式的转换。
5. 然后再PAML4的文件夹中找到一个后缀是“*.ctl”的文件,把文件名改成“cox1.ctl”,复制到和“codeml.exe”相同的地方。
6. 要对codeml.ctl文件中的各个选项的值进行修改,具体内容如下:seqfile = cox1.nuc 按你自己的文件名进行修改,就可以了, treefile = cox1.treesoutfile = mlc * main result file name ,noisy = 9 * 0,1,2,3,9: how much rubbish on the screen , verbose = 0 * 0: concise; 1: detailed, 2: too muchrunmode = 0seqtype = 1 * 1:codons; 2:AAs; 3:codons-->AAsCodonFreq = 2 * 0:1/61 each, 1:F1X4, 2:F3X4, 3:codon table clock = 0aaDist = 0 * 0:equal, +:geometric; -:linear,1-6:G1974,Miyata,c,p,v,aaaRatefile = wag.dat * only used for aa seqs withmodel=empirical(_F) *dayhoff.dat,jones.dat,wag.da t,am.dat, or your ownmodel = 0,这是使用的最简单的模型, * models for codons: * 0:one, 1:b, 2:2 or more dN/dS ratios for branches * models for AAs or codon-translated AAs:* 0:poisson, 1:proportional, 2:Empirical, 3:Empirical+F 28 * 6:FromCodon, 7:AAClasses,8:REVaa_0,9:REVaa(nr=189)NSsites = 0 3 1 2 7 8 ,依次选取了6个模型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MIRACL大数运算库使用手册游贵荣一.MIRACL简介MIRACL(Multiprecision Integer and Rational Arithmetic C/c++ Library)是一套由Shamus Software Ltd.所开发的一套关于大数运算函数库,用来设计与大数运算相关的密码学之应用,包含了RSA 公开密码学、Diffie-Hellman密钥交换(Key Exchange)、AES、DSA数字签名,还包含了较新的椭圆曲线密码学(Elliptic Curve Cryptography)等等。
运算速度快,并提供源代码。
MIARCL是当前使用比较广泛的基于公钥加密算法保护实现的大数库之一,据说要使用该库用于商业软件,需要交纳一笔昂贵的授权费——1000$。
二.MIRACL常用函数调用手册声明:此处只列出和大数相关的简单运算函数,以及产生大数随机数的函数调用手册,具体请查看manual.doc文档。
不当之处,请大家批评指正!函数原型: void absol(big x, big y);功能说明: 取x的绝对值,y=|x|函数原型: void add(big x, big y, big z);功能说明: 两个大数相加,z=x+yExample: add(x,x,x); // This doubles the value of x.函数原型: void bigbits(int n, big x);功能说明: 产生一个n位的大整数,初始化随机种子由irand函数实现Example: bigbits(100,x); //This generates a 100 bit random number函数原型: int cinstr(big x, char *s);功能说明: 将大数字符串转换成大数返回值: 输入字符数的个数Example: mip->IOBASE=16; // input large hex number into big xcinstr(x,”AF12398065BFE4C96DB723A”);函数原型: int compare(big x, big y);功能说明: 比较两个大数的大小返回值: x>y时返回+1, x=y时返回0, x<y时返回-1函数原型: void convert(int n, big x);功能说明: 将一个整数n转换成一个大数x函数原型: void copy(big x, big y);功能说明: 将一个大数赋值给另一个大数,y=x函数原型: int cotstr(big x, char *s);功能说明: 将一个大数根据其进制转换成一个字符串返回值: 字符串长度函数原型: void decr(big x, int n, big z) ;功能说明: 将一个大数减去一个整数, z=x-n.函数原型: void divide(big x, big y, big z);功能说明: 两个大数相除,z=x/y; x=x mod y,当变量y和z相同时,x为余数,商不返回(即y的值不变);当x和z相同时,x为商,余数不返回。
Example: divide(x,y,y);//x为余数,y值不变函数原型: BOOL divisible(big x, big y)功能说明: 测试x能否整除y返回值: y除x余数为0,返回TRUE,否则返回FALSE函数原型: int igcd(int x, int y) ;功能说明: 返回两个整数的最大公约数函数原型: void incr(big x, int n, big z);功能说明: 将一个大数加上一个整数, z=x+nExample: incr(x,2,x); /* This increments x by 2. */函数原型: void mirkill(big x);功能说明:释放内存大数所占的内存函数原型: miracl *mirsys(int nd, int nb);功能说明: 初始化MIRACL系统,该函数必须在调用MIRACL库函数之前先执行Example: miracl *mip=mirsys(500,10);//初始化500位的10进行制数函数原型: void mirexit();功能说明: 清除MIRACL系统,释放所有内部变量函数原型: void multiply(big x, big y, big z);功能说明: 两个大数相乘,z=x.y函数原型: void negify(big x, big y);功能说明: 大数取负号,y=-x.函数原型: int numdig(big x);功能说明: 返回大数x中数字的个数函数原型: void premult(big x, int n, big z);功能说明: 一个大数乘以一个整数,z=n.x函数原型: int subdiv(big x, int n, big z);功能说明: 一个大数除以一个整数,z=x/n.返回值: 余数函数原型: BOOL subdivisible(big x, int n)功能说明: 测试n能否整除x返回值: x除以n余数为0,返回TRUE,否则返回FALSE函数原型: void bigdig(int n, int b, big x);功能说明: 产生一个指定长度的进制的随机数,该函数使用内置的随机数发生器,初始化种子调用irand函数Example: bigdig(100,10,x); //产生一个100位的10进制随机数函数原型: void bigrand(big w, big x);功能说明: 使用内置的随机数发生器,产生一个小于w的大数随机数,x<w函数原型: int egcd(big x, big y, big z);功能说明:计算两个大数的最大公约数,z=gcd(x,y)函数原型: void expb2(int n, big x)功能说明: 计算2的n次方的大数Example: expb2(1398269,x); //2^1398269decr(x,1,x); //x = x - 1mip->IOBASE=10; //使用10进制cotnum(x,stdout); //输出到屏幕This calculates and prints out the largest known prime number (on a true 32-bit computer with lots of memory!)函数原型: void expint(int b, int n, big x);功能说明: 计算b的n次方的大数函数原型: void fft_mult(big x, big y, big z);功能说明: 使用Fast Fourier算法计算两个大数乘积,z=x.y函数原型: unsigned int invers(unsigned int x, unsigned int y);功能说明:计算两个无符号整数(要求互素)的模逆,返回x-1 mod y函数原型: BOOL isprime(big x);功能说明:判断一个大数是否为素数,使用概率测试算法返回值: x为素数返回TRUE,否则返回FALSE函数原型: void powmod(big x, big y, big z, big w);功能说明: 模幂运算,w=x y mod z函数原型: void sftbit(big x, int n, big z);功能说明:将一个大数左移或右移n位,n为正数时左移,负数时右移函数原型: int xgcd(big x, big y, big xd, big yd, big z);功能说明: 计算两个大数的扩展最大公约数,也可以用来计算模逆,这个函数比mad函数运算速度稍慢。
z=gcd(x,y)=x.xd+y.ydExample: xgcd(x,p,x,x,x); //计算x^-1 mod p/* x = 1/x mod p (p is prime) */三.MIRACL函数库调用举例1.使用微软的 2003中文版(1)启动Microsoft Visual Studio .NET 2003,选择“文件”→“新建”→“项目”命令,如图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进制的大数系统big x,y,z;x = mirvar(177);y = mirvar(79);z = mirvar(0);divide(x, y, z); //x=x mod y, 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^-1 mod 2436 = 937x = 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";big m=mirvar(0); //m 明文big c=mirvar(0); //c 密文big p=mirvar(0); //大素数pbig q=mirvar(0); //大素数qbig n=mirvar(0); //n 模数big pn=mirvar(0); //欧拉函数值pn = (p - 1)(q - 1)big d=mirvar(0); //d 私钥big e=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<<"p is a prime!"<<"\n";premult(p, 2, q); //q=p*2nxprime(q, q); //找一个比p*2大的素数std::cout<<"q=";cotnum(q, stdout);//还是测试一下是否为素数if ( isprime(q) ) std::cout<<"q is a prime!"<<"\n";multiply(p, q, n); //n = (p - 1)(q - 1)//以下计算欧拉函数值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^-1 mod nstd::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^e mod nstd::cout<<"c=";cotnum(c, stdout);//解密powmod(c,d,n,m); //计算m=c^d mod nstd::cout<<"m=";cotnum(m, stdout);big_to_bytes(256,m,OutStr,FALSE); //将m转换成数组写入temp OutStr[8] = '\0';std::cout<<"OutStr="<<OutStr<<"\n";mirkill(m); //释放大数变量mirkill(c);mirkill(p);mirkill(q);mirkill(d);mirkill(e);mirkill(n);mirkill(pn);mirexit();2.使用微软的VC++V6.0英文版使用VC++V6.0和2003的区别主要在创建项目和项目属性设置有点不一样。