C语言实现椭圆曲线密码(课件例子)-创新互联

问题描述:

创新互联建站专注于永安企业网站建设,响应式网站,成都商城网站开发。永安网站建设公司,为永安等地区提供建站服务。全流程按需定制,专业设计,全程项目跟踪,创新互联建站专业和态度为您提供的服务

以下代码只是实现上诉例子。我将 a和2a...直接计算好存放到数组中。(按照下图的方法进行计算)

下图是对课件中例子的手算过程:

本原元是(2,7),私钥是为7,随机数为3。输入的明文一定要在椭圆曲线上,我代码中没有关于这个条件的判断,读者可以自行加入。截图中是对13取余,因为题目中说明了E上有13个点。根据题目不同要做相应的修改。

代码:

#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("请输入随机数r值:");
	scanf("%d",&r);//题中为3
	printf("请输入随机数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是为了让余数为正
		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("已退出加密解密系统\n");
			break;
		default:
			printf("输入有误,请重新输入!\n");
			break;
		}
	} while (input);
}
int main() {
	test();
	return 0;
}

运行结果截图:

如果内容对你有帮助,关注我,给我点个小小的赞吧!

若内容有误,请指正并多多包容,谢谢。

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前题目:C语言实现椭圆曲线密码(课件例子)-创新互联
文章源于:http://hbruida.cn/article/dhechg.html