模仿信息加密流程图简介
副标题#e#
Encryption_Demo 代码模仿了图一和图二的流程图内容,但仅仅只是模仿,谈不上什么应用;其应用进程限于措施间的通报进程,没有涉及到网络间数据传输,所以仅仅是模仿其进程罢了。
图一 回收安详认证的信息加密流程图
图二 回收安详认证技能的信息解密进程图
图三 回收安详认证的信息加密流程图文字说明
图四 回收安详认证技能的信息解密进程图的文字说明
Encryption_Demo 代码没有什么新奇之处。宣布的目标在于使各人相识“回收安详认证的信息加密流程图”的运作进程。代码,各人可以下载看一看。下面我要说的是,最主要的事情表此刻字节数组的偏移量的计较上。好比在本措施中回收MD5散列,其散列值牢靠长度16个字节;回收DES算法分组加密,其Key和IV字节数都为8个字节;回收RSA举办签名,签名长度牢靠为128个字节,而加密功效的长度呢,我们要加密的字节数组长度为128+8+8 = 144,那么RSA非对称加密后的字节数长度就为1152个字节长度。那么,在第一个流程图中,归并后的整个密文数据字节长度,我们知道不牢靠,但是它的第一部门和第三部门长度是牢靠的(再强调一次,我们这里利用DES分组加密算法,MD5散列函数,RSA要领签名和加密,下面阐明功效也都是成立这基本上的)。好比:
#p#副标题#e#
加密后的会话密文 —— 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 ; //密文的长度AllEncryptedData
Encrypt_Two = new byte[ length ];
Buffer.BlockCopy(fileContent,1152,Encrypt_Two,0,length);
而回收第二种要领:
Encrypt_One = new byte[1152];
fs.Read(Encrypt_One,0,1152);
这样直接从文件流开始位置读取 1152 个字节到数组“Encrypt_One”中。但假如要提取字节不是从起点开始,那就需要配置文件流的位置:
#p#分页标题#e#
//读取加密的明文
int length = (int)fs.Length-1296;// -1152-144 ; //密文的长度 AllEncryptedData
Encrypt_Two = new byte[ length ];
fs.Position = 1152 ; //文件流偏移位置了1152个字节
fs.Read(Encrypt_Two,0,length);
留意了fs.Read()要领内参数的暗示啦,而这样表达:fs.Read(Encrypt_Two,length,length),措施会陈诉文件偏移量呈现错误。
需要说明的是,在设计代码时,把主窗体措施所能利用到的成果都封装到一个类内里,且所有被利用到的函数都是静态范例,便于利用上的利便。测试措施,需要用到三对钥匙:发送者(A)、吸收者(B)和时间戳处事器(DTS)的各自的私钥和公钥。基于流程图一,你利用时间戳服
务器私钥一次,A的私钥两次,B的公钥一次。基于流程图二,你利用时间戳处事器公钥一次,A的公钥两次,B的私钥一次。至于测试所用到钥匙,你可以在压缩包Encryption Demo\bin\Release目次可以看到三个文件夹,内里别离存放着发送者(A)、吸收者(B)和时间戳处事器(DTS)的各自的钥匙。虽然你也可以本身生成钥匙,点击“发生一对钥匙”按钮,见下图:
那么发生的钥匙你可以在措施的bin\Release目次下找到。那么怎么利用本措施呢,你可以利用已经筹备好的三对公钥,凭据下图图示即可:
1、“打开文件”—选择你要加加密的文件,点击下面的“提交到DTS处事中心…”按钮。
2、点击选项卡“加密步调二”,直接点下面的按钮“开始以上步调”,这中间会要求你打开钥匙文件,别搞错啊。
3、最后一个选项卡,“开始解密”按钮,你也知道怎么做吧 :)
注:这中间会呈现对话框要求你打开密钥文件,可别选择错啊,要不,不会呈现预期的方针。之所以这样做,自己就要你留意区分密钥与密钥的差异(要不,不能浮现本措施的编写的意图。你说呢~!?J)。虽然各人也可以本身利用更好对称加密算法、散列函数,好比 Rijndeal 对称加密算法、SHA512等,那就需要你从头计较这个中的字节偏移量啦(可有偿定制)。时间不充实哦,代码和注释写得有些乱,请拼集着看啦 J Bye_Bye !