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

📄 加密器view.cpp

📁 RSA的算法实现
💻 CPP
字号:
// 加密器View.cpp : implementation of the CMyView class
//

#include "stdafx.h"
#include "加密器.h"
#include"iostream.h"
#include "加密器Doc.h"
#include "加密器View.h"
#include"stdlib.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CString strFileName;
unsigned long d,n;
///////////////////////////////////////////////////////
/*以下是算法函数的申明和定义部分*/
unsigned long Bit[24];
/////////////////////////////////////////////////////
/*multimod*/
unsigned long MultiMod(unsigned long a,
					   unsigned long b,
					   unsigned long p)
{
	unsigned long result=0;
	//result=a*b%p;
	while(b>=100)
	{
		result=(result+(100*a)%p)%p;
		b-=100;
	}
	result=(result+(a*b)%p)%p;
	return result;
}
/*求两个整数的最大公约数*/
unsigned long GCD_Euclidean(unsigned long n1,//n1>n2
							unsigned long n2)
{
	unsigned long q,r;
	unsigned long g;
	r=1;
	for(;r!=0;)
	{
		q=n1/n2;
		r=n1%n2;
		if(r==0)g=n2;
		else
		{
			n1=n2;
			n2=r;
		}
	}
	return g;
}
/////////////////////////////////////////////////////////
/*求mod m 的逆元素算法*/
/*求u',s.t. uu'=1 mod m */
 unsigned long InverseModm(unsigned long u,
						   unsigned long m)
{
 long n1=(long)m;
 long n2=(long)u;
 long b1=0;
 long b2=1;
 long q,r;
	for(r=1;r;)
	{
		q=n1/n2;
		r=n1%n2;
		if(r)
		{
			n1=n2;
			n2=r;
			 long t=b2;
			b2=b1-q*b2;
			b1=t;
		}
	}
	if(n2!=1)
	{
		cout<<"不存在u的逆元!\n";
        exit(1);
	}
	if(b2<0)b2=b2+m;
	for(b2>(long)m;b2>(long)m;)b2-=m;
	unsigned long inverse=(unsigned long)b2;
	return inverse;
}
///////////////////////////////////////////////////////
/*模幂算法*/
unsigned long ModPowerP(unsigned long x,
					   unsigned long r,
					   unsigned long p)
{
	unsigned a,b,c;
	a=x;
	b=r;
	c=1;

	for(;b;)
	{
		while(!(b%2))
		{
			b/=2;
			a=MultiMod(a,a,p);
			//a=(a*a)%p;
		}
		b=b-1;
		c=MultiMod(a,c,p);
		//c=(a*c)%p;

	}
	return c;
}
/*求ModPowerP的数值*/

///////////////////////////////////////////////////
/*求负逆元*/ 
unsigned long MinusInverseModm(unsigned long u,
						       unsigned long m)
{
	unsigned long MinusInv;
	MinusInv=InverseModm( u,m);
	MinusInv*=-1;
	MinusInv+=m;
	return MinusInv;
}
///////////////////////////////////////////////////
/*下面程序标准分解合数p*/

