zoukankan      html  css  js  c++  java
  • Miracl库学习

    一.MIRACL简介

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

    二.MIRACL函数库调用举例

      所需文件:数运算静态库文件ms32.lib和头部文件miracl.h和mirdef.h。

      为项目添加如下头文件的包含,此处使用extern "C"是表示用C的方式编译,因为ms32.lib是C的库,不是C++的库。

      extern "C"

      {

          #include "miracl.h"

          #include "mirdef.h"

      }

      在_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/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^-1 mod 2436 = 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);

     

    三.MIRACL常用函数调用手册

    声明:此处只列出和大数相关的简单运算函数,以及产生大数随机数的函数调用手册,具体请查看manual.doc文档。不当之处,请大家批评指正!

    函数原型: 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 bit random 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

    函数原型: int igcd(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(big x, 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 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=xy 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.yd

    Example:    xgcd(x,p,x,x,x);  //计算x^-1 mod p

    /* x = 1/x mod p  (p is prime) */

    四.遇到的问题

      无法打开文件“libc.lib”: 如果将用低版本的VC开发的项目,拿到高版本的VC开发环境上去编译,链接时也许会触发LNK1104错误。解决方案是链接时忽略此库,项目->属性中->配置属性->链接器->输入->在忽略特定库中写入打不开的文件的名称libc.lib

      无法解析的外部符号 __iob :

    #ifdef __cplusplus
    extern "C"
    #endif
    FILE _iob[3] = {__iob_func()[0], __iob_func()[1], __iob_func()[2]};

  • 相关阅读:
    状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely
    简单几何(推公式) UVA 11646 Athletics Track
    简单几何(四边形形状) UVA 11800 Determine the Shape
    简单几何(求交点) UVA 11437 Triangle Fun
    计算几何模板
    简单几何(相对运动距离最值) UVA 11796 Dog Distance
    简单几何(求划分区域) LA 3263 That Nice Euler Circuit
    覆盖的面积 HDU
    Desert King 最小比率生成树 (好题)
    约会安排 (区间合并)毒瘤题
  • 原文地址:https://www.cnblogs.com/hwu2014/p/3622684.html
Copyright © 2011-2022 走看看