亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ecc.c

?? C語言
?? C
?? 第 1 頁 / 共 5 頁
字號:

/* 1、用戶A選定一條適合加密的橢圓曲線Ep(a,b)(如:y2=x3+ax+b),并取橢圓曲線上一點,作為基點G。
  2、用戶A選擇一個私有密鑰k,并生成公開密鑰K=kG。
  3、用戶A將Ep(a,b)和點K,G傳給用戶B。
  4、用戶B接到信息后 ,將待傳輸?shù)拿魑木幋a到Ep(a,b)上一點M,并產(chǎn)生一個隨機整數(shù)r(r<n)。
  5、用戶B計算點C1=M+rK;C2=rG。
  6、用戶B將C1、C2傳給用戶A。
  7、用戶A接到信息后,計算C1-kC2,結(jié)果就是點M。因為
          C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M
   再對點M進行解碼就可以得到明文。

    密碼學中,描述一條Fp上的橢圓曲線,常用到六個參量:
       T=(p,a,b,G,n,h)。
  (p 、a 、b 用來確定一條橢圓曲線,G為基點,n為點G的階,h 是橢圓曲線上所有點的個數(shù)m與n相除的整數(shù)部分)

  這幾個參量取值的選擇,直接影響了加密的安全性。參量值一般要求滿足以下幾個條件:

  1、p 當然越大越安全,但越大,計算速度會變慢,200位左右可以滿足一般安全要求;
  2、p≠n×h;
  3、pt≠1 (mod n),1≤t<20;
  4、4a3+27b2≠0 (mod p);
  5、n 為素數(shù);
  6、h≤4。
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream.h>
#include <time.h>
#include "tommath.h"
#include "ecc.h"

#define BIT_LEN 800 
#define KEY_LONG 128  //私鑰比特長
#define P_LONG 200    //有限域P比特長
#define EN_LONG 40    //一次取明文字節(jié)數(shù)(x,20)(y,20)


//得到lon比特長素數(shù)
int GetPrime(mp_int *m,int lon);
//得到B和G點X坐標G點Y坐標
void Get_B_X_Y(mp_int *x1,mp_int *y1,mp_int *b,  mp_int *a,  mp_int *p);
//點乘
bool Ecc_points_mul(mp_int *qx,mp_int *qy, mp_int *px, mp_int *py,mp_int *d,mp_int *a,mp_int *p);
//點加
int Two_points_add(mp_int *x1,mp_int *y1,mp_int *x2,mp_int *y2,mp_int *x3,mp_int *y3,mp_int *a,bool zero,mp_int *p);
//二進制存儲密文
int chmistore(mp_int *a,FILE *fp);
//把讀取的字符存入mp_int型數(shù)
int putin(mp_int *a,char *ch,int chlong);
//ECC加密
void Ecc_encipher(mp_int *qx,mp_int *qy, mp_int *px, mp_int *py,mp_int *a,mp_int *p);
//ECC解密
void Ecc_decipher(mp_int *k, mp_int *a,mp_int *p);
//實現(xiàn)將mp_int數(shù)a中的比特串還原為字符串并賦給字符串ch:
int chdraw(mp_int *a,char *ch);
//取密文
int miwendraw(mp_int *a,char *ch,int chlong);


int myrng(unsigned char *dst, int len, void *dat)
{
   int x;
   for (x = 0; x < len; x++) dst[x] = rand() & 0xFF;
   return len;
}


int main(){

	cout<<"\n          ECC"<<endl;
	
	cout<<"\n------------------------------------------------------------------------\n"<<endl;
   
	mp_int GX;
	mp_int GY;
	mp_int K;//私有密鑰
	mp_int A;
	mp_int B;
	mp_int QX;
	mp_int QY;
	mp_int P;//Fp中的p(有限域P)
	

	mp_init(&GX);
	mp_init(&GY);
	mp_init(&K);
	mp_init(&A);
	mp_init(&B);
	mp_init(&QX);
	mp_init(&QY);
	mp_init(&P);
	

    time_t t;           
    srand( (unsigned) time( &t ) );

    printf("Parameters list blow(Decimal):\n");	

    GetPrime(&P,P_LONG);
	printf("P:\n");	
	char temp[800]={0};
    mp_toradix(&P,temp,10);
    printf("%s\n",temp);    

    GetPrime(&A,30);
	char tempA[800]={0};
	printf("A:\n");	
    mp_toradix(&A,tempA,10);
    printf("%s\n",tempA); 
	
	Get_B_X_Y(&GX,&GY,&B,&A,&P);

    char tempB[800]={0};
	printf("B:\n");	
    mp_toradix(&B,tempB,10);
    printf("%s\n",tempB); 
	
	char tempGX[800]={0};
	printf("G coordinate X:\n");	
    mp_toradix(&GX,tempGX,10);
    printf("%s\n",tempGX);   

	char tempGY[800]={0};
	printf("G coordinate Y:\n");
    mp_toradix(&GY,tempGY,10);
    printf("%s\n",tempGY); 
	

	//------------------------------------------------------------------
    GetPrime(&K,KEY_LONG);
    char tempK[800]={0};
	printf("Private Key:\n");
    mp_toradix(&K,tempK,10);
    printf("%s\n",tempK); 

	Ecc_points_mul(&QX,&QY,&GX,&GY,&K,&A,&P);
	

    char tempQX[800]={0};
	printf("Public coordinate X:\n");
    mp_toradix(&QX,tempQX,10);
    printf("%s\n",tempQX); 

	char tempQY[800]={0};
	printf("Public coordinate Y:\n");
    mp_toradix(&QY,tempQY,10);
    printf("%s\n",tempQY); 


	printf("\n------------------------------------------------------------------------\n");

	Ecc_encipher(&QX,&QY,&GX,&GY,&A,&P);//加密

	printf("\n------------------------------------------------------------------------\n");

	Ecc_decipher(&K,&A,&P);//解密

	printf("\n------------------------------------------------------------------------\n");

	char cc;
    cout<<"\n\nAny key to exit!\n";
	cin>>cc;

	mp_clear(&GX);
	mp_clear(&GY);
	mp_clear(&K);//私有密鑰
	mp_clear(&A);
	mp_clear(&B);
	mp_clear(&QX);
	mp_clear(&QY);
	mp_clear(&P);//Fp中的p(有限域P)
	
	return(0);
}


int GetPrime(mp_int *m,int lon){
   mp_prime_random_ex(m, 10, lon, 
		(rand()&1)?LTM_PRIME_2MSB_OFF:LTM_PRIME_2MSB_ON, myrng, NULL);
   return MP_OKAY;
}

void Get_B_X_Y(mp_int *x1,mp_int *y1,mp_int *b, mp_int *a, mp_int *p)
{
    mp_int tempx,tempy;
    mp_int temp;
	mp_int compare;
	mp_int temp1;
	mp_int temp2;
	mp_int temp3;
	mp_int temp4;
	mp_int temp5;
	mp_int temp6;
	mp_int temp7;
	mp_int temp8;
    
	mp_init_set_int (&compare, 0);
	mp_init(&tempx);
	mp_init(&tempy);
	mp_init(&temp);
    mp_init(&temp1);
	mp_init(&temp2);
	mp_init(&temp3);
	mp_init(&temp4);
	mp_init(&temp5);
	mp_init(&temp6);
	mp_init(&temp7);
	mp_init(&temp8);

 
   while(1)
   {
     
	 //4a3+27b2≠0 (mod p)
     GetPrime(b,40);
	 mp_expt_d(a, 3, &temp1);
     mp_sqr(b, &temp2);
	 mp_mul_d(&temp1, 4, &temp3);
	 mp_mul_d(&temp2, 27, &temp4);
     mp_add(&temp3, &temp4, &temp5);
	 mp_mod(&temp5,p,&temp);

     if(mp_cmp(&temp, &compare)!=0 )
	 {
		 break;
	 }
   }

   //y2=x3+ax+b,隨機產(chǎn)生X坐標,根據(jù)X坐標計算Y坐標
   GetPrime(x1,30);
   mp_expt_d(x1, 3, &temp6);
   mp_mul(a, x1, &temp7);
   mp_add(&temp6, &temp7, &temp8);
   mp_add(&temp8, b, &tempx);
   mp_sqrt(&tempx, y1);



   mp_clear(&tempx);
   mp_clear(&tempy);
   mp_clear(&temp);
   mp_clear(&temp1);
   mp_clear(&temp2);
   mp_clear(&temp3);
   mp_clear(&temp4);
   mp_clear(&temp5);
   mp_clear(&temp6);
   mp_clear(&temp7);
   mp_clear(&temp8);


}

bool Ecc_points_mul(mp_int *qx,mp_int *qy, mp_int *px, mp_int *py,mp_int *d,mp_int *a,mp_int *p)
{
mp_int X1, Y1;
mp_int X2, Y2;
mp_int X3, Y3;
mp_int XX1, YY1;
mp_int A,P;

int i;
bool zero=false;
char Bt_array[800]={0};
char cm='1';

    mp_toradix(d,Bt_array,2); 

    mp_init_set_int(&X3, 0);
    mp_init_set_int(&Y3, 0);
	mp_init_copy(&X1, px);
	mp_init_copy(&X2, px);
    mp_init_copy(&XX1, px);
	mp_init_copy(&Y1, py);
	mp_init_copy(&Y2, py);
	mp_init_copy(&YY1, py);

	mp_init_copy(&A, a);
	mp_init_copy(&P, p);

	for(i=1;i<=KEY_LONG-1;i++)
	{
	   mp_copy(&X2, &X1);
	   mp_copy(&Y2, &Y1);
	   Two_points_add(&X1,&Y1,&X2,&Y2,&X3,&Y3,&A,zero,&P);  
       mp_copy(&X3, &X2);
	   mp_copy(&Y3, &Y2);
	   if(Bt_array[i]==cm)
	   {
		  
		   mp_copy(&XX1, &X1);
		   mp_copy(&YY1, &Y1);
		   Two_points_add(&X1,&Y1,&X2,&Y2,&X3,&Y3,&A,zero,&P);
		   mp_copy(&X3, &X2);
		   mp_copy(&Y3, &Y2);

	   }

	}
		
   if(zero)
   {
	   cout<<"It is Zero_Unit!";
       return false;//如果Q為零從新產(chǎn)生D
   }

   mp_copy(&X3, qx);
   mp_copy(&Y3, qy);

   mp_clear(&X1);
   mp_clear(&Y1);
   mp_clear(&X2);
   mp_clear(&Y2);
   mp_clear(&X3);
   mp_clear(&Y3);
   mp_clear(&XX1);
   mp_clear(&YY1);
   mp_clear(&A);
   mp_clear(&P);
  
   return true;
}

//兩點加
int Two_points_add(mp_int *x1,mp_int *y1,mp_int *x2,mp_int *y2,mp_int *x3,mp_int *y3,mp_int *a,bool zero,mp_int *p)
{
mp_int x2x1;
mp_int y2y1;
mp_int tempk;
mp_int tempy;
mp_int tempzero;
mp_int k;
mp_int temp1;
mp_int temp2;
mp_int temp3;
mp_int temp4;
mp_int temp5;
mp_int temp6;
mp_int temp7;
mp_int temp8;
mp_int temp9;
mp_int temp10;


mp_init(&x2x1);
mp_init(&y2y1);
mp_init(&tempk);
mp_init(&tempy);
mp_init(&tempzero);
mp_init(&k);
mp_init(&temp1);
mp_init(&temp2);
mp_init_set(&temp3,2);
mp_init(&temp4);
mp_init(&temp5);
mp_init(&temp6);
mp_init(&temp7);
mp_init(&temp8);
mp_init(&temp9);
mp_init(&temp10);


   if(zero)
   {
	  mp_copy(x1, x3);
      mp_copy(y1, y3);
	  zero=false;
	  goto L;
   }
   mp_zero(&tempzero);
   mp_sub(x2, x1, &x2x1);
   if(mp_cmp(&x2x1,&tempzero)==-1)
   {
	  
	  mp_add(&x2x1, p, &temp1);
	  mp_zero(&x2x1);
      mp_copy(&temp1, &x2x1);
   }
   mp_sub(y2, y1, &y2y1);
   if(mp_cmp(&y2y1,&tempzero)==-1)
   {
     
	  mp_add(&y2y1, p, &temp2);
	  mp_zero(&y2y1);
      mp_copy(&temp2, &y2y1);
   }
   if(mp_cmp(&x2x1, &tempzero)!=0)
   {
	   
	   mp_invmod(&x2x1,p,&tempk);
	   
	   mp_mulmod(&y2y1, &tempk, p, &k);
   }
   else
   {
	   if(mp_cmp(&y2y1, &tempzero)==0)
	   {
		  
		  mp_mulmod(&temp3,y1,p,&tempy);
          mp_invmod(&tempy,p,&tempk);
          mp_sqr(x1, &temp4);     
		  mp_mul_d(&temp4, 3, &temp5);
		  mp_add(&temp5, a, &temp6);
          mp_mulmod(&temp6, &tempk, p, &k);
		  
	   }
	   else
	   {
		  zero=true;
		  goto L;
	   }
   }  
 
   mp_sqr(&k, &temp7);
   mp_sub(&temp7, x1, &temp8);
   mp_submod(&temp8, x2, p, x3);
 
   mp_sub(x1, x3, &temp9);
   mp_mul(&temp9, &k, &temp10);
   mp_submod(&temp10, y1, p, y3);


L:

   mp_clear(&x2x1);
   mp_clear(&y2y1);
   mp_clear(&tempk);
   mp_clear(&tempy);
   mp_clear(&tempzero);
   mp_clear(&k);
   mp_clear(&temp1);
   mp_clear(&temp2);
   mp_clear(&temp3);
   mp_clear(&temp4);
   mp_clear(&temp5);
   mp_clear(&temp6);
   mp_clear(&temp7);
   mp_clear(&temp8);
   mp_clear(&temp9);
   mp_clear(&temp10);

   return 1;

}

//二進制存儲密文
int chmistore(mp_int *a,FILE *fp)
{

   int i,j;
   char ch;
   char chtem[4];

   mp_digit yy=(mp_digit)255;
   for (i=0; i <= a->used - 1;  i++) { 

      chtem[3]=(char)(a->dp[i] & yy);     
      chtem[2]=(char)((a->dp[i] >> (mp_digit)8) & yy);	    
	  chtem[1]=(char)((a->dp[i] >> (mp_digit)16) & yy);    
      chtem[0]=(char)((a->dp[i] >> (mp_digit)24) & yy);

      for(j=0;j<4;j++)
	  {
	      fprintf(fp,"%c",chtem[j]);
	  }
      
  }  

  ch=char(255);
  fprintf(fp, "%c", ch);
  return MP_OKAY;
}


//把讀取的字符存入mp_int型數(shù)
int putin(mp_int *a,char *ch,int chlong)
{
	mp_digit *temp,yy;
	int i,j,res;
	if(a->alloc<chlong*2/7+2)
	{
		if((res=mp_grow(a,chlong*2/7+2))!=MP_OKAY)
			return res;
	}
    
	a->sign=0;
	mp_zero(a);
	temp=a->dp;
	i=0;
	yy=(mp_digit)15;

	if(chlong<4)
	{
            for(j=chlong-1;j>=0;j--)
			{
			   *temp |= (mp_digit)(ch[j] & 255);
               *temp <<= (mp_digit)CHAR_BIT;
			}
			*temp >>= (mp_digit)8;
			a->used=1;
			return MP_OKAY;
	}

	if(chlong<7)
	{
	        i+=4;
            *++temp |= (mp_digit)(ch[i-1] & yy);
		    *temp <<= (mp_digit)CHAR_BIT;
            *temp |= (mp_digit)(ch[i-2] & 255);
		    *temp <<= (mp_digit)CHAR_BIT;
            *temp |= (mp_digit)(ch[i-3] & 255);
		    *temp <<= (mp_digit)CHAR_BIT;
            *temp-- |= (mp_digit)(ch[i-4] & 255); //存放被切分的字符的低四位

            
            for(j=chlong-1;j>=i;j--)
			{  
			   *temp |= (mp_digit)(ch[j] & 255);
			   *temp <<= (mp_digit)CHAR_BIT;			                
			}
            *temp >>= (mp_digit)4;
            *temp |= (mp_digit)((ch[i-1] & 255) >> 4);  //存放被切分的字符的高四位
            
			a->used=2;
			return MP_OKAY;
	}

        //以7個字符為單元循環(huán),把七個字符放入的mp_int 的兩個單元中
	for(j=0;j<chlong/7;j++)
	{
		i+=7;
		*++temp |= (mp_digit)(ch[i-1] & 255);
		*temp <<= (mp_digit)CHAR_BIT;
        *temp |= (mp_digit)(ch[i-2] & 255);
		*temp <<= (mp_digit)CHAR_BIT;
        *temp |= (mp_digit)(ch[i-3] & 255);
		*temp <<= (mp_digit)4;
        *temp-- |= (mp_digit)((ch[i-4] & 255) >> 4);    //存放被切分的字符的高四位

		*temp |= (mp_digit)(ch[i-4] & yy);      //存放被切分的字符的低四位
        *temp <<= (mp_digit)CHAR_BIT;
        *temp |= (mp_digit)(ch[i-5] & 255);
		*temp <<= (mp_digit)CHAR_BIT;
        *temp |= (mp_digit)(ch[i-6] & 255);
		*temp <<= (mp_digit)CHAR_BIT;
        *temp++ |= (mp_digit)(ch[i-7] & 255); 

		temp++;
	
	}
 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精久久久久久久久久久| 国产精品视频看| 亚洲欧美一区二区三区极速播放| 久久精品国产亚洲a| 欧美午夜免费电影| 一区二区三区中文在线| 91官网在线免费观看| 一区二区三区在线免费观看 | 精品国产伦一区二区三区观看体验 | 欧美精品久久久久久久久老牛影院| 亚洲青青青在线视频| 欧美在线一二三四区| 久久综合中文字幕| 亚洲主播在线观看| 国产日韩欧美精品综合| 亚洲三级电影全部在线观看高清| 国产一区二区三区香蕉| 欧美精品一区二区在线播放| 欧美日韩视频在线一区二区 | 国产视频不卡一区| 欧美偷拍一区二区| 成人性视频免费网站| 美国十次了思思久久精品导航| 亚洲国产你懂的| 亚洲欧洲日韩在线| 国产精品美女久久久久久久网站| 欧美xxxx在线观看| 久久久青草青青国产亚洲免观| 国产呦精品一区二区三区网站| 国产精品欧美久久久久无广告 | 2023国产一二三区日本精品2022| 久久精品国产亚洲高清剧情介绍| 久久久久成人黄色影片| 在线观看日韩毛片| 久久久.com| 日韩欧美色综合网站| 日韩精品一二三| 日韩美女视频一区| 97se亚洲国产综合自在线| 日本一区二区视频在线观看| 欧美日韩在线观看一区二区 | 2020国产精品| 激情偷乱视频一区二区三区| 麻豆国产一区二区| 国产成都精品91一区二区三| gogo大胆日本视频一区| 成人黄色小视频| 国产精品亚洲综合一区在线观看| 极品少妇xxxx精品少妇| 老司机精品视频一区二区三区| 一区二区三区免费看视频| 日韩欧美亚洲一区二区| 欧美巨大另类极品videosbest| av一区二区久久| 国产+成+人+亚洲欧洲自线| 日本伊人色综合网| 日韩二区在线观看| 亚洲女性喷水在线观看一区| 精品剧情v国产在线观看在线| 欧美日韩在线精品一区二区三区激情 | 欧美三级韩国三级日本三斤| 久久99精品一区二区三区三区| 色综合久久天天| 丝袜美腿一区二区三区| 国产欧美日韩另类视频免费观看| 欧美日韩夫妻久久| 91网站最新地址| 国产精品18久久久| 黄色精品一二区| 五月天一区二区三区| 亚洲一区二区在线免费看| 国产农村妇女毛片精品久久麻豆| 不卡的av电影| 亚洲123区在线观看| 日韩国产精品91| 午夜伦欧美伦电影理论片| 亚洲国产精品久久不卡毛片 | 免播放器亚洲一区| 免费美女久久99| 日本亚洲免费观看| 日本欧美在线观看| 久久福利视频一区二区| 国产成人亚洲精品狼色在线| 丁香五精品蜜臀久久久久99网站| 福利一区在线观看| 91麻豆swag| 欧美日韩高清一区二区三区| 欧美伦理视频网站| 欧美一区二区日韩| 欧美精品一区二区久久婷婷| 亚洲国产精品精华液ab| 国产精品久久久一区麻豆最新章节| 亚洲欧美国产三级| 一区二区三区在线视频观看 | 亚洲色图视频网| 天天影视网天天综合色在线播放| 国产一区二区电影| 一本久道中文字幕精品亚洲嫩| 69堂亚洲精品首页| 国产欧美精品国产国产专区| 亚洲黄色免费网站| 麻豆精品一区二区综合av| 99视频有精品| 日韩亚洲欧美成人一区| 中文字幕一区二区三区精华液| 天天射综合影视| av资源站一区| 日韩一区二区三区免费观看| 国产精品女主播av| 日韩极品在线观看| 99精品久久免费看蜜臀剧情介绍| 日韩欧美国产麻豆| 成人禁用看黄a在线| 午夜视黄欧洲亚洲| 大尺度一区二区| 欧美顶级少妇做爰| 欧美激情一区二区| 久久精品国产亚洲aⅴ| 一本大道久久a久久精二百| 337p粉嫩大胆噜噜噜噜噜91av| 亚洲日穴在线视频| 国产精品羞羞答答xxdd| 欧美人与性动xxxx| 国产精品国产三级国产专播品爱网| 日日夜夜精品视频天天综合网| 成人精品视频一区| 一本久久精品一区二区| 中文字幕一区二区三区在线播放| 美女爽到高潮91| 欧美日韩国产成人在线91| 亚洲欧美另类图片小说| 成人h精品动漫一区二区三区| 678五月天丁香亚洲综合网| 国产精品灌醉下药二区| 国产麻豆视频精品| 日韩美一区二区三区| 天天影视色香欲综合网老头| 色综合久久久久综合| 久久久激情视频| 另类小说一区二区三区| 欧美视频第二页| 一区二区三区精品| 99精品国产一区二区三区不卡| 久久网这里都是精品| 九色|91porny| 精品久久一区二区三区| 青椒成人免费视频| 欧美日韩一区二区三区在线| 亚洲高清中文字幕| 日本韩国一区二区三区| 中文字幕不卡的av| 国产成人精品综合在线观看| 精品国产不卡一区二区三区| 日本中文字幕一区二区有限公司| 51精品秘密在线观看| 天堂资源在线中文精品| 欧美日韩国产精选| 亚洲午夜视频在线| 色综合久久综合网| 亚洲成人动漫精品| 欧美日韩日日夜夜| 日韩精品91亚洲二区在线观看| 欧美精品v日韩精品v韩国精品v| 亚洲v中文字幕| 欧美久久久一区| 国产综合色视频| 国产精品麻豆视频| 在线一区二区视频| 午夜精品久久久久久久久久| 欧美日韩精品一区二区三区 | 久久精品国产精品亚洲精品| 精品人伦一区二区色婷婷| 国产中文一区二区三区| 久久精品欧美一区二区三区麻豆| 国产成人综合在线播放| 国产欧美一区二区三区沐欲| 99久久99久久精品免费看蜜桃| 日韩美女视频19| 欧美日韩国产另类不卡| 青青国产91久久久久久| 精品福利一二区| 色综合天天综合狠狠| 轻轻草成人在线| 欧美激情在线一区二区| 99精品欧美一区二区蜜桃免费 | 91久久久免费一区二区| 亚洲视频电影在线| 日韩一区二区在线免费观看| 处破女av一区二区| 免费在线观看不卡| 亚洲欧美乱综合| 国产日韩成人精品| 日韩三级伦理片妻子的秘密按摩| 欧美日韩一区高清| 欧美一卡2卡三卡4卡5免费| 99热99精品| 国产专区欧美精品| 日韩av一二三| 一区二区三区在线看| 国产精品毛片久久久久久久|