void FactorizationP(unsigned long q[20],   //素因子
					unsigned long r[20],   //指数
					unsigned long p)       //待分解的合数
{
	int i=0;
	unsigned long temp=(p>>1);
	for(unsigned long x=2;x<=temp;x++)
	{
		if(!(p%x))
		{
		    q[i]=x;
			while(!(p%x))
			{
				
				(r[i])+=1;
				p/=x;
			}
			i++;
		}

	}

	
	cout<<"p=";
	for(int j=0;j<=(i);j++)
	{
		for(unsigned long k=1;k<=r[j];k++)
		{
			if(j==0&&k==1)cout<<q[j];
			else cout<<"*"<<q[j];
		}
		
	}
   
}
///////////////////////////////////////////////////
/*下面程序生成GF(p)的生成元*/
unsigned long GetFoundainElement(unsigned long prime)
{
	unsigned long q[20]; //素因子
	unsigned long r[20]; //素因子指数
	int flag=1;          //标志量
	unsigned long t=prime;
	unsigned long foundainelement;
	FactorizationP(q,r,t-1);
	t=prime;
	for(unsigned long g=1;g<=t-1,flag=1;g++)
	{
		for(int i=0;q[i]!=0;i++)
		{
			if(ModPowerP(g,(t-1)/q[i],t)==1)flag=0; 
		}
	    if(flag==1)foundainelement=g;	
	}
	
	return foundainelement;
}
///////////////////////////////////////////////////
/*下面程序生成伪随机素数*/
unsigned long GetRandomPrime()
{
	unsigned long prime;
	unsigned long primes[10];//存放10个素数
	unsigned long max=203;
	for(int i=0,unsigned long temp=max;i<10;temp--)
	{
		int flag=1;
		for(unsigned long half=2;half<(temp>>1);half++)
		{
			if(!(temp%half))flag=0;
		}
		if(flag){primes[i]=temp;i++;}
	}
	
	int random[10];
	for(int l=0;l<10;l++)
	{
		random[l]=rand();
	}

    unsigned long r=(random[0]+random[9])%10;
	prime=primes[r];
	return prime;
}
///////////////////////////////////////////////////
void GetRSAKey()
{
	unsigned long p,q; //两素数p,q
	p=GetRandomPrime();
	q=GetRandomPrime();
	unsigned long EulerFunctionN;
	n=p*q;             //n>(1<<25)
	EulerFunctionN=(p-1)*(q-1);
	
	unsigned long d=InverseModm(3,EulerFunctionN);
	

}

///////////////////////////////////////////////////
/*下面的程序可以将十进制数读为二进制位*/
void ReadByBit(unsigned long n,unsigned long m)    // n为待读整数,m为该整数二进制位数
{
	for(unsigned long i=m,unsigned long k=m-1;i>0;i--)
	{
		unsigned long c=1;
		c=(c<<(i-1));
		Bit[k]=n&c;
		Bit[k]=Bit[k]>>(i-1);
		//cout<<Bit[k];
		k--;
	}
	cout<<'\n';
	
}
///////////////////////////////////////////////////
////////////////下面程序提供MH背包公钥生成算法//////////

unsigned long GetMHKey(unsigned long B[24])
{
	//B是MH背包向量
	unsigned long A[24];//A是超递增背包向量
	////////////////以下生成超递增背包向量
	//cout<<"超递增背包向量为:";
	for(int i=0;i<24;i++)
	{
		A[i]=1<<(i);
		//cout<<A[i]<<'\t';
	}
	cout<<'\n';
	unsigned long p=(1<<24)+1;//此时,p>2*A[23];
	unsigned long Omega,Omegaba;
	do
	{
		Omega=GetRandomPrime();
	}while(GCD_Euclidean(Omega,p)!=1);

	Omegaba=InverseModm(Omega,p);
	cout<<"the Omega is:"<<Omega<<'\n';
	cout<<"the Omegaba is:"<<Omegaba<<'\n';
	for(int j=0;j<24;j++)//MH变换
	{
		//B[j]=(A[j]*Omega)%p;以下代码对该式进行重写,以防止数据溢出
		
		B[j]=0;    
		while(Omega>=512)
		{
			B[j]=(B[j]+(A[j]<<9)%p)%p;
			Omega-=512;
		}
		B[j]=(B[j]+(Omega*A[j])%p)%p;
			/////////////////////////////////
	}
	return Omegaba;
}

