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

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

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


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