www.pudn.com > secretshare_VC++.rar > SecretShareDlg.cpp


// SecretShareDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "SecretShare.h" 
#include "SecretShareDlg.h" 
 
#include 
#include  
#include 
#include 
#include 
#include 
#include 
 
#include 
using namespace std;  
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
const DATALENGTH=270;   //大数类型的长度 
const MLENGTH=50;       //质数的长度 
const TESTNUM=10;       //测试质数时的比较的次数 
const DATANUM=20;       //二维大数的长度 
 
typedef unsigned char byteint[DATALENGTH];   //定义大数类型 
typedef unsigned char byteint2[DATANUM][DATALENGTH];//定义二维大数类型 
typedef unsigned char mtype[MLENGTH];        //定义质数的大数类型 
 
    long int i; 
	int n,j,l,th,flag1=0; 
	int r[50],sign[50]; 
    CString Q; 
	//string Key; 
    char maink[100]; 
    byteint2 X,Y; 
    byteint temp,temp5,temp1,temp2,temp3,temp4,key,lagrange1,lagrange2,lagrange;  
    byteint2 factor; 
 
    byteint p;  
	byteint ONEVALUE; 
	byteint ZEROVALUE; 
	byteint TWOVALUE; 
	mtype Model[TESTNUM];  //TESTNUM big number to be compared 
	mtype mZEROVALUE,tempModel;  //0 constant 
	byteint EIGHTVALUE; //O,1,2,8 constant 
	CString R; 
	signed char flag[300]; 
 
 
void SetZero(byteint A);                 //将大数A清零 
	int IntValid(byteint validtemp);         //返回大数validtemp的非零位的个数 
	void IntCpy(byteint A1,byteint B1);      //将大数B1的值拷贝到大数A1中	 
	int IntCmp(byteint A,byteint B);         //比较大数A和B是否相等 
void Plus(byteint A,byteint B,byteint C);             //C=A+B 
	void Substract(byteint SA,byteint SB,byteint SC);     //SC=SA-SB 
	void Multiply(byteint A,byteint B,byteint C);         //C=A*B 
	void Division(byteint A,byteint B,byteint C,byteint D);//C=A%B 
	int PowerMode(byteint A,byteint C,byteint D,signed char flag[300]);//computing A^B mod C-->D	 
	void IntRandom(byteint RandomA,int num);                //随机产生一个大数 
	void LoadInt(byteint A,mtype B);                        //将质数类型转换为大数类型 
	void TransBi(byteint B,signed char flag[300]);          //将大数B转换为二进制形式 
	void Mdata(int len);                                           //产生用于生成质数中进行比较的数 
	void RandomData(byteint2 tmp,int n,int len); 
	void Power(byteint A,byteint B,int n); 
	int Prime(byteint Prm,int len);  
	CString PrtInt(byteint A);                              //将一个大数A转换为相应的字符串形式	 
    //CString InttoStr(mtype A); 
///////////////////////////////////////////////////////////////////////////// 
// 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) 
	//}}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() 
 
///////////////////////////////////////////////////////////////////////////// 
// CSecretShareDlg dialog 
 
CSecretShareDlg::CSecretShareDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CSecretShareDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CSecretShareDlg) 
	str_edit = _T(""); 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CSecretShareDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CSecretShareDlg) 
	DDX_Control(pDX, IDC_Prime, edit1); 
	DDX_Control(pDX, IDC_Rkey_Out, m_edit); 
	DDX_Control(pDX, IDC_SLIST, list_right); 
	DDX_Control(pDX, IDC_LIST, list_left); 
	DDX_Text(pDX, IDC_Prime, str_edit); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CSecretShareDlg, CDialog) 
	//{{AFX_MSG_MAP(CSecretShareDlg) 
	ON_WM_SYSCOMMAND() 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_BN_CLICKED(IDC_CONFIRM, OnConfirm) 
	ON_BN_CLICKED(IDC_Xuanze, OnXuanze) 
	ON_BN_CLICKED(IDC_Rkey, OnRkey) 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CSecretShareDlg message handlers 
 
BOOL CSecretShareDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Add "About..." menu item to system menu. 
 
	// IDM_ABOUTBOX must be in the system command range. 
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); 
	ASSERT(IDM_ABOUTBOX < 0xF000); 
 
	CMenu* pSysMenu = GetSystemMenu(FALSE); 
	if (pSysMenu != NULL) 
	{ 
		CString strAboutMenu; 
		strAboutMenu.LoadString(IDS_ABOUTBOX); 
		if (!strAboutMenu.IsEmpty()) 
		{ 
			pSysMenu->AppendMenu(MF_SEPARATOR); 
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); 
		} 
	} 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// TODO: Add extra initialization here 
	 
	return TRUE;  // return TRUE  unless you set the focus to a control 
} 
 