///////////////////////////////////////////////////
///////////////下面程序提供MH背包加密算法///////////////
unsigned long MHEncryptor(unsigned long Buff,unsigned long B[24])//buff为明文数据,B[24]为加密密钥,它是一个MH背包向量
{   //侦测MH背包向量
	//cout<<"MH背包向量为:";
	//for(int e=0;e<=23;e++)cout<<B[e]<<'\t';
	//cout<<'\n';
	//unsigned long Bit[24];
	ReadByBit(Buff,24);//把Buff里的数据读到Bit中
	Buff=0;
	//GetMHKey(B);
	for(int i=0;i<=23;i++)
	{
		Buff+=B[i]*Bit[i];

	}
    return Buff;

}
////////////////////////////////////////////////

/*下面程序提供MH背包解密算法*/
unsigned long MHDecryptor(unsigned long Buff,
						  unsigned long Omegaba,
						  unsigned long p)
{
	unsigned long Plaintext=0;
	//Ciphertext=(Buff*Omegaba)%p;  //以下代码重写该语句,以防止数据溢出
    //cout<<"the ciphertext is:"<<Buff<<'\n';
    //cout<<"P is :"<<p<<'\n';
    //cout<<"Omegaba is:"<<Omegaba<<'\n';
	/*while(Omegaba>=64)
	{
		Ciphertext=(Ciphertext+(Buff*64)%p)%p;
		Omegaba-=64;
	}
	Ciphertext=(Ciphertext+(Omegaba*Buff)%p)%p;
	*/
	Plaintext=MultiMod(Buff,Omegaba,p);
	cout<<" the Plaintext is:"<<Plaintext<<'\n';
	return Plaintext;
	/*
	unsigned long Plaintext[24],PT=0;
	for(int i=23;i>=0;i--)
	{
    
		if(Ciphertext>=(1<<i))
		{
           Plaintext[i]=1;
		}
        else Plaintext[i]=0;
		Ciphertext-=(1<<i);
    }
    if(Ciphertext=0)cout<< "此问题有解!\n";
    else cout<<"此问题无解!\n";
	for(int j=23;j>=0;j--)
	{
		PT+=Plaintext[i]*(1<<i);
	}
    Buff=PT;//将明文数据写回缓冲区
	*/

}
/////////////////////////////////////////////////////
/*下面程序提供RSA加密算法*/
unsigned long RSAEncryptor(unsigned long Buff,unsigned long e,unsigned long n)
{
	unsigned long Ciphertext;
	Ciphertext=ModPowerP(Buff,e,n);
	//Buff=Ciphertext;
	return Ciphertext;
}
///////////////////////////////////////////////////
/*下面程序提供RSA解密算法*/
unsigned long RSADecryptor(unsigned long Buff,unsigned long d,unsigned long n)
{
	unsigned long Plaintext;
	cout<<"the Ciphertext is:"<<Buff<<'\n';
	//Plaintext=ModPowerP(Buff,d,n);
	Plaintext=ModPowerP(Buff,d,n);
	//Buff=Plaintext;
    cout<<"the Plaintext is:"<<Plaintext<<'\n';
	return Plaintext;
	
}
/////////////////////////////////////////////////////////////////////////////
// CMyView

IMPLEMENT_DYNCREATE(CMyView, CView)

BEGIN_MESSAGE_MAP(CMyView, CView)
	//{{AFX_MSG_MAP(CMyView)
	ON_COMMAND(ID_ELGAMAL_DEFAULTKEY, OnElgamalDefaultkey)
	ON_COMMAND(ID_ELGAMAL_INPUTKEY, OnElgamalInputkey)
	ON_COMMAND(ID_MH_DEFAULTKEY, OnMhDefaultkey)
	ON_COMMAND(ID_MH_INPUTKEY, OnMhInputkey)
	ON_COMMAND(ID_OPENFILES_ASBINARY, OnOpenfilesAsbinary)
	ON_COMMAND(ID_OPENFILES_ASTEXT, OnOpenfilesAstext)
	ON_COMMAND(ID_RABIN_DEFAULTKEY, OnRabinDefaultkey)
	ON_COMMAND(ID_RABIN_INPUTKEY, OnRabinInputkey)
	ON_COMMAND(ID_RSA_DEFAULTKEY, OnRsaDefaultkey)
	ON_COMMAND(ID_RSA_INPUTKEY, OnRsaInputkey)
	ON_COMMAND(ID_FILES_SAVEAS, OnFilesSaveas)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyView construction/destruction

