背景
PBC库是一个基于双线性对的密码学库,这库在公钥密码学中使用非常广泛。
这个库在Linux下的安装非常的简单,有些只会纸上谈兵的人需要在WIN下做,呵呵。
但是没办法,需求到了,硬着头皮也要写完,对于一些只会谈兵的人,呵呵。
现在主要介绍下参考的一个文章:
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。
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也加载入工程,即可解决问题。