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]};

  • 相关阅读:
    mongodb安装错误以及原理
    animate.css使用
    JavaScript面向对象的方式开发轮播图插件
    数组/对象深拷贝
    JavaScript中数组的方法和字符串方法总结
    远程管理命令
    python+selenium 滑动滚动条的操作
    远程管理命令:
    文件和目录命令二:
    文件和目录命令一:
  • 原文地址:https://www.cnblogs.com/hwu2014/p/3622684.html
Copyright © 2011-2022 走看看