Windows 下PBC库的安装和配置

背景

PBC库是一个基于双线性对的密码学库,这库在公钥密码学中使用非常广泛。

这个库在Linux下的安装非常的简单,有些只会纸上谈兵的人需要在WIN下做,呵呵。

但是没办法,需求到了,硬着头皮也要写完,对于一些只会谈兵的人,呵呵。

现在主要介绍下参考的一个文章:

最全的一个win下配置pbc文档

PS:本文主要是集合各个博客的优点总结一下。

其实在这文章中,已经把细节交代清楚了,但是我为什么还要写这个博客?原因有以下的几个:

       1.防止自己忘记。

       2.对于PBC库的原理我想好好说明下,对于新手来这还是不容易的。

首先,使用PBC库在Win下编程的思路如下:

      1.将PBC GMP 这两个库的源码借用MINGW来编译成静态的库文件。

      2.编程时,将编译好的lib库文件引入你的工程中即可。

如下的关键问题要解决:

     1.下载获取GMP和PBC的源码

     2.安装MINGW

     3.在Windows下使用MINGW把他们编译成静态库文件

     4.正确配置VS环境

     5.可能遇到的问题以及解决方法

下面详细说下细节,上文链接里边也有,我做个备份并加上自己安装时的一些体会。

1.下载获取GMP和PBC的源码

PBC库:http://crypto.stanford.edu/pbc/ 

自己编译选择PBC library source code。

GMP:https://gmplib.org/

PBC库是依赖GMP库的,所以必须先搞GMP再搞PBC库。

好了,将这两个库解压好,我们进入下一步。

2.安装MinGW:

同样这里引用博客如下:WinGW编译GMP和PBC

MinGW源码位置:https://sourceforge.net/projects/mingw/files/

这个软件非常好安装,我们直接按照正常安装就好,这是在Win下模拟Linux下编译GMP和PBC的平台。

基本上按照如下的几个内容全部安装就好,就是Basic Setup 里边的这几个部分一定要安装好

接着就是使用它来编译我们的GMP和PBC库了,配置WinGW的路径如下:

3.在Windows下使用MINGW把他们编译成静态库文件

进入gmp目录后输入:

./configure CPPFLAGS="-D__USE_MINGW_ANSI_STDIO=0"--enable-static --disable-shared

make

make install

其中,CPPFLAGS="-D__USE_MINGW_ANSI_STDIO=0"在此后编译PBC静态库时才需要,若只编译PBC动态库,则不需要此步,--enable-static --disable-shared可根据编译的是静态库还是动态库作相应的改变。

在这里我们编译GMP静态库,编译成功后,取出libgmp.a和gmp.h两个文件,我是在D盘下新建了两个文件夹,在d:/lib文件夹下放libgmp.a,在d:/include文件夹下放gmp.h。

3.    在http://crypto.stanford.edu/pbc/ 上下载PBC库的源代码,在msys中,输入: 

./configureLDFLAGS="-Ld:/lib -lgmp"CPPFLAGS="-Id:/include" --enable-static --disable-shared

make 

make install

这里我们编译的是静态库,得到libpbc.a(若需要编译动态库,可将./configure那步后面改为--disable-static --enable-shared,则可得到libpbc-1.dll)

4. 得到libpbc.a(在编译源码目录下)、libgmp.a(在编译源码目录下)、libgcc.a(在MinGW安装文件夹下)、libmingwex.a (在MinGW安装文件夹下)四个文件。

5.这里得到的这四个文件就是我们需要的了。

4.正确配置VS环境

这里有一个不错的配置方法一:VS配置方法一

方法一是一种比较正常的配置方法,如下所示:

现在将配置的过程以图的形式展示一遍。

打开VS2010,鼠标放在你自己的项目上,右击,选择>属性,之后就出来上面的截图页面了,我已经标好了顺序,在红色标号4 这里注意,附加包含目录就是把PBC文件的include目录下所有的.h文件附加进去,还要再把gmp.h文件附加进去,其中gmp.h我已经放在了网盘的include.rar文件中,可以直接解压之后把整个include目录附加。接下来在上面的页面中配置链接器:

 

 

同理注意第3步,这一步把用MinGW编译生成的libpbc.a、libgmp.a、libgcc.a、libmingwex.a文件附加,这四个.a文件我已经放到网盘中了,可以自行下载之后按照步骤附加。

最后是命令行参数配置:

命令行参数配置是为了运行时,使程序找到自己运行时需要的参数,这里我选择了PBC\param下面的a.param参数来作为运行参数,此处就直接填写了a.param,大家可以用根据自己的需要自行选择此文件夹下的参数。这个a.param要事先放到自己的项目下面,为了防止运行时找不到参数,我将这个a.param在项目文件夹和项目的Debug文件夹下都放了一个。

这些都选择好之后。点击“应用”、“确定”。我们就可以进行VS2010中的PBC库开发了。

在用VS2010运行程序时,先生成解决方案,然后在选择开始调试不执行,这样是为了避免VS中运行控制台程序时出现控制台一闪而过的情况。

这里有一个不错的配置方法二:VS配置方法二

拷贝到VS2010工程下,并使用#pragma comment(lib,"xxx.lib")加载,当然也可设置工程属性加载。在包含头文件后(pbc相关、gmp.h)编译链接工程。

