c#实现拖拽打开方法.doc_第1页
c#实现拖拽打开方法.doc_第2页
c#实现拖拽打开方法.doc_第3页
c#实现拖拽打开方法.doc_第4页
c#实现拖拽打开方法.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

首先,这是个winform的程序,部署在市场部同事的笔记本上面,基于.Net 2.0做的,它的功能大致如下: 加密合同文档(*.doc) 在客户处解密此合同文档,进行编辑,再次加密 回到公司可以通过密码打开它由于时间关系,只是很粗略的做了个大概。打开vs2008,建立一个winform项目,设计程序界面如下:很简单的,待会儿在文章最后会有下载地址。我们可以把任意文件,拖入程序界面,即可进行加密,在此暂不作说明,大家可以待会儿下载回去试试,很简单的。下面分享一下加密代码吧:代码 using System;using System.Collections.Generic;using System.Text;using System.Security.Cryptography;using System.IO;namespace FileLock / / 异常处理类 / public class CryptoHelpException : ApplicationException public CryptoHelpException(string msg) : base(msg) public class CryptoHelp private const ulong FC_TAG = 0xFC010203040506CF; private const int BUFFER_SIZE = 128 * 1024; / / 检验两个Byte数组是否相同 / / Byte数组 / Byte数组 / true相等 private static bool CheckByteArrays(byte b1, byte b2) if (b1.Length = b2.Length) for (int i = 0; i b1.Length; +i) if (b1i != b2i) return false; return true; return false; / / 创建Rijndael SymmetricAlgorithm / / 密码 / / 加密对象 private static SymmetricAlgorithm CreateRijndael(string password, byte salt) PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, salt, SHA256, 1000); SymmetricAlgorithm sma = Rijndael.Create(); sma.KeySize = 256; sma.Key = pdb.GetBytes(32); sma.Padding = PaddingMode.PKCS7; return sma; / / 加密文件随机数生成 / private static RandomNumberGenerator rand = new RNGCryptoServiceProvider(); / / 生成指定长度的随机Byte数组 / / Byte数组长度 / 随机Byte数组 private static byte GenerateRandomBytes(int count) byte bytes = new bytecount; rand.GetBytes(bytes); return bytes; / / 加密文件 / / 待加密文件 / 加密后输入文件 / 加密密码 public static void EncryptFile(string inFile, string outFile, string password) using (FileStream fin = File.OpenRead(inFile), fout = File.OpenWrite(outFile) long lSize = fin.Length; / 输入文件长度 int size = (int)lSize; byte bytes = new byteBUFFER_SIZE; / 缓存 int read = -1; / 输入文件读取数量 int value = 0; / 获取IV和salt byte IV = GenerateRandomBytes(16); byte salt = GenerateRandomBytes(16); / 创建加密对象 SymmetricAlgorithm sma = CryptoHelp.CreateRijndael(password, salt); sma.IV = IV; / 在输出文件开始部分写入IV和salt fout.Write(IV, 0, IV.Length); fout.Write(salt, 0, salt.Length); / 创建散列加密 HashAlgorithm hasher = SHA256.Create(); using (CryptoStream cout = new CryptoStream(fout, sma.CreateEncryptor(), CryptoStreamMode.Write), chash = new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write) BinaryWriter bw = new BinaryWriter(cout); bw.Write(lSize); bw.Write(FC_TAG); / 读写字节块到加密流缓冲区 while (read = fin.Read(bytes, 0, bytes.Length) != 0) cout.Write(bytes, 0, read); chash.Write(bytes, 0, read); value += read; / 关闭加密流 chash.Flush(); chash.Close(); / 读取散列 byte hash = hasher.Hash; / 输入文件写入散列 cout.Write(hash, 0, hash.Length); / 关闭文件流 cout.Flush(); cout.Close(); / / 解密文件 / / 待解密文件 / 解密后输出文件 / 解密密码 public static void DecryptFile(string inFile, string outFile, string password) / 创建打开文件流 using (FileStream fin = File.OpenRead(inFile), fout = File.OpenWrite(outFile) int size = (int)fin.Length; byte bytes = new byteBUFFER_SIZE; int read = -1; int value = 0; int outValue = 0; byte IV = new byte16; fin.Read(IV, 0, 16); byte salt = new byte16; fin.Read(salt, 0, 16); SymmetricAlgorithm sma = CryptoHelp.CreateRijndael(password, salt); sma.IV = IV; value = 32; long lSize = -1; / 创建散列对象, 校验文件 HashAlgorithm hasher = SHA256.Create(); /using (CryptoStream cin = new CryptoStream(fin, sma.CreateDecryptor(), CryptoStreamMode.Read), / chash = new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write) / CryptoStream cin = new CryptoStream(fin, sma.CreateDecryptor(), CryptoStreamMode.Read), chash = new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write); / 读取文件长度 BinaryReader br = new BinaryReader(cin); lSize = br.ReadInt64(); ulong tag = br.ReadUInt64(); if (FC_TAG != tag) throw new CryptoHelpException(文件被破坏或者密码不正确); long numReads = lSize / BUFFER_SIZE; long slack = (long)lSize % BUFFER_SIZE; for (int i = 0; i 0) read = cin.Read(bytes, 0, (int)slack); fout.Write(bytes, 0, read); chash.Write(bytes, 0, read); value += read; outValue += read; chash.Flush(); chash.Close(); fout.Flush(); fout.Close(); byte curHash = hasher.Hash; / 获取比较和旧的散列对象 byte oldHash = new bytehasher.HashSize / 8; read = cin.Read(oldHash, 0, oldHash.Length); if (oldHash.Length != read) | (!CheckByteArrays(oldHash, curHash) throw new CryptoHelpException(文件被破坏); cin.Flush(); cin.Close(); / if (outValue != lSize) throw new CryptoHelpException(文件大小不匹配); 是不是很明了呢?当然了,网上一搜一大把,我这个也是不小心搜到的,感觉比较不错的代码,后来经过我少许加工,即可使用了。当然,在这里,还要提一句,这个小程序,为了让它更方便,直接拖拽文件到其图标之上,就默认打开程序,加载该文件,并进行加密操作,听起来是不是很cool!?呵呵,下面再和大家分享一下如何实现吧:在窗体的DragDrop和DragEnter事件下,添加如下代码:代码 private void MainForm_DragEnter(object sender, DragEventArgs e) if (e.Data.GetDataPresent(DataFormats.FileDrop) e.Effect = DragDropEffects.Move; else e.Effect = DragDropEffects.None; private void MainForm_DragDrop(object sender, DragEventArgs e) string path = (System.Array)e.Data.GetData(DataFormats.FileDrop).GetValue(0).ToString(); extension = System.IO.Path.GetExtension(path);/扩展名 if (e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论