MIRACL


#一.MIRACL简介
MIRACL(Multiprecision Integer and RationalArithmetic C/c++ Library)是一套由Shamus Software Ltd.所开发的一套关于大数运算函数库,用来设计与大数运算相关的密码学之应用,包含了RSA 公开密码学、Diffie-Hellman密钥交换(Key Exchange)、AES、DSA数字签名,还包含了较新的椭圆曲线密码学(Elliptic CurveCryptography)等等。运算速度快,并提供源代码。

#二、配置

2.1 从GitHub上面down下来

git 链接:https://github.com/miracl/MIRACL.git

1
git clone https://github.com/miracl/MIRACL.git

image_1b4bfpauf1bv31ugi1sjf1dca152k9.png-23.4kB

2.2 按照指导,编译得到lib文件

编译我选用的是ms环境编译,然后从脚本中选择ms32doit.bat进行32位编译,得到下面的lib文件
image_1b4bminudkfi12b1d7d196j13169.png-1.3kB

##2.3 新建项目
①新建项目:Win32控制台项目
②将大数运算静态库文件ms32.lib和头部文件miracl.h和mirdef.h拷贝到项目所在文件夹
③对项目打开“属性页”对话框,单击“C/C++”配置属性,选择“预编译头”选项,设置为“不使用编译头”
④为项目添加如下头文件的包含,此处使用extern”C”是表示用C的方式编译,因为ms32.lib是C的库,不是C++的库,如图1-7所示;

1
2
3
4
5
extern "C"
{
#include"miracl.h"
#include"mirdef.h"
}

#三 常用函数
来自项目中manual.doc,原文为英文,做了简单翻译。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
函数原型: void absol(big x, big y);
功能说明: 取x的绝对值,y=|x|


函数原型: void add(big x, big y, big z);
功能说明: 两个大数相加,z=x+y
Example: 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 bitrandom number


函数原型: int cinstr(big x, char*s);
功能说明: 将大数字符串转换成大数
返回值: 输入字符数的个数
Example: mip->IOBASE=16; // input large hex number into big x
cinstr(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


函数原型: intigcd(int x, int y) ;
功能说明: 返回两个整数的最大公约数

函数原型: void incr(big x, int n, big z);
功能说明: 将一个大数加上一个整数, z=x+n
Example: 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(bigx, big y, big z);
功能说明:计算两个大数的最大公约数,z=gcd(x,y)


函数原型: void expb2(int n, big x)
功能说明: 计算2的n次方的大数
Example: expb2(1398269,x); //2^1398269
decr(x,1,x); //x = x - 1
mip->IOBASE=10; //使用10进制
cotnum(x,stdout); //输出到屏幕
This calculates and prints out the largest known primenumber (on a true 32-bit computer with lots of memory!)

函数原型: void expint(intb, 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(bigx);
功能说明:判断一个大数是否为素数,使用概率测试算法
返回值: x为素数返回TRUE,否则返回FALSE


函数原型: void powmod(big x, big y,big z, big w);
功能说明: 模幂运算,w=xy mod z


函数原型: void sftbit(big x, int n,big z);
功能说明:将一个大数左移或右移n位,n为正数时左移,负数时右移


函数原型: int xgcd(bigx, big y, big xd, big yd, big z);
功能说明: 计算两个大数的扩展最大公约数,也可以用来计算模逆,这个函数比mad 函数运算速度稍慢。z=gcd(x,y)=x.xd+y.yd
Example: xgcd(x,p,x,x,x); //计算x^-1 mod p
/* x = 1/x mod p (p is prime) */

#四、架构理解
①miracl.h:所有的宏定义,外部定义的函数接口的结构①体定义。
②mirdef.h:根据不同环境和编译环境给出的定义。
③big.h:大整数文件的定义。
④大数文件中所有的函数依赖于其他的文件(比如:mraes.cmralloc.cmrarth0.c等等)
⑤znn.h:定义了运算功能。
⑥总之,功能很强大,有很多拓展,可以在项目中doc文档中看到。