5.可能遇到的问题以及解决方法

1.关于安全类型检查的错误,VS 2010 后都有一种参数类型的强制检查,我们关闭它,如下所示:

包括警告等级,SDL检查,警告视为错误都进行修改即可。

3.如下错误

  • configure: error: No usable M4 in $PATH or /usr5bin

解决方法:在mingw中下载m4包

  • flex not found

解决方法:下载flex-2.54.1.exe安装,下载链接 然后在安装目录中找到flex.exe,将flex.exe拷贝到C:\MinGW\msys\1.0\bin文件夹中。

  • studio 调试时提示attribute错误(其中这个错误我遇到了,其他的没有遇到,我说说这个)
  • 解决方法:解决方法  这个原因主要是GCC下的一些写法和WIN下的写法不同导致的,所以只需要替换两个文件的部分内容即可,具体内容如下:pbc_utils.h 中替换如下内容:

 From

/*@manual log
Reports error message and exits with code 128.
*/
void pbc_die(const char *err, ...)
    __attribute__((__noreturn__))
    __attribute__((format (printf, 1, 2)));

/*@manual log
Reports informational message.
*/
void pbc_info(const char *err, ...)
    __attribute__((format (printf, 1, 2)));

/*@manual log
Reports warning message.
*/
void pbc_warn(const char *err, ...)
    __attribute__((format (printf, 1, 2)));

/*@manual log
Reports error message.
*/
void pbc_error(const char *err, ...)
    __attribute__((format (printf, 1, 2)));

TO

/*@manual log
Reports error message and exits with code 128.
*/
#ifdef _MSC_VER

__declspec(noreturn) void pbc_die(const char *err, ...);

#else

void pbc_die(const char *err, ...)
__attribute__((__noreturn__))
__attribute__((format(printf, 1, 2)));

#endif

/*@manual log
Reports informational message.
*/
#ifdef _MSC_VER

void pbc_info(const char *err, ...);

#else

void pbc_info(const char *err, ...)
__attribute__((format(printf, 1, 2)));

#endif

/*@manual log
Reports warning message.
*/
#ifdef _MSC_VER

void pbc_warn(const char *err, ...);

#else

void pbc_warn(const char *err, ...)
__attribute__((format(printf, 1, 2)));

#endif

/*@manual log
Reports error message.
*/
#ifdef _MSC_VER

void pbc_error(const char *err, ...);

#else

void pbc_error(const char *err, ...)
__attribute__((format(printf, 1, 2)));

#endif

第二个文件 pbc_curve.h

From

#pragma GCC visibility push(hidden)
// Internal:

element_ptr curve_x_coord(element_t e);
element_ptr curve_y_coord(element_t e);
element_ptr curve_a_coeff(element_t e);
element_ptr curve_b_coeff(element_t e);
element_ptr curve_field_a_coeff(field_t f);
element_ptr curve_field_b_coeff(field_t f);

void curve_from_x(element_ptr e, element_t x);
void curve_set_si(element_t R, long int x, long int y);
void curve_set_gen_no_cofac(element_ptr a);

#pragma GCC visibility pop

to

// Internal:

element_ptr curve_x_coord(element_t e);
element_ptr curve_y_coord(element_t e);
element_ptr curve_a_coeff(element_t e);
element_ptr curve_b_coeff(element_t e);
element_ptr curve_field_a_coeff(field_t f);
element_ptr curve_field_b_coeff(field_t f);

void curve_from_x(element_ptr e, element_t x);
void curve_set_si(element_t R, long int x, long int y);
void curve_set_gen_no_cofac(element_ptr a);
  • visual studio 调试时提示:

  • “”Win32Project3.exe”(Win32): 已加载“C:\Windows\SysWOW64\ntdll.dll”。无法查找或打开 PDB 文件。
    
    “Win32Project3.exe”(Win32): 已加载“C:\Windows\SysWOW64\kernel32.dll”。已加载符号。
    
    “Win32Project3.exe”(Win32): 已加载“C:\Windows\SysWOW64\KernelBase.dll”。无法查找或打开 PDB 文件。
    
    “Win32Project3.exe”(Win32): 已加载“C:\Windows\SysWOW64\msvcr120d.dll”。已加载符号。
    
    程序“[4308] Win32Project3.exe”已退出,返回值为 0 (0x0)。

     

  •  

     

    解决方法:解决方法

  • 无法解析_snprintf   解决方法:在提示的文件(GMP和PBC库的源码文件)里找到snprintf,并在其前面加下划线变成_snprintf,然后重新编译GMP和PBC库,将得到新的libpbc.a、libgmp.a拷贝到VS工程下,再次编译链接运行。或者将文件夹中的libmingwex.a也加载入工程,即可解决问题。.若报错"无法解析_snprintf",应该在提示的文件(GMP和PBC库的源码文件)里找到snprintf,并在其前面加下划线变成_snprintf,然后重新编译GMP和PBC库,将得到新的libpbc.a、libgmp.a拷贝到VS工程下,再次编译链接运行。或者将文件夹中的libmingwex.a也加载入工程,即可解决问题。
  • 15
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 116
    评论
评论 116
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值