说明:最近需要使用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的可执行文件。