说明:最近需要使用NTRUSign算法,下载了securityinnovation公司的官方代码,在Linux平台下进行了安装配置,期间出现了一些奇怪的问题,在网上也没有找到相关的资料,后经过思考尝试最终解决,发现问题出在官方代码本身上面。现将整个过程记录下来并突出对官方代码的修改,希望对以后有需要的朋友有所帮助。
一、安装环境:Kali Linux 2.0,gcc 4.9.2
二、安装FFTW库
1.说明:FFTW用于一个计算任意长度的多维离散傅立叶变换,NTRUSign代码编译时需要这个库作为支持,所以先安装这个库。
2.下载:去官网http://www.fftw.org下载fftw的最新版本(当前最新为3.3.4)的Linux版本。
3.安装:用默认的安装顺序与选项即可,即./configure——make——makeinstall,亦可自己指定安装位置及选项,详情可百度相关帖子。另外,要注意安装时的root权限。
4.完成:默认头文件fftw3.h等文件会在/usr/local/include目录下,libfftw3.a文件会在/usr/local/lib下。另外在/usr/local/include下还会有fftw3.f、fftw3.f03文件,/usr/local/lib下还会有libfftw3.la文件,如果修改安装选项则会有更多的其它文件。
5.测试:使用测试代码测试程序是否安装成功,按照以下代码测试,如能够正确编译并运行出结果即表明fftw库安装成功。
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <fftw3.h> #define N 4 #define REAL 0 #define PI 3.1415926535898 #define IMAG 1 int main(int argc,char *argv[]) { fftw_complex *in,*out; fftw_plan p; double constants[N] = {10,2.1,4.7,1.3}; double f; int i,j; //alloc memory in = fftw_malloc(sizeof(fftw_complex) * N); out = fftw_malloc(sizeof(fftw_complex) * N); if((NULL == in) || (NULL == out)) { printf("Error:insufficient avaliable memory!\n"); exit(-1); } else { //Create the FFTW execution plan p = fftw_plan_dft_1d(N,in,out,FFTW_FORWARD,FFTW_ESTIMATE); //Initialze the input data for(i = 0; i < N;i++) { //All sampling points in[i][REAL] = constants[0]; in[i][IMAG] = 0; for(j = 1;j < N;j++) { //All frequencies in[i][REAL] += constants[j] * cos(j * i * 2 * PI / (double)N); in[i][IMAG] += constants[j] * sin(j * i * 2 * PI / (double)N); } } //Execute plan fftw_execute(p); //Destory plan fftw_destroy_plan(p); //Display results printf("Constants[] = {"); for(i = 0;i < N;i ++) printf("%lf%s",constants[i],(i == N-1)?"}\n":","); printf("Input[][REAL] = {"); for(i = 0;i < N;i++) printf("%lf%s",in[i][REAL],(i == N-1) ? "}\n":","); printf("Output[][REAL] = {"); for(i = 0;i < N;i++) printf("%lf%s",out[i][REAL],(i == N-1) ? "}\n":","); //Scale output f = 1.0/sqrt((double)N); for(i = 0;i < N;i++) out[i][REAL] *= f; //Display final results printf("Scaled[][REAL] = {"); for(i = 0;i< N;i++) printf("%lf%s",out[i][REAL],(i == N-1) ? "}\n":","); } //Free allocated memory if(in != NULL) fftw_free(in); if(out != NULL) fftw_free(out); return 0; }
说明:以上代码摘自网上。
三、安装 NTRUSign
1.下载:去官网https://www.securityinnovation.com/ 下载最新版本的ntru-crypto-master.zip(在Github上托管),解压之后的\reference_code\C\Sign\PASS目录是NTRUSign的C语言实现
2.修改:官方的Makefile文件和constants.h有点问题,会导致编译和运行均出现错误,现对其进行修改
(1)修改Makefile文件:修改src子目录下的Makefile文件,将第39行的$(LDFLAGS)移到末尾,也就是$@的后面。gcc中的-l链接库选项必须在源文件后面,否则编译会报错。
(2)修改src目录下的constants.h文件,第39行、51行、64行、76行的wisdom.dat文件路径有误,少了一个点,将“./data/*_wisdom.dat”改为“../data/*_wisdom.dat”,即找上一级目录而不是当前目录。这个错误会导致程序执行报错,显示初始化失败,提示wisdom有问题,就是因为找不到这个文件。
3.编译并执行:以上错误修改之后,经过make就会在/bin/目录下面生成名为bench的可执行文件。