NTRUE演算法_抗量子密碼_卷積_(worm)
阿新 • • 發佈:2018-12-22
題目要求:(打賞一個紅包,謝謝,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++) { de_M ++; cout<<*de_M<<" "; } delete[] e; delete[] de_M; return 0; }