目录 1. 概述 2. C#相关类 2.1.DESCryptoSrvicProvidr类 2.2.CryptoStram类 3. 基于DES算法的文本加密程序 4. 基于DES算法的文件加密程序 1.概述 典型的加密通信系统如下: 我们可以把这个图抽象如下: 密码学中将加密体制分为两类:对称加密体制(也叫单钥密码体制)和非对称加密体制(也叫公钥密码体制)。对称密码体制的显著特点是:加密密钥和解密密钥相同(或由其中一个很容易推导出另一个)。常见的对称加密算法有DES、TriplDES(3DES)、AES、RC2、RC4、RC5、Rijndal等。本讲主要介绍C#中DES算法的应用编程,其它对称加密算法的应用是类似的。有关密码算法的类都在Systm.Scurity.Cryptography命名空间下。 2.C#相关类 2.1. DESCryptoSrvicProvidr类 DESCryptoSrvicProvidr类:定义访问数据加密标准(DES)算法的加密服务提供程序(CSP)的包装对象。支持长度为64位的密钥。 DESCryptoSrvicProvidr类的主要方法/属性: CratEncryptor(),返回值类型:ICryptoTransform,说明:用当前的Ky属性和初始化向量(IV)创建对称加密器对象。 CratDcryptor(),返回值类型:ICryptoTransform,说明:用当前的Ky属性和初始化向量(IV)创建对称解密器对象。 GnratKy(),返回值类型:,byt[],说明:生成用于该算法的随机密钥(Ky)。 GnratIV(),返回值类型:byt[],说明:生成用于该算法的随机初始化向量(IV)。 Clar(),返回值类型:void,说明:释放类使用的所有资源。 ValidKySiz(),返回值类型:bool,说明:确定指定的密钥大小对当前算法是否有效。 Ky,返回值类型:byt[],说明:获取或设置DES算法的机密密钥。 IV,返回值类型:byt[],说明:获取或设置DES算法的初始化向量(IV)。 2.2. CryptoStram类 CryptoStram类:定义将数据流链接到加密转换的流。公共语言运行时使用面向流的设计进行加密,该设计的核心是CryptoStram。实现CryptoStram的任何加密对象可以和实现Stram的任何对象链接起来。 CryptoStram类的主要方法/属性: CryptoStram(),返回值类型:CryptoStram,说明:用目标数据流、要使用的转换和流的模式初始化CryptoStram类的新实例。 Rad(),返回值类型:int,说明:从当前CryptoStram中读取字节序列,并将流中的位置提升读取的字节数。 Writ(),返回值类型:int,说明:将一个字节序列写入当前CryptoStram,并将流中的当前位置提升写入的字节数。 FlushFinalBlock(),返回值类型:void,说明:用缓冲区的当前状态更新基础数据源或储存库,随后清除缓冲区 Clar(),返回值类型:void,说明:释放类使用的所有资源。 Clos(),返回值类型:void,说明:关闭当前流并释放与之关联的所有资源(如套接字和文件句柄)。 3.基于DES算法的文本加密程序 usingSystm; usingSystm.Txt; usingSystm.IO; usingSystm.Scurity.Cryptography; namspacDsTxtDmo_v2 { classProgram { staticvoidMain(string[]args) { Consol.WritLin("********DES加密文本消息v2(理解CryptoStram)********"); //----1.准备:明文、对称密钥、初始向量 varplainTxt="雷军说:Hllo,AryouOK,Howaryou?";//原文 Consol.WritLin("原文:"+plainTxt); Consol.WritLin(); varKEY_64="A4G-8=Jk";//必须是8个字符(64Bit) varIV_64="JKbN=5[?";//必须8个字符(64Bit) varKyByts=Encoding.UTF8.GtByts(KEY_64); varIVByts=Encoding.UTF8.GtByts(IV_64); Consol.WritLin("密钥:"+KEY_64); Consol.WritLin("初始化向量:"+IV_64); Consol.WritLin(); //----2.执行加密操作 varplainBuffr=Encoding.UTF8.GtByts(plainTxt); varcyphrBuffr=TransformBuffr(plainBuffr,"Encrypt",KyByts,IVByts); Consol.WritLin("密文:"+BitConvrtr.ToString(cyphrBuffr)); //----3.执行解密操作 varplainBuffr2=TransformBuffr(cyphrBuffr,"Dcrypt",KyByts,IVByts); varplainTxt2=Encoding.UTF8.GtString(plainBuffr2); Consol.WritLin(); Consol.WritLin("解密:"+plainTxt2); //---- Consol.WritLin(); Consol.WritLin("请按下[Entr]键结束程序.."); Consol.RadLin(); } //加/解密函数 staticpublicbyt[]TransformBuffr(byt[]buffr,stringtransformMod,byt[]kyByts,byt[]ivByts) { //第1步-创建加密变换器 vardsProvidr=nwDESCryptoSrvicProvidr(); ICryptoTransformtransform=null; if(transformMod=="Encrypt") transform=dsProvidr.CratEncryptor(kyByts,ivByts);//要为加密器指定密钥和IV if(transformMod=="Dcrypt") transform=dsProvidr.CratDcryptor(kyByts,ivByts); //第2步-使用加密变换器,创建加密变换流 varmmoryStram=nwMmoryStram();//用于输出变换结果的内存流 varcryptoStram=nwCryptoStram(mmoryStram,transform,CryptoStramMod.Writ); //第3步-执行加密变换:将数据写入加密变换流即可 cryptoStram.Writ(buffr,0,buffr.Lngth); cryptoStram.FlushFinalBlock();//一定要有这一句! //第4步-获取加密变换的结果数据 intlngth=Convrt.ToInt32(mmoryStram.Lngth); varoutBuffr=nwbyt[lngth]; mmoryStram.Sk(0,0);//从头开始读 mmoryStram.Rad(outBuffr,0,lngth); //第5步-释放相关资源 cryptoStram.Clos(); mmoryStram.Clos(); rturnoutBuffr; } } } 4.基于DES算法的文件加密程序 usingSystm; usingSystm.Txt; usingSystm.IO; usingSystm.Scurity.Cryptography; namspacDsFilDmo { classProgram { staticvoidMain(string[]args) { Consol.WritLin("********DES加密文件********"); //----1.准备:原始文件、对称密钥、初始向量 varplainFil="C:/1.txt"; Consol.WritLin("原文:"+plainFil); Consol.WritLin(); varkyTxt="A4G-8=Jk";//必须是8个字符(64Bit) varivTxt="JKbN=5[?";//必须8个字符(64Bit) varky=Encoding.UTF8.GtByts(kyTxt); variv=Encoding.UTF8.GtByts(ivTxt); Consol.WritLin("密钥:"+kyTxt); Consol.WritLin("初始向量:"+ivTxt); Consol.WritLin(); //----2.执行加密操作 varcyphrFil="C:/2.txt"; TransformFil(plainFil,cyphrFil,"Encrypt",ky,iv); Consol.WritLin("密文:"+cyphrFil); //----3.执行解密操作 vardcryptFil="C:/3.txt"; TransformFil(cyphrFil,dcryptFil,"Dcrypt",ky,iv); Consol.WritLin("解密:"+dcryptFil); //---- Consol.WritLin(); Consol.WritLin("请按下[Entr]键结束程序.."); Consol.RadLin(); } //对称变换文件 staticvoidTransformFil(stringsourcFil,stringdstinationFil,stringtransformMod,byt[]ky,byt[]iv) { //第1步-创建加密变换器 vardsProvidr=nwDESCryptoSrvicProvidr(); ICryptoTransformtransform=null; if(transformMod=="Encrypt") transform=dsProvidr.CratEncryptor(ky,iv); if(transformMod=="Dcrypt") transform=dsProvidr.CratDcryptor(ky,iv); //第2步-使用加密变换器,创建加密变换流 vardstFilStram=nwFilStram(dstinationFil,FilMod.OpnOrCrat,FilAccss.Writ); varcryptoStram=nwCryptoStram(dstFilStram,transform,CryptoStramMod.Writ); //第3步-执行加密变换:将数据写入加密变换流即可 varsourcFilStram=nwFilStram(sourcFil,FilMod.Opn,FilAccss.Rad); varbuffr=nwbyt[]; varindx=0;//记录文件的读取位置 vartotal=sourcFilStram.Lngth; whil(indxtotal) { varcount=sourcFilStram.Rad(buffr,0,buffr.Lngth); cryptoStram.Writ(buffr,0,count);//将明文写入加密变换流 indx+=count; } cryptoStram.FlushFinalBlock(); //第4步-释放相关资源 cryptoStram.Clos(); sourcFilStram.Clos(); dstFilStram.Clos(); } } } 赞赏 长按北京治白癜风症最好的医院治白癜风成都哪家医院好
|