📄 加密器view.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 + -