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

VC++
指向类成员
防止信号处理失灵
用转换操作符保护代码的安全
C++ 中重载 + 操作符的正确方法
删除托管对象,如何果包装一个库?及其它......
调用虚拟函数,持续化视图状态,POD 类型概念
关于volatile关键字的说明以及测试
C++/VC++编程的疑难问题及解答(二)
揭开C/C++中数组形参的迷雾
C++对象计数
实现真正意义上的二维动态数组模板
C语言和Fortran语言
C++中的 static 关键字
C++/VC++编程的疑难问题及解答
C/C++作用域引申出的编码规范
GRETA正则表达式模板类库
一个简单的链表模版类的实现
CString 操作指南
深入理解sizeof
源码统计器1.1版

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 106 ::
收藏到网摘: 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; >