歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux技術 >> Linux平台下NTRUSign的安裝

Linux平台下NTRUSign的安裝

日期:2017/3/3 13:58:10   编辑:Linux技術

說明:最近需要使用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
 = {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的可執行文件。
Copyright © Linux教程網 All Rights Reserved