当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 轻松实现DES算法查看器

VC++
使用免费界面换肤软件 USkin
Cell插件在J2EE系统中的应用
采用MFC编制MVC模式之球体演示程序
托管资源全攻略
使用 MFC 编写打印程序
根据所选择的 TrueType 字体生成点阵数据
让你的软件界面更漂亮(四):不完美之菜单
VC界面的实现
让你的软件界面更漂亮(三)
分割窗口后如何限制分割条的移动范围
关于 CFileDialog 对话框多选功能的一个问题
让你的软件界面更漂亮(二)
对话框模板,RegexTest
让你的软件界面更漂亮(一)
利用窗口子类化隐藏系统图标
KVIP考勤系统
类似于FlashGet的悬浮框的制作
计算MDI子窗口数,仅显示文件夹的打开对话框
智能ABC窗口的实现
在打开文件对话框上实现图象预览

VC++ 中的 轻松实现DES算法查看器


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 108 ::
收藏到网摘: n/a

轻松实现DES算法查看器

作者:小帅

下载源代码


  DES(Data Encrypton Standard) 算法的实现网上已经有很多,本人在此讲述的是在DES算法加密过程中如何查看16迭代过程中生成的Ki,Li,Ri,Fi,Si等,这样可以当做一个DES加密对照器,这样可以方便的发现你在加密过程中出现的错误!



图一:程序运行界面

  本程序用了一个列表框来显示所有16次迭代的所有信息,并在选择一栏后,在下面的编辑框中显示详细信息,这样就可以不必在列表框中拖曳鼠标,这样方便拷贝!

程序介绍:
采取的编程语言是微软的VC6.0,大小为184K!实现了简易的DES加密查看功能!功能介绍:
1:编辑框1:输入明文,只允许8位的ASCII码,不允许输入中文;
2:编辑框2:输入密钥,只允许8位的ASCII码,不允许输入中文;
3.加密按钮:对明文加密,并在下面显示加密后的二进制和ASCII码;
4.对每次加密解密显示 Ki, Li, Ri, Fi, Si的值;
5.对列表框的点击将会详细显示如下信息:
Ki:加密过程中产生的子密钥,共16个,每个48位
Li:加密过程中产生的子密钥,共16个,每个32位
Ri:加密过程中产生的子密钥,共16个,每个32位
Fi:加密过程中产生的子密钥,共16个,每个32位
Si:加密过程中产生的S值,共8个,每个大小为0~15
下面就由本人详细介绍在实现加密过程中需要注意的一些问题:

  在程序一开始的时候,我们需要在OnInitDialog这个函数内做一些初始化操作,对列表框的操作如下,让其显示条形,并插入要显示的项目:

////////////////////////////////////////////////////////////////////////CenterWindow(GetDesktopWindow());	::SendMessage(m_listdata.m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE,	LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES,	LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);	m_listdata.InsertColumn(0,"NO.",LVCFMT_LEFT,30);	m_listdata.InsertColumn(1,"L0",LVCFMT_LEFT,40);	m_listdata.InsertColumn(2,"R0",LVCFMT_LEFT,40);	m_listdata.InsertColumn(3,"F函数值",LVCFMT_LEFT,60);	m_listdata.InsertColumn(4,"密钥Ki",LVCFMT_LEFT,50);	m_listdata.InsertColumn(5,"S盒",LVCFMT_LEFT,45);////////////////////////////////////////////////////////////////////////
  加密的过程中,需要对明文和密文检测,是否含有无法加密的字符,如中文字符,或者是否满足8位这个条件(本人并未对数据做未满8位以0补的处理):
//////////////////////////////////////////////////////////////////////////	// 对输入的数据进行验证	if(m_old.GetLength()!=8)	{	MessageBox("请输入8位明文", "友情提示");	return;	}	if(m_key.GetLength()!=8)	{	MessageBox("请输入8位密文", "友情提示");	return;	}
对明文处理,将对应的ASCII码转化为二进制,并对中文字符的判断:
//////////////////////////////////////////////////////////////////////////	/// 此处对明文处理,将对应的ASCII码转化为二进制	int flag=true;	for(int i=0; i<8; i++)	{	char ch=m_old.GetAt(i);	if(ch&0x80&&flag)	{	MessageBox("含有中文字符,加密错误不负责任!", "友情提示");	flag=false;	//return;	}	memset(tmp, 0, 8);	for(int j=0; j<8; j++)	{	tmp[j]=(ch%2+2)%2;	ch/=2;	}	for(j=7; j>=0; j--)	{	old[i*8+7-j]=tmp[j];	}	}	
为了实现加密解密迭代算法的共享,本人做了如下处理:
	/// 此处开始16迭代算法	isDecrypt=false;	for(i=1; i<=16; i++)	{	CDESDlg::Iterate(i);	}
在16次迭代算法中,大部分操作是重复的,所以采取了上述的做法!在这里,本人把迭代算法的代码全部写在这里:
void CDESDlg::Iterate(int numOfIteration){	//////////////////////////////////////////////////////////////////////////	/// 此处迭代生成子密钥ki	int j=2;	// 移位次数	if(	numOfIteration==1||numOfIteration==2||	numOfIteration==9||numOfIteration==16)	{	j=1;	}	//////////////////////////////////////////////////////////////////////////	//如果为解密,迭代移位的次序变换相反方向	if(isDecrypt)	{	if(numOfIteration==16)	{	j=0;	}	else if(numOfIteration==15||numOfIteration==8||numOfIteration==1)	{	j=-1;	}	else	{	j=-2;	}	}	// 省略此部分代码.......	// 生成子密钥Ki,存储到数组k1[48]中去	//////////////////////////////////////////////////////////////////////////	// 将Ri-1扩充成48位并与Ki相加并模2	memset(re, 0, 48);	for(i=0; i<48; i++)	{	re[i]=(R0[E_Table[i]-1]+k1[i])%2; >