| 发表于:2008-01-10 11:55:222楼 得分:0 |
using system; using system.io; using system.security.cryptography; using system.windows.forms; using system.text; namespace fomlogon { /// <summary> /// class1 的摘要说明。 /// </summary> public class cencrypt { public cencrypt() { } /// <summary> /// 对文件加密采用算法 /// </summary> /// <param name="sy"> 创建一个公钥和一个私钥 </param> private static void passwordtobyte(symmetricalgorithm sy) { byte[] b= new byte[8]; byte[] c = new byte[8]; encoding ascii= encoding.ascii; byte[] encodebyte = ascii.getbytes("zhonghlning"); byte[] encodebyte2 = ascii.getbytes("zhonghlning"); topassbyte( b,encodebyte); topassbyte( c,encodebyte2); sy.key=b; sy.iv = c ; } /// <summary> /// /// </summary> /// <param name="destination"> 字节数 </param> /// <param name="source"> 编码字符数组 </param> public static void topassbyte( byte[] destination,byte[] source) { if (destination.length> =source.length) { for(int i=0;i <source.length; i++) { destination[i] = source[i]; } } else { for(int i=0;i <destination.length;i++) { destination[i] = source[i]; } } } /// <summary> /// 将一个文件加密并生成一个新文件 /// </summary> /// <param name="inname"> 需要加密文件的全路径 </param> /// <param name="outname"> 输出加密文件的全路径 </param> public static void encryptdata(string inname, string outname) { //创建输入流和输出流 filestream fin = new filestream(inname, filemode.open, fileaccess.read); filestream fout = new filestream(outname, filemode.openorcreate, fileaccess.write); fout.setlength(0); //读写的缓存区 byte[] bin = new byte[1000]; //加密的临时存储区 long rdlen = 0; //初始化写出流的长度 long totlen = fin.length; //输入流的长度 int len; //某一个时间段完成的写出流长度 /* * symmetricalgorithm为算法类型类(抽象) * descryptoserviceprovider为算法实现类 ,是算法类des的子类 * 类层次关系如下 * system.security.cryptography.symmetricalgorithm system.security.cryptography.des system.security.cryptography.descryptoserviceprovider */ symmetricalgorithm des = new descryptoserviceprovider(); //给key和iv赋值 passwordtobyte(des); //创建加密器 icryptotransform transform = des.createencryptor(des.key,des.iv); //使用加密器和输出流,创建一个加密输出流 cryptostream encstream = new cryptostream(fout, transform, cryptostreammode.write); //循环读出读出输入流到内存中,然后加密流将一段内存加密后写到输出流 while(rdlen < totlen) { len = fin.read(bin, 0, 1000); encstream.write(bin, 0, len); rdlen = rdlen + len; } //关闭流,释放资源 encstream.close(); fout.close(); fin.close(); } /// <summary> ///解密 /// </summary> /// <param name="inname"> </param> /// <param name="outname"> </param> public static void decryptdata(string inname,string outname) { //创建输入流和输出流 filestream fin = new filestream(inname, filemode.open, fileaccess.read); filestream fout = new filestream(outname, filemode.openorcreate, fileaccess.write); fout.setlength(0); //读写的缓存区 byte[] bin = new byte[10240]; //加密的临时存储区 long rdlen = 0; //初始化写出流的长度 long totlen = fin.length; //输入流的长度 int len; //某一个时间段完成的写出流长度 symmetricalgorithm des = new descryptoserviceprovider(); //给key和iv赋值 passwordtobyte(des); // 创建解密器 icryptotransform transform = des.createdecryptor(des.key,des.iv); //使用解密器和输出流,创建一个解密输出流 cryptostream encstream = new cryptostream(fout, transform, cryptostreammode.write); //读出输入流,解密和写输出流 while(rdlen < totlen) { len = fin.read(bin, 0, 10240); encstream.write(bin, 0, len); rdlen = rdlen + len; } encstream.close(); fout.close(); fin.close(); } } } | | |
|