⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ecdsaview.cpp

📁 椭圆曲线签名算法
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	if (!flag_base)
	{
		MessageBox("还没有生成基点");
		return;
	}
	else
	{
		str+="----正在生成密钥对---\r\n";
		pCWnd->SetWindowText(str);
		pCWnd->UpdateWindow();//刷新窗口

		SetKey(d,Q);

		if (Compare(d)) 
		{
			MessageBox("该曲线不满足条件");
			str="";
			UpdateData(TRUE);
			pCWnd->SetWindowText(str);
			UpdateData(FALSE);
			return;
		}
		str+="    d=";
		str1=disp(d);
		str+=str1;
		pCWnd->SetWindowText(str);
		str+="    Q.x=";
		str1=disp(Q.x);
		str+=str1;
		pCWnd->SetWindowText(str);
		str+="    Q.y=";
		str1=disp(Q.y);
		str+=str1;
		pCWnd->SetWindowText(str);
		str+="----密钥对生成完成---\r\n\r\n";
		pCWnd->SetWindowText(str);
		flag_key=true;
	}
}

void CECDSAView::OnMenuSignature() 
{
	// TODO: Add your command handler code here
	CMINGWENDlg MINGWENDlg(this);
	MINGWENDlg.DoModal();
	CString str0=MINGWENDlg.m_MingWen;
	TCHAR c;
	
	//下面是对获取的明文进行散列处理
	if (str0.IsEmpty())
	{
		//MessageBox("还没有输入待处理的明文");
		return;
	}
	long mm=0;
	int length=str0.GetLength();
	int i;
	for(i=0;i<length;i++)
	{
		c=str0[i];
		mm|=c;
		i++;
	}
	m=Transform(mm);
 
    

	CString str1;
	if (!flag_key)
	{
		MessageBox("还没有生成密钥对");
 		return;
	}
	else
	{

    
    	str+="****正在签名****\r\n";
	 	pCWnd->SetWindowText("str");
		pCWnd->UpdateWindow();//刷新窗口
		
		//签名前计时
		QueryPerformanceCounter(&t1);
		Sign();
    	//签名结束计时
		QueryPerformanceCounter(&t2);
		//计算签名时间 
        f=t2.QuadPart- t1.QuadPart;
		CString st;
		st.Format("%f", f/fc);


		str+="    r=";
		str1=disp(r);
		str+=str1;
		pCWnd->SetWindowText(str);
		str+="    s=";
		str1=disp(s);
		str+=str1;
		pCWnd->SetWindowText(str);
		str+="****签名完成****\r\n";
		
        str+="签名所用时间为:"+st+"秒\r\n\r\n";
 
		pCWnd->SetWindowText(str);
		flag_sign=true;

		
	}
}

void CECDSAView::OnMenuAuthentic() 
{
	// TODO: Add your command handler code here
	 
	if (!flag_sign)
	{
		MessageBox("还没有生成密钥对");
	}
	else
	{
	       
		str+="----正在对签名认证----\r\n";
		pCWnd->SetWindowText(str);
		pCWnd->UpdateWindow();//刷新窗口
		
		//认证开始计时
	    QueryPerformanceCounter(&t1);	
		bool flag=Authentic();
		//认证完成时间计时
		QueryPerformanceCounter(&t2);
		//计算认证时间
		f=t2.QuadPart- t1.QuadPart;
		CString st;
		st.Format("%f", f/fc);

		if (flag)
		{
			str+="----认证成功----\r\n";
		
			str+="认证所用时间:"+st+"秒\r\n\r\n";
			pCWnd->SetWindowText(str);
		}
		else
		{
			str+="----认证失败----\r\n";
			str+="认证所用时间:"+st+"秒\r\n\r\n";
			pCWnd->SetWindowText(str);
		}
	}	
}

void CECDSAView::OnEcc() 
{
	// TODO: Add your command handler code here
	OnMenuEcc();
}

void CECDSAView::OnBase() 
{
	// TODO: Add your command handler code here
	OnMenuBasepoint();
}

void CECDSAView::OnKey() 
{
	// TODO: Add your command handler code here
	OnMenuKey();
}

void CECDSAView::OnSign() 
{
	// TODO: Add your command handler code here
	OnMenuSignature();
}

void CECDSAView::OnAUTHENTIC() 
{
	// TODO: Add your command handler code here
	OnMenuAuthentic();
}


