📄 ecdsa.cpp
字号:
// ECDSA.cpp : Defines the class behaviors for the application.
//
#include "stdafx.h"
#include "ECDSA.h"
#include "MainFrm.h"
#include "ECDSADoc.h"
#include "ECDSAView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CECDSAApp
BEGIN_MESSAGE_MAP(CECDSAApp, CWinApp)
//{{AFX_MSG_MAP(CECDSAApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// Standard file based document commands
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// Standard print setup command
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CECDSAApp construction
CECDSAApp::CECDSAApp()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CECDSAApp object
CECDSAApp theApp;
/////////////////////////////////////////////////////////////////////////////
// CECDSAApp initialization
BOOL CECDSAApp::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable, you should remove from the following
// the specific initialization routines you do not need.
#ifdef _AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic(); // Call this when linking to MFC statically
#endif
// Change the registry key under which our settings are stored.
// TODO: You should modify this string to be something appropriate
// such as the name of your company or organization.
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
LoadStdProfileSettings(); // Load standard INI file options (including MRU)
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views.
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CECDSADoc),
RUNTIME_CLASS(CMainFrame), // main SDI frame window
RUNTIME_CLASS(CECDSAView));
AddDocTemplate(pDocTemplate);
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (!ProcessShellCommand(cmdInfo))
return FALSE;
// The one and only window has been initialized, so show and update it.
m_pMainWnd->ShowWindow(SW_SHOW);
m_pMainWnd->UpdateWindow();
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
// No message handlers
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// App command to run the dialog
void CECDSAApp::OnAppAbout()
{
CAboutDlg aboutDlg;
aboutDlg.DoModal();
}
//BigInteger类的实现,自己定义的
#include "iostream.h"
#include "stdio.h"
#include "windows.h"
#include "string.h"
#include "stdlib.h"
#include "time.h"
static seed=0;
BigInteger::BigInteger() //构造函数,将每个节点置空
{
Head=End=TempNode=NULL;
}
BigInteger::BigInteger(char i) //构造函数,只拥有一位的大整数
{
Head=End=TempNode=NULL;
TempNode=new Node;
TempNode->Num=i;
TempNode->Prev=NULL;
Head=End=TempNode;
TempNode->Next=NULL;
}
BigInteger::BigInteger(const BigInteger &BigNum) //拷贝构造
{
Node *p;
Head=End=TempNode=NULL;
p=BigNum.Head;
while(p)
{
AddEnd(p->Num);
p=p->Next;
}
}
BigInteger::~BigInteger() //析构
{
Node *NextNode;
if(Head==NULL)
return;
TempNode=Head;
while(TempNode)
{
NextNode=TempNode->Next;
delete TempNode;
TempNode=NextNode;
}
Head=NULL;
End=NULL;
TempNode=NULL;
}
void BigInteger::AddHead(char Num) //在链表头插入节点的操作
{
TempNode=new Node;
TempNode->Num=Num;
TempNode->Prev=NULL;
if(!Head)
{
Head=End=TempNode;
TempNode->Next=NULL;
}
else
{
TempNode->Next=Head;
Head->Prev=TempNode;
Head=TempNode;
}
}
void BigInteger::AddEnd(char Num) //在链表尾插入节点的操作
{
TempNode=new Node;
TempNode->Num=Num;
TempNode->Next=NULL;
if(!Head)
{
Head=End=TempNode;
TempNode->Prev=NULL;
}
else
{
TempNode->Prev=End;
End->Next=TempNode;
End=TempNode;
}
}
//调整大整数,如果最前面是0的话则表明该数就是0
void AdjustBigNum(BigInteger &BigNum)
{
Node *temp;
temp=BigNum.Head;
while (temp&&int(temp->Num)==0&&temp!=BigNum.End)
{
BigNum.Head=temp->Next;
delete temp;
temp=BigNum.Head;
}
}
//将大整数转化为二进制数,并不影响*this的值
void BigInteger::BigNumToIndex(int b[],int &count)
{
BigInteger BigNum=*this,temp2(2),temp;
count=0;
while (int(BigNum.Head->Num))
{
temp=BigNum%temp2;
b[count++]=int(temp.Head->Num);
BigNum=BigNum/temp2;
}
}
//正数
BigInteger BigInteger::operator ++()//重载++
{
BigInteger temp(1);
*this=*this+temp;
AdjustBigNum(*this);
return *this;
}
//正数
BigInteger BigInteger::operator --()//重载--
{
int i=1;
BigInteger temp;
temp.AddHead(char(i));
*this=*this-temp;
AdjustBigNum(*this);
return *this;
}
//大整数加运算,只能是两正整数,需要处理负数时转化为减法处理
BigInteger BigInteger::operator + (BigInteger BigNum2)//重载"+"
{
BigInteger result;
Node *temp1,*temp2;
int TempNum,rest=0;
temp1=this->End;//将临时链表首地址放置到输入链表的尾部
temp2=BigNum2.End;
while(temp1 && temp2)
{
TempNum=int(temp1->Num)+int(temp2->Num)+rest;//节点内元素相加并加上进位rest
if(TempNum>9)//判断相加结果是否会产生进位.
{
TempNum=TempNum-10;
rest=1;
}
else
rest=0;
result.AddHead(char(TempNum));//将结果放置到最终结果链表里
temp1=temp1->Prev;//将两个相加的链表前移一位
temp2=temp2->Prev;
}
if(temp2)
temp1=temp2;//处理两链表中剩下的部分
while(temp1)
{
int(TempNum)=int(temp1->Num)+rest;//节点内元素加上进位rest
if(TempNum>9)
{
TempNum=TempNum-10;
rest=1;
}
else
rest=0;
result.AddHead(char(TempNum));//将结果放置到最终结果链表里
temp1=temp1->Prev;
}
if(rest)
result.AddHead(char(rest));//考虑最后的进位是否存在,如果存在则存入链表的首部.
AdjustBigNum(result);
return result;
}
//a-b,要求a>=b,小-大时调成大-小再加负号,a、b中有负的要转为正的处理
BigInteger BigInteger::operator - (BigInteger BigNum2)//重载"-"
{
BigInteger BigNum1=*this,temp,result;
Node *temp1,*temp2;
bool flag;
int TempNum,rest=0;
if (int(BigNum1.Head->Num)<0&&int(BigNum2.Head->Num)<0)
{
BigNum2.Head->Num=char(int(BigNum2.Head->Num)*(-1));//转正
BigNum1.Head->Num=char(int(BigNum1.Head->Num)*(-1));//转正
temp=BigNum1;
BigNum1=BigNum2;
BigNum2=temp;
}
if (int(BigNum1.Head->Num)<0&&int(BigNum2.Head->Num)>0)
{
BigNum1.Head->Num=char(int(BigNum1.Head->Num)*(-1));//转正
result=BigNum2+BigNum1;
result.Head->Num=char(int(result.Head->Num)*(-1));//变负
return result;
}
if (int(BigNum1.Head->Num)>0&&int(BigNum2.Head->Num)<0)
{
BigNum2.Head->Num=char(int(BigNum2.Head->Num)*(-1));//转正
result=BigNum2+BigNum1;
return result;
}
if (Compare(BigNum1,BigNum2)==1)
{
temp1=BigNum1.End;//将临时链表首地址放置到输入链表的尾部
temp2=BigNum2.End;
flag=true;
}
else
{
temp1=BigNum2.End;//将临时链表首地址放置到输入链表的尾部
temp2=BigNum1.End;
flag=false;
}
while(temp1 && temp2)
{
TempNum=int(temp1->Num)-int(temp2->Num)+rest;//节点内元素相加并加上借位rest
if(TempNum<0)//判断相加结果是否会产生借位.
{
TempNum=10+TempNum;
rest=-1;
}
else
rest=0;
result.AddHead(char(TempNum));//将结果放置到最终结果链表里
temp1=temp1->Prev;//将两个相减的链表前移一位
temp2=temp2->Prev;
}
//处理两链表中剩下的部分
while(temp1)
{
int(TempNum)=int(temp1->Num)+rest;//节点内元素加上借位rest
if(TempNum<0)
{
TempNum=10+TempNum;
rest=-1;
}
else
rest=0;
result.AddHead(char(TempNum));//将结果放置到最终结果链表里
temp1=temp1->Prev;
}
if(rest)
{
result.Head->Num-=10;
}
AdjustBigNum(result);
if (!flag)
{
result.Head->Num=char(int(result.Head->Num)*(-1));
}
return result;
}
BigInteger BigInteger::operator * (BigInteger BigNum2)//对*进行重载
{
BigInteger BigNum1=*this,temp,result;
Node *temp1,*temp2,*tempa,*tempb;
bool flag=true;
int TempNum,rest,i=0,rest2;
int k;
if (int(BigNum1.Head->Num)*int(BigNum2.Head->Num)<0)
{
flag=false;
}
if (int(BigNum1.Head->Num)<0)
{
BigNum1.Head->Num=char(int(BigNum1.Head->Num)*(-1));
}
if (int(BigNum2.Head->Num)<0)
{
BigNum2.Head->Num=char(int(BigNum2.Head->Num)*(-1));
}
temp1=BigNum1.End;
temp2=BigNum2.End;
while(temp2)//由乘数的存在与否判断是否去乘被乘数的每个位
{
rest=0;
//对乘数中的每一位都逐一去乘被乘数
while(temp1!=NULL)
{
TempNum=int(temp1->Num)*int(temp2->Num)+rest;
if(TempNum>9)
{
rest=TempNum/10; //进位由相乘结果与10做商求得
TempNum=TempNum%10; //由相乘结果与10求模取个位
}
else
rest=0;
temp.AddHead(char(TempNum));//存入临时链表
temp1=temp1->Prev;
}
if(rest!=0)
temp.AddHead(char(rest));
for(k=i;k>=1;k--)
temp.AddEnd(char(0));//判断应该在链表后面补几个0
i++; //每次乘完后计数,用来下一次的补0
temp1=BigNum1.End;//把被乘数重新置到尾,用来让乘数下一次去乘每个元素
temp2=temp2->Prev;//将乘数取出链表的前驱
tempa=result.End;//下面进行的是将每次乘数与被乘数的相乘结果累加放到最终链表里等待输出
if(result.Head!=NULL)//下面过程与"+"重载基本一样,只是多了对临时链表的置空.
{
result.End=temp.Head;
result.Head=NULL;
}
tempb=temp.End;
rest2=0;
while(tempa!=NULL && tempb!=NULL)
{
TempNum=int(tempa->Num)+int(tempb->Num)+rest2;
if(TempNum>9)
{
TempNum=TempNum-10;
rest2=1;
}
else
rest2=0;
result.AddHead(char(TempNum));
tempa=tempa->Prev;
tempb=tempb->Prev;
}
if(tempb)
tempa=tempb;
while(tempa)
{
int(TempNum)=int(tempa->Num)+rest2;
if(TempNum>9)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -