当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 模拟信息加密流程图简介

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

VC++ 中的 模拟信息加密流程图简介


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

模拟信息加密流程图简介

作者:Nie Yong

下载源代码

  Encryption_Demo 代码模拟了图一和图二的流程图内容,但仅仅只是模拟,谈不上什么应用;其应用过程限于程序间的传递过程,没有涉及到网络间数据传输,所以仅仅是模拟其过程而已。



图一 采用安全认证的信息加密流程图



图二 采用安全认证技术的信息解密过程图



图三 采用安全认证的信息加密流程图文字说明


图四 采用安全认证技术的信息解密过程图的文字说明

  Encryption_Demo 代码没有什么新奇之处。发布的目的在于使大家了解“采用安全认证的信息加密流程图”的运作过程。代码,大家可以下载看一看。下面我要说的是,最主要的工作体现在字节数组的偏移量的计算上。比如在本程序中采用MD5散列,其散列值固定长度16个字节;采用DES算法分组加密,其Key和IV字节数都为8个字节;采用RSA进行签名,签名长度固定为128个字节,而加密结果的长度呢,我们要加密的字节数组长度为128+8+8 = 144,那么RSA非对称加密后的字节数长度就为1152个字节长度。那么,在第一个流程图中,合并后的整个密文数据字节长度,我们知道不固定,可是它的第一部分和第三部分长度是固定的(再强调一次,我们这里使用DES分组加密算法,MD5散列函数,RSA方法签名和加密,下面分析结果也都是建立这基础上的)。比如:

加密后的会话密文 —— RsaEncryptData :1152
摘要签字 —— CombinData : 144
我们可以获得整个要截密文件的长度

string fileName = OpenFile("请打开要解密的文件:");FileStream fs = new FileStream(fileName,FileMode.Open,FileAccess.Read);

  (int)fs.Length - 1152-144 运算结果就是中间密文---EncryptionDate 的长度。解密中间密文后,紧接着就要处理时间戳啦。我们分析时间戳的字节数组组成吧:

文件散列长度 :16接收时间 :23签名长度 :128总共长度 :167

  既然知道这些字节数组的组成,你该知道怎么做了吧?关于处理接收时间戳的处理上,有点要注意的:

public static byte [] GetTimeNow(){	//这样转化成的格式为:2004-11-09 13:04:28-108 23个字节	DateTime now = DateTime.Now;	System.Text.UTF8Encoding utf = new System.Text.UTF8Encoding();	string month = null ;	if(now.Month<10)	month = "0"+now.Month.ToString();	else	month = now.Month.ToString();	string day = null;	if(now.Day<10)	day = "0" + now.Day.ToString();	else	day = now.Day.ToString();	string millisecond = null;	if(now.Millisecond<10)	millisecond = "00"+now.Millisecond.ToString();	if(now.Millisecond>=10&&now.Millisecond<=99)	millisecond = "0" + now.Millisecond.ToString();	if(now.Millisecond>=100)	millisecond = now.Millisecond.ToString();	string FullFormatTime = now.Year.ToString() + "-" + month + "-" + day + " " + now.ToLongTimeString() + "-" + millisecond ;	//比如:2004-11-09 13:04:28-108	return utf.GetBytes( FullFormatTime ); }	
  这样处理后的结果是接收时间精确到毫秒,且固定字节长度为23个字节。我们把第一个流程图的结果写进文件中去(其路径与你要加密的原始明文在同一目录下,主要是为了储存的方便),而流程图二的解密结果则保存在bin\Release目下。这样解密时需要读取文件,这里提供了两种方法,第一种把文件内容读取到一个数组里面,另外一种是需要时直接从文件中提取的指定的字节数组。第一种方法把文件内容读取到一数组,解密时分解数组,使用Buffer.BlockCopy( )函数分解既可。比如,从fileContent数组中偏移量1152处开始复制“length”长度字节复制到一个新的数组“Encrypt_Two”中去。
int length = (int)fs.Length-1296;// -1152-144 ; //密文的长度AllEncryptedDataEncrypt_Two = new byte[ length ];Buffer.BlockCopy(fileC