void CSecretShareDlg::OnSysCommand(UINT nID, LPARAM lParam) 
{ 
	if ((nID & 0xFFF0) == IDM_ABOUTBOX) 
	{ 
		CAboutDlg dlgAbout; 
		dlgAbout.DoModal(); 
	} 
	else 
	{ 
		CDialog::OnSysCommand(nID, lParam); 
	} 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CSecretShareDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CSecretShareDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
/*--------------------------------------------------------------------------- 
功能:产生一个质数 
入口参数:大数Prm 
返回值:产生成功,返回0 
----------------------------------------------------------------------------*/ 
int Prime(byteint Prm,int len) 
{ 
 
	int i,k,ok;	 
	signed char flag[300]; 
	byteint A,B,C,buf1,buf2; 
	SetZero(A); SetZero(B); SetZero(C); SetZero(buf1); SetZero(buf2);	 
	 
	IntRandom(Prm,len);                //随机产生一个大数B  try b if prime,B是一个奇数	 
	SetZero(ONEVALUE);                      //对大数变量ONEVALUE进行清零 
	ONEVALUE[DATALENGTH-1]=1;				//ONEVALUE的最后一位为1 
	while(1)                                 //一直循环直到找到一个素数为止 
	{	 
	//	IntRandom(Prm,MLENGTH);  
		ok=1; 
		IntCpy(B,Prm);                       //将Prm拷贝到B中 C=N result prime 
	    Substract(B,ONEVALUE,buf1);          //将B-ONEVALUE的结果放到buf1中 
	    Division(buf1,TWOVALUE,buf2,B);       //B=(B-1)/2的商,buf2=(B-1)/2的余数=0 
	    TransBi(B,flag);                     //将B转换为二进制大数	     
	    for(i=0;iC 
			//cout<B:return 1 ; A=B:return 0 ; A0) 
		return 1; 
	return -1; 
} 
/*--------------------------------------------------------------------------- 
功能:A+B的结果送C 
入口参数:大数A,B,C 
返回值:无 
----------------------------------------------------------------------------*/ 
void Plus(byteint A,byteint B,byteint C) 
{ 
	register i; 
	int X,Y,Z,m,n,valid; 
	m=IntValid(A);                 //计算A的长度          
	n=IntValid(B);                 //计算B的长度 
	valid=(m>=n)?m+1:n+1;           //计算时要以最长的数为准 
	SetZero(C);                    //将C清零 
	for(i=DATALENGTH-1;i>=DATALENGTH-valid;i--) 
	{ 
		X=A[i]+B[i];               //按位相加 
		Y=X/10; 
		Z=X-10*Y; 
 
		C[i]=C[i]+Z;               //计算进位 
		if(C[i]==10) 
		{C[i]=0;C[i-1]=1;} 
		C[i-1]=C[i-1]+Y; 
	} 
//	if(C[i+1]=10) 
//	{	C[i+1]=0;C[i]=1;} 
} 
 
/*--------------------------------------------------------------------------- 
功能:大数SA减去大数SB,结果放入SC 
入口参数:被减数SA,减数SB,差SC 
返回值:无 
----------------------------------------------------------------------------*/ 
void Substract(byteint SA,byteint SB,byteint SC) 
{ 
	byteint buf; 
	register i,j; 
	int X; 
	IntCpy(buf,SA);                  //将SA的内容拷贝到buf中 
	SetZero(SC);                 //SC清零初始化 
	for(i=DATALENGTH-1;i>=0;i--)	 
	{ 
		if(buf[i]0)           //如果高位够减,直接减1 
				(buf[i-1])--;     
			else                     //否则一直找到够减的位 
			{ 
				j=i-1; 
				while(buf[j]==0)     //j不会出现越界,是因为保证了最高位不为0 
					buf[j--]=9; 
				buf[j]=buf[j]-1; 
			} 
		} 
		X=buf[i]-SB[i];              //将各位减的结果存入SC中 
		SC[i]=X; 
	} 
} 
 
/*--------------------------------------------------------------------------- 
功能:大数A与大数B相乘,结果放入C中 A×B->C 
入口参数:被乘数A和乘数B,结果C 
返回值:无 
----------------------------------------------------------------------------*/ 
void Multiply(byteint A,byteint B,byteint C) 
{ 
	register i,j,w; 
	int X,Y,Z; 
	int Avalid=0;								//Avalid=validating bits of A 
	int Bvalid=0;								//Avalid=validating bits of B 
	while (A[Avalid]==0 && Avalid=Avalid;i--) 
		for(j=DATALENGTH-1;j>=Bvalid;j--)       //逐位进行相乘运算 
		{ 
			X=A[i]*B[j];         
			Y=X/10; 
			Z=X-10*Y; 
			w=i+j-(DATALENGTH-1); 
			C[w]=C[w]+Z; 
			C[w-1]=C[w-1]+(C[w]/10)+Y;         //加进位 
			C[w]=C[w]-(C[w]/10)*10;            //减进位 
		} 
	return; 
} 
 
/*--------------------------------------------------------------------------- 
功能:计算大数A÷B的结果,余数放在C中,商在D中 
入口参数:被除数A,除数B,余数C,商D 
返回值:无 
----------------------------------------------------------------------------*/ 
void Division(byteint A,byteint B,byteint C,byteint D) 
{ 
	register i,j,m; 
	int valid_1,valid_2,valid,sbits,cmpval; 
	byteint buf1,buf2; 
     
	SetZero(buf1);  SetZero(buf2); 
	SetZero(D);                       //将大数D进行清零初始化 
    IntCpy(C,A);                      //将被除数A拷贝到C中 
	valid_2=IntValid(B);              //计算B(除数)的位数, 
//	int ii=1; 
	while((cmpval=IntCmp(C,B))>0)     //变除法为减法,每减一次就判断是否有C>B,如果满足就继续减。 
	{//	cout<0)                   //如果被除数比除数的位数多 
		{ 
			i=DATALENGTH-valid_1;     //被除数前导零的个数 
			j=DATALENGTH-valid_2;     //除数前导零的个数,作下标指示器 
			sbits=0; 
			for(m=j;mB[j])         //从C和B的最高位开始依次比较对应位的大小,判断是否够减 
					break; 
				if(C[i]0)                   //循环拷贝各位数字 
	{ 
		A[i--]=B[j--]; 
	} 
} 
 
/*--------------------------------------------------------------------------- 
功能:该函数用来从集合[1,b-1]中产生若干个用于检测的数,存放在Model[]中 
入口参数:无 
返回值:无 
----------------------------------------------------------------------------*/ 
void Mdata(int len) 
{ 
	register i,j;    
	byteint q; 
	CString Q; 
	SetZero(q);//Randomly choose a set of 10 numbers in [1,b-1] 
	int k=len-2; 
	memset(Model,0,TESTNUM*len);  //这个函数在这里用来将整个数组清零,进行初始化 
	srand( (unsigned)time( NULL ) );  //进行随机函数的初始化 
	for(i=0;i=k;j--) 
		{ 
			Model[i][j]=rand()%10;    //注意这里与测试素数的程序中的区别, 
			 
		} 
		if((memcmp(Model[i],mZEROVALUE,len))==0)   
			i--; 
		k--;                          //保证所产生的数不为0 
		if (k<0) k=len-2; 
		 
	 
	} 
	 
} 
 
/*--------------------------------------------------------------------------- 
功能:该函数用来将十进制的大整数转换成二进制的数 
入口参数:需转换的大数B,二进制结果flag[300] 
返回值:无 
----------------------------------------------------------------------------*/ 
void TransBi(byteint B,signed char flag[300]) 
{ 
	byteint buf; 
	byteint result; 
	byteint temp; 
	register i; 
	SetZero(buf);  SetZero(result);  SetZero(temp); 
	memset(flag,0,300);                     //将flag数组清零 
 
	i=299; 
	IntCpy(buf,B);                          //将B拷贝到buf中 
	while(IntCmp(buf,ZEROVALUE)==1)         //如果buf内容为0 
	{ 
		Division(buf,TWOVALUE,temp,result);  //将buf进行大数的模2运算,商在result中,余数temp 
		flag[i]=temp[DATALENGTH-1];          
		IntCpy(buf,result);                 //对商继续进行模2运算 
		i--; 
	} 
	flag[i]=-1;                             //设置一个标志位,表明二进制数的开始 
} 
 
/*--------------------------------------------------------------------------- 
功能:该函数用来进行模幂算法,A为底数,模为c,二进制的指数B存放在数组flag中 
入口参数:底数A,模C,结果D,二进制质数flag[300] 
返回值:A^B=1(mod C),返回1;A^B=p-1(mod C),返回2;否则返回0 
----------------------------------------------------------------------------*/ 
int PowerMode(byteint A,byteint C,byteint D,signed char flag[300]) 
{ 
	byteint buf; 
	byteint result; 
	byteint temp,P; 
	register i; 
	SetZero(D);   SetZero(buf); SetZero(result); SetZero(temp); SetZero(P);  //将D清零 
 
	IntCpy(temp,A);                       //将A的值拷贝到temp中 
	if(flag[299]==1)                      //最低位为1,拷贝本身,flag[i]只有1或者0两种情况 
		IntCpy(result,A); 
	else								  //最低位为0,则幂为1 
		IntCpy(result,ONEVALUE); 
	i=298; 
	while(flag[i]!=-1)                    //判断是否已经到达指数尽头 
	{ 
	    //Sqrt(temp,buf);          //temp*temp->buf  
		//SetZero(temp); 
		//temp[168]=4; 
	//	temp[169]=2; 
		Power(temp,buf,2); 
		Division(buf,C,temp,P);            //buf%c余数->temp,商->p 
		if(flag[i]!=0)                    //如果该位不是0,则将其和前一步低一位的结果进行乘法运算 
		{                                 //否则,将其作为该位的模,在高一位的运算中,只要进行一次 
			Multiply(temp,result,buf);    //平方运算,就可以得到高一位的模 
			Division(buf,C,result,P); 
		} 
		i--; 
	}                                     //result中存放的是最终结果 
	IntCpy(buf,C); 
	IntCpy(D,result); 
	Substract(buf,ONEVALUE,temp); 
	if(IntCmp(result,ONEVALUE)==0)        //p mod n=1,判断是否有A^B=1(mod C) 
		return 1; 
	if(IntCmp(result,temp)==0)            //p mod n=-1[p-1=-1(mod p)],判断是否有A^B=p-1(mod C) 
		return 2; 
	return 0; 
} 
 
/*--------------------------------------------------------------------------- 
功能:随机地产生一个大数奇数,长度为num,最高位不是0,存放在RandomA中 
入口参数:大数A,长度num 
返回值:无 
----------------------------------------------------------------------------*/ 
void IntRandom(byteint RandomA,int num) 
{ 
	int i; 
	SetZero(RandomA);                     //将RandomA清零 
	srand( (unsigned)time( NULL ) );      //时间种子初始化 
	 
	while(!(RandomA[DATALENGTH-1]%2))     //判断条件保证RandomA的最后一位数是奇数 
		RandomA[DATALENGTH-1]=rand()%10;  //如果最后一位是偶数,则从新产生最后一位 
    while(!(RandomA[DATALENGTH-num]))     //判断条件保证RandomA最高位不是0 
		RandomA[DATALENGTH-num]=rand()%10;//如果最高位是0,则从新产生最高位 
 
	i=DATALENGTH-2; 
	while(i>=DATALENGTH-num+1)            //循环产生从次低位开始到次高位的所有位上的数 
		RandomA[i--]=rand()%10; 
} 
/*--------------------------------------------------------------------------- 
功能:得到一个大数的非零位数 
入口参数:大数validtemp 
返回值:大数中非零的位数 
----------------------------------------------------------------------------*/ 
int IntValid(byteint validtemp) 
{ 
	register i=0; 
	while(validtemp[i]==0 && i=k;j--) 
		{ 
			Model[i][j]=rand()%10;    
			 
		} 
		if((memcmp(Model[i],mZEROVALUE,len))==0)   
			i--; 
		k--;                          //保证所产生的数不为0 
		if (k<0) k=len-2; 
 
 
		 SetZero(tmp[i]); 
 
		for(j=len-1;j>=0;j--)	 
    	tmp[i][DATALENGTH-j-1]=int(Model[i][j]); 
 
		//if(q[DATALENGTH-j-1]>=p[DATALENGTH-j-1]) 
         // q[DATALENGTH-j-1]=p[DATALENGTH-j-1]-1; 
		 for(q=0;qGetWindowText(n_str); 
    pwnd=(CWnd*)GetDlgItem(IDC_K); 
	CString k_str; 
	pwnd->GetWindowText(k_str); 
	pwnd=(CWnd*)GetDlgItem(IDC_KEY); 
	CString key_str; 
	pwnd->GetWindowText(key_str); 
    n = atoi(n_str.GetBuffer(0)); 
	th = atoi(k_str.GetBuffer(0)); 
    for(int i=0;iAddString((LPCTSTR)Q); 
  cout<ResetContent(); 
 for(i=0;iAddString((LPCTSTR)Q); 
   Q=PrtInt(Y[i]); 
   str=str+"----"+Q; 
   pwnd1->AddString((LPCTSTR)str); 
} 
cout<3) 
    flag1=2; 
    //temp1[DATALENGTH-1]++; 
	IntCpy(lagrange,temp1); 
	SetZero(temp1); 
    SetZero(temp3); 
    Division(lagrange,p,temp3,temp1); 
	IntCpy(lagrange,temp3); 
    if(flag1==2) 
	Plus(temp3,ONEVALUE,lagrange);	 
    Q=PrtInt(lagrange); 
	m_edit.SetWindowText((LPCTSTR)Q); 
	 
}