CMyView::CMyView()
{
	// TODO: add construction code here
	

}

CMyView::~CMyView()
{
}

BOOL CMyView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CMyView drawing

void CMyView::OnDraw(CDC* pDC)
{
	CMyDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	
	CFile MyFile;
	CString strOutput;
	int nLine=0;
	char ch=0;
	int Linelength=0;
	if(!MyFile.Open(strFileName,CFile::modeRead))
		return;
	
	while(MyFile.Read((void*)&ch,1)!=0)
	{
	        Linelength++;
			strOutput+=(char)ch;
			if(!(Linelength%76))
			{
			pDC->TextOut(2,nLine*16,strOutput);
			nLine++;
			strOutput="";
			}
		pDC->TextOut(2,nLine*16,strOutput);
	}
	MyFile.Close();
	/////////
	unsigned long Buff;
	//CFile Myfile1;
	CFile Myfile2;
    unsigned long plaintext=0,ciphertext=0;
	//GetRSAKey();
	///////////////////////////////////////////////////////////
	/*下列程序用Myfile1打开源文件,用Myfile2将密文写进密文文件*/
   // if(!Myfile1.Open(strFileName,CFile::modeRead))
	//	return;
	if(!Myfile2.Open("密文.txt",CFile::modeCreate|CFile::modeReadWrite))
		return;
   // while(Myfile1.Read((void*)&Buff,1)!=0)
	//{   
	//	plaintext=Buff;
	//	ciphertext=RSAEncryptor(plaintext,3,n);
	//	pDC->TextOut();
	//	Buff=ciphertext;
	//	Myfile2.Write((void*)&Buff,4);
	//}
//	Myfile1.Close();
	char testdata[]="study serve for delight,";
	
	Myfile2.Write(testdata,strlen(testdata));//strlen(testdata));
	Myfile2.Close();
	
	//pDC->TextOut(0,1,"file output test");
	
}

/////////////////////////////////////////////////////////////////////////////
// CMyView printing

BOOL CMyView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CMyView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CMyView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CMyView diagnostics

#ifdef _DEBUG
void CMyView::AssertValid() const
{
	CView::AssertValid();
}

void CMyView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CMyDoc* CMyView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
	return (CMyDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyView message handlers

void CMyView::OnElgamalDefaultkey() 
{
	// TODO: Add your command handler code here
	
}

void CMyView::OnElgamalInputkey() 
{
	// TODO: Add your command handler code here
	
}

void CMyView::OnMhDefaultkey() 
{
	// TODO: Add your command handler code here
	
}

void CMyView::OnMhInputkey() 
{
	// TODO: Add your command handler code here
	
}

void CMyView::OnOpenfilesAsbinary() 
{
	// TODO: Add your command handler code here
	
}

void CMyView::OnOpenfilesAstext() 
{
	// TODO: Add your command handler code here
	CFileDialog opentext(true);
	if(opentext.DoModal())strFileName=opentext.GetPathName();
	Invalidate(1);
	
}

void CMyView::OnRabinDefaultkey() 
{
	// TODO: Add your command handler code here
	
}

void CMyView::OnRabinInputkey() 
{
	// TODO: Add your command handler code here
	
}

void CMyView::OnRsaDefaultkey() 
{
	// TODO: Add your command handler code here
	
}

void CMyView::OnRsaInputkey() 
{
	// TODO: Add your command handler code here
	
}

void CMyView::OnFilesSaveas() 
{
	// TODO: Add your command handler code here
	CString EXTNAME="*.rsa";
	CFileDialog filesave(FALSE,EXTNAME,"密文",NULL,"*.RSA|*.rsa",NULL);
	filesave.DoModal();
	
}

⌨️ 快捷键说明

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