void CECDSAView::OnMenuTest() 
{
	// TODO: Add your command handler code here
	CTestDlg TestDlg(this);
	TestDlg.DoModal();
	int flag=TestDlg.flag;
	pCWnd=TestDlg.pCWnd;
	int number;
	CString str1;
	switch(flag)
	{
	/************************************************************************/
	/* 大整数乘法测试                                                       */
	/************************************************************************/
	case 1:
		{
			CTestBignumDlg TestBignumDlg(this);
			char s[30];
			BigInteger BigNum1,BigNum2;
			TestBignumDlg.DoModal();
			number=TestBignumDlg.m_BigNum1;
			str="";
			str+="----大整数乘法运行实例----\r\n\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口
			
			memset(s,'\0',30);
			sprintf(s,"随机产生的%d位整数A:\r\n",number);
			str+=s;
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();
			BigNum1=Rand(number);
			str1=disp(BigNum1);
			str+=str1;
			str+="\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口

			memset(s,'\0',30);
			number=TestBignumDlg.m_BigNum2;
			sprintf(s,"随机产生的%d位整数B:\r\n",number);
			str+=s;
			pCWnd->SetWindowText(str);
			BigNum2=Rand(number);
			str1=disp(BigNum2);
			str+=str1;
			str+="\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口

			str+="相乘的结果是:\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口
			BigNum1=BigNum1*BigNum2;
			str1=disp(BigNum1);
			str+=str1;
			pCWnd->SetWindowText(str);
			
			break;
		}
	/************************************************************************/
	/* 大整数除法测试                                                       */
	/************************************************************************/
	case 2:
		{
			CTestBignumDlg TestBignumDlg(this);
			char s[30];
			BigInteger BigNum1,BigNum2;
			TestBignumDlg.DoModal();
			number=TestBignumDlg.m_BigNum1;
			str="";
			str+="----大整数除法运行实例----\r\n\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口
			
			memset(s,'\0',30);
			sprintf(s,"随机产生的%d位整数A:\r\n",number);
			str+=s;
			pCWnd->SetWindowText(str);						
			BigNum1=Rand(number);
			str1=disp(BigNum1);
			str+=str1;
			str+="\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口
			
			memset(s,'\0',30);
			number=TestBignumDlg.m_BigNum2;
			sprintf(s,"随机产生的%d位整数B:\r\n",number);
			str+=s;
			pCWnd->SetWindowText(str);
			BigNum2=Rand(number);
			str1=disp(BigNum2);
			str+=str1;
			str+="\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口
			
			BigNum1=BigNum1/BigNum2;
			str+="相除的结果是:\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口
			str1=disp(BigNum1);
			str+=str1;
			pCWnd->SetWindowText(str);
			break;
		}
	/************************************************************************/
	/* 模逆算法测试                                                         */
	/************************************************************************/
	case 3:
		{
			CModeDlg ModeDlg(this);
			ModeDlg.DoModal();
			BigInteger BigNum1,BigNum2;
			CString sub;
			sub=ModeDlg.m_Base;
			if (sub.IsEmpty())
			{
				MessageBox("还没有输入待处理的数据");
				return;
			}
			str="";
			str+="-----模逆算法运行实例a mod n的逆-----\r\n\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口

			
			BigNum1=CStringToBignum(sub);
			str+="a=";
			str1=disp(BigNum1);
			str+=str1;
			str+="\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口

			sub=ModeDlg.m_Mode;
			BigNum2=CStringToBignum(sub);
			str+="n=";
			str1=disp(BigNum2);
			str+=str1;
			str+="\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口

			BigNum1=Inv(BigNum1,BigNum2);
			if (Compare(BigNum1))
			{
				MessageBox("两整数不互素,没有逆元");
				str="";
				pCWnd->SetWindowText(str);
				return;
			}
		
			str+="a mod n的逆=";
			str1=disp(BigNum1);
			str+=str1;
			str+="\r\n";
			pCWnd->SetWindowText(str);

			break;
		}
	/************************************************************************/
	/* 指数模运算测试                                                       */
	/************************************************************************/
	case 4:
		{
			CModeDlg ModeDlg(this);
			ModeDlg.DoModal();
			BigInteger BigNum1,BigNum2,BigNum3;
			CString sub;
			sub=ModeDlg.m_Base;
			if (sub.IsEmpty())
			{
				MessageBox("还没有输入待处理的数据");
				return;
			}
			str="";
			str+="-----指数模算法运行实例a^m mod n-----\r\n\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口
			
			
			BigNum1=CStringToBignum(sub);
			str+="a=";
			str1=disp(BigNum1);
			str+=str1;
			str+="\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口
			
			sub=ModeDlg.m_Exp;
			BigNum2=CStringToBignum(sub);
			str+="m=";
			str1=disp(BigNum2);
			str+=str1;
			str+="\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口

			sub=ModeDlg.m_Mode;
			BigNum3=CStringToBignum(sub);
			str+="n=";
			str1=disp(BigNum3);
			str+=str1;
			str+="\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口
			
			BigNum1=Calculate_exp(BigNum1,BigNum2,BigNum3);
			str+="a^m mod n=";
			str1=disp(BigNum1);
			str+=str1;
			str+="\r\n";
			pCWnd->SetWindowText(str);
			break;
		
		}
		/************************************************************************/
		/* 随机生成大整数                                                       */
		/************************************************************************/
	case 5:
		{
			CWeiShuDlg WeishuDlg(this);
			BigInteger BigNum1;
			char s[30];
			WeishuDlg.DoModal();
			int Weishu=WeishuDlg.m_WeiShu;
			if (!Weishu) 
			{
				MessageBox("没有输入要生成的大整数的位数");
				return;
			}
			else
			{
				str="";
				str+="-----随机生成大整数的运行实例-----\r\n\r\n";
				pCWnd->SetWindowText(str);
				memset(s,'\0',30);
				sprintf(s,"随机产生的%d位整数:\r\n",Weishu);
				str+=s;
				pCWnd->UpdateWindow();//刷新窗口
				
				BigNum1=Rand(Weishu);
				str1=disp(BigNum1);
				str+=str1;
				str+="\r\n";
				pCWnd->SetWindowText(str);
			}
			break;
		}
	/************************************************************************/
	/* 生成伪随机大素数的测试                                               */
	/************************************************************************/
	case 6:
		{
			CWeiShuDlg WeishuDlg(this);
			BigInteger BigNum1;
			char s[30];
			WeishuDlg.DoModal();
			int Weishu=WeishuDlg.m_WeiShu;
			if (!Weishu) 
			{
				MessageBox("没有输入要生成的大整数的位数");
				return;
			}
			else
			{
				str="";
				str+="-----生成伪随机大素数的运行实例-----\r\n\r\n";
				pCWnd->SetWindowText(str);
				pCWnd->UpdateWindow();//刷新窗口
				BigNum1=Produce_Prime(Weishu);
				memset(s,'\0',30);
				sprintf(s,"随机产生的%d位大素数:\r\n",Weishu);
				str+=s;
				pCWnd->UpdateWindow();//刷新窗口
				str1=disp(BigNum1);
				str+=str1;
				str+="\r\n";
				pCWnd->SetWindowText(str);				
			}
			break;
		}
		/************************************************************************/
		/*点的数乘算法改进前后对比的运行实例									*/
		/************************************************************************/
	case 7:
		{
			q=Transform(5987);
			a=Transform(1164);
			b=Transform(17);
			G.x=Transform(68);
			G.y=Transform(733);
			n=Transform(37);
			char sub[30];
			str="";
			str+="-----数乘算法改进前后对比的运行实例-----\r\n\r\n";
			str+="G.x=";
			str1=disp(G.x);
			str+=str1;
			str+="G.x=";
			str1=disp(G.y);
			str+=str1;
			str+="\r\n";
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口

			time_t tBegin1,tEnd1,tBegin2,tEnd2;
			double time_cost;
			long nn=150;
			BigInteger mm=Transform(nn),temp1(1);
			Point P;
			P.x=G.x;
			P.y=G.y;
			time(&tBegin1);
			for(int i=150;i>1;i--)
			{
				P=Point_Calculate(P,G);
			}
			time(&tEnd1);
			time_cost=difftime(tEnd1,tBegin1);
			memset(sub,'\0',30);
			sprintf(sub,"采用累加法计算150G耗时%.01f秒\r\n",time_cost);
			str+=sub;
			pCWnd->SetWindowText(str);
			pCWnd->UpdateWindow();//刷新窗口
			
			time(&tBegin2);
			P=Point_Multiply(G,mm);
			time(&tEnd2);
			time_cost=difftime(tEnd2,tBegin2);
			memset(sub,'\0',30);
			sprintf(sub,"采用模重复平方法计算150G耗时%.01f秒\r\n",time_cost);
			str+=sub;
			pCWnd->SetWindowText(str);
			break;
		}	
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -