📄 ecdsaview.cpp
字号:
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 + -