目录
题目要求:(打赏一个红包,谢谢,QQ:328765324)
代码(C++):
#include <iostream>
#include <string>
using namespace std;
//NTRUE加密
int* NTRUE_encrypt(int* h , int* r , int* m ,int N ,int p ,int q)
{
int i=0 ,j=0;
int *e = new int[N];
for(i=0;i<N;i++)
{
e[i]=0;
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
e[(i+j)%N] = (e[(i+j)%N] + h[j] * r[i]) % q ;
}
}
for(i=0;i<N;i++)
{
e[i] = p * e[i] + m[i] ;
}
return e;
}
//NTRUE解密
int* NTRUE_decrypt(int*f ,int* f_p ,int* e ,int N ,int p ,int q )
{
int i=0 , j=0;
int *de_m = new int[N];
int *de_M = new int[N];
for(i=0;i<N;i++)
{
de_m[i]=0;
de_M[i]=0;
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
de_m[(i+j)%N] = (de_m[(i+j)%N] + f[i] * e[j]) % q ;
}
}
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
de_M[(i+j)%N] = (de_M[(i+j)%N] + f_p[i] * de_m[j])%p ;
}
}
return de_M;
}
int main()
{
int i=0 , j=0;//用来计数
//N代表卷积的阶数
int p = 2 , N = 7 , q = 29;
int h[7]={23 , 23 , 23 , 24 , 24 , 24 , 23};//公钥
int r[7]={1 , 1 ,0 , 1 , 0 , 0 ,1 };//随机数
int m[7]= {1 , 1 , 0 ,1 ,0 , 0 , 0};//明文
int f[7]={1 , 1 , 1 , 0 , 1 , 1 , 0};//私钥的一部分
int f_p[7] = {1 , 0 , 0 , 0 , 0 ,1 , 1};//f在有限域p上的逆元
int* e= new int[N];//存储加密信息
cout<<"加密结果如下--------------"<<endl;
e = NTRUE_encrypt(h , r , m , N ,p ,q);//调用加密函数
for(i=0;i<N;i++)
{
cout<<e[i]<<" ";
}
cout<<endl;
cout<<"解密结果如下--------------"<<endl;
int* de_M = new int[N];//解密信息存储
de_M=NTRUE_decrypt(f ,f_p ,e ,N ,p ,q );//调用解密信息
for(i=0;i<N;i++)
{
cout<<*de_M<<" ";
de_M ++;
}
delete[] e;
delete[] de_M;
return 0;
}
具体解析:
回顾NTRUE:
NTRUE密钥生产:
NTRUE加密:
NTRUE解密: