?? 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 + -