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

📄 rc4.cpp

📁 RC4加密
💻 CPP
字号:
// RC4.cpp : implementation file
//

#include "stdafx.h"
#include "cryptology.h"
#include "RC4.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CString R;
/////////////////////////////////////////////////////////////////////////////
// RC4 property page

IMPLEMENT_DYNCREATE(RC4, CPropertyPage)

RC4::RC4() : CPropertyPage(RC4::IDD)
{
	//{{AFX_DATA_INIT(RC4)
	m_ciphertext = _T("");
	m_key = _T("");
	m_plaintext = _T("");
	m_word = _T("");
	//}}AFX_DATA_INIT
}

RC4::~RC4()
{
}

void RC4::DoDataExchange(CDataExchange* pDX)
{
	CPropertyPage::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(RC4)
	DDX_Text(pDX, IDC_CIPHERTEXT, m_ciphertext);
	DDX_Text(pDX, IDC_KEY, m_key);
	DDX_Text(pDX, IDC_PLAINTEXT, m_plaintext);
	DDX_Text(pDX, IDC_YUANWEN, m_word);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(RC4, CPropertyPage)
	//{{AFX_MSG_MAP(RC4)
	ON_BN_CLICKED(IDC_ENCRY, OnEncry)
	ON_BN_CLICKED(IDC_DECRY, OnDecry)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// RC4 message handlers

void RC4::OnEncry() 
{
UpdateData ( true ) ;
	
	m_ciphertext="";
	
	int S[260],T[260];
	int i,j=0,kenlen;
	int a,n,t,l=0;
	char k;
	
	kenlen=strlen ( m_key);
	if(kenlen>256)
	{
		AfxMessageBox("Please input the key from 1 to 256 bytes!");
		return;
	}
	
    a=strlen ( m_plaintext);
	
	for(i=0;i<=255;i++)
	{
		S[i]=i;
		T[i]=m_key[i%kenlen];
	}
	
	for(i=0;i<=255;i++)
	{
		j=(j+S[i]+T[i])%256;
		n=S[i];
		S[i]=S[j];
		S[j]=n;
	}
	
	i=0;
	j=0;
	
	
	while(l<a)
		
	{
		i=(i+1)%256;
		j=(j+S[i])%256;
		n=S[i];
		S[i]=S[j];
		S[j]=n;
		t=(S[i]+S[j])%256;
		k=S[t];
		R.Format("%c",( k^m_plaintext[l])) ;
		m_ciphertext+=R;
		l++;
	}
	
	
	UpdateData ( false ) ;

	if(MessageBox("是否保存密文?",NULL,MB_OKCANCEL)==IDOK)
	{
		SaveFile();
	}
	
}

void RC4::OnDecry() 
{
UpdateData ( true ) ;
	m_word="";
	
	int S[260],T[260];
	int i,j,kenlen;
	int a,n,t,l=0;
	char k;
	
	kenlen=strlen ( m_key);
	
	if(kenlen>256)
	{
		AfxMessageBox("Please input the key from 1 to 256 bytes!");
		return;
	}
	
    a=strlen ( m_ciphertext);
	
	for(i=0;i<=255;i++)
	{
		S[i]=i;
		T[i]=m_key[i%kenlen];
	}
	
	j=0;
	for(i=0;i<=255;i++)
	{
		j=(j+S[i]+T[i])%256;
		n=S[i];
		S[i]=S[j];
		S[j]=n;
	}
	
	i=0;
	j=0;
	
	
	while(l<a)
		
	{
		i=(i+1)%256;
		j=(j+S[i])%256;
		n=S[i];
		S[i]=S[j];
		S[j]=n;
		t=(S[i]+S[j])%256;
		k=S[t];
		R.Format("%c",( k^m_ciphertext[l])) ;
		m_word+=R;
		l++;
	}
	
	
	UpdateData ( false ) ;		
}

void RC4::SaveFile()
{
     	CFileDialog dlg(false);
	if(dlg.DoModal()==IDOK)
	{
		m_filename=dlg.GetPathName();
		int len=m_filename.GetLength();
		char *filename=new char[len];
		filename=m_filename.GetBuffer(len);
		m_file.Open(filename,CFile::modeWrite |CFile::modeCreate);
		
		len=m_ciphertext.GetLength();
		char *buf=new char[len];
		
		buf=m_ciphertext.GetBuffer(len);
		
		m_file.Write(buf,len);
		
		m_file.Close();
	}
}

⌨️ 快捷键说明

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