C語言實現(xiàn)橢圓曲線密碼(課件例子)-創(chuàng)新互聯(lián)

問題描述:

創(chuàng)新互聯(lián)建站專注于永安企業(yè)網(wǎng)站建設,響應式網(wǎng)站,成都商城網(wǎng)站開發(fā)。永安網(wǎng)站建設公司,為永安等地區(qū)提供建站服務。全流程按需定制,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務

以下代碼只是實現(xiàn)上訴例子。我將 a和2a...直接計算好存放到數(shù)組中。(按照下圖的方法進行計算)

下圖是對課件中例子的手算過程:

本原元是(2,7),私鑰是為7,隨機數(shù)為3。輸入的明文一定要在橢圓曲線上,我代碼中沒有關于這個條件的判斷,讀者可以自行加入。截圖中是對13取余,因為題目中說明了E上有13個點。根據(jù)題目不同要做相應的修改。

代碼:

#include#include//ECC例題加密解密 
//打印菜單
void menu() {
	printf("-------  ECC算法   --------\n");
	printf("-------  1. 加密   --------\n");
	printf("-------  2. 解密   --------\n");
	printf("-------  0. 退出   --------\n");
}
void encryption_and_decryption(int input){
    //提前計算好的a
	int a[13][2]={{0,0},{2,7},{5,2},{8,3},{10,2},{3,6},{7,9},{7,2},{3,5},
					{10,9},{8,8},{5,9},{2,4}};
	int i=0,j=0,k=0,r=0;
    //存儲明文
	int m[1][2]={0};
    //存儲密文
	int c1[1][2]={0};
	int c2[1][2]={0};
	printf("請輸入隨機數(shù)r值:");
	scanf("%d",&r);//題中為3
	printf("請輸入隨機數(shù)k值:");
	scanf("%d",&k);//題中為7
	if(input==1){
		//加密算法 
		printf("請輸入要加密的明文:");
		scanf("%d %d",&m[0][0],&m[0][1]); 
		c1[0][0]=a[r][0];
		c1[0][1]=a[r][1];
        //查找是幾a
		for(i=0;i<13;i++){
			if(a[i][0]==m[0][0]&&a[i][1]==m[0][1]){
                //例子中j=9 
				j=i;       
				break;
			}
		}
		//例子中B為7a,且有13個點 
		r=(j+k*r) %13;
		c2[0][0]=a[r][0];
		c2[0][1]=a[r][1];
		printf("密文為((%d,%d),(%d,%d))\n",c1[0][0],c1[0][1],c2[0][0],c2[0][1]);
	}
	else{
		//解密算法 
		printf("請輸入要解密的密文:");
		scanf("%d %d %d %d",&c1[0][0],&c1[0][1],&c2[0][0],&c2[0][1]);
		for(i=0;i<13;i++){
			if(a[i][0]==c1[0][0]&&a[i][1]==c1[0][1]){
                //例子中j=3
				j=i;       
				break;
			}
		}
        //加156是為了讓余數(shù)為正
		r=(((-k)*j)+156)%13;
		for(i=0;i<13;i++){
			if(a[i][0]==c2[0][0]&&a[i][1]==c2[0][1]){
                //例子中j=4
				j=i;       
				break;
			}
		}
		r+=j;
		m[0][0]=a[r][0];
		m[0][1]=a[r][1];
		printf("明文為(%d,%d)\n",m[0][0],m[0][1]);
	}
}
void test() {
	int input = 0;
	do {
		menu();
		printf("請選擇:->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			encryption_and_decryption(input);
			break;
		case 2:
			encryption_and_decryption(input);
			break;
		case 0:
			printf("已退出加密解密系統(tǒng)\n");
			break;
		default:
			printf("輸入有誤,請重新輸入!\n");
			break;
		}
	} while (input);
}
int main() {
	test();
	return 0;
}

運行結果截圖:

如果內(nèi)容對你有幫助,關注我,給我點個小小的贊吧!

若內(nèi)容有誤,請指正并多多包容,謝謝。

你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

文章題目:C語言實現(xiàn)橢圓曲線密碼(課件例子)-創(chuàng)新互聯(lián)
文章位置:http://muchs.cn/article46/dhechg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、商城網(wǎng)站服務器托管、電子商務軟件開發(fā)、網(wǎng)站設計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設