C#的DES文件加解密工具类

using System;

using System.Collections.Generic;

using System.Text;

using System.Security.Cryptography;

using System.IO;

namespace www.xinduofen.com

{

class FileDES

{

///

/// 加密文件随机数生成

///

private static RandomNumberGenerator rand = new RNGCryptoServiceProvider();

private const ulong FC_TAG = 0xFC010203040506CF;

private const int BUFFER_SIZE = 32 * 1024;

///

/// 异常内部处理类

///

private class CryptoHelpException : ApplicationException

{

public CryptoHelpException(string msg) : base(msg) { }

}

///

/// 加密文件,此方法不对异常进行处理,需要调用方进行捕获

///

/// 待加密文件

/// 加密后输出文件

/// 加密密码

/// 方法未产生任何异常 - 成功

public static void EncryptFile(string inFile, string outFile, string password)

{

using (FileStream fin = File.OpenRead(inFile),

fout = File.OpenWrite(outFile))

{

// 获取IV和salt

byte[] IV = GenerateRandomBytes(16);

byte[] salt = GenerateRandomBytes(16);

// 创建加密对象

SymmetricAlgorithm sma = FileDES.CreateRijndael(password, salt);

sma.IV = IV;

// 在输出文件开始部分写入IV和salt

fout.Write(IV, 0, IV.Length);

fout.Write(salt, 0, salt.Length);

// 创建散列加密

HashAlgorithm hasher = SHA256.Create();

long lSize = fin.Length; // 输入文件长度

byte[] bytes = new byte[BUFFER_SIZE]; // 缓存

int read = -1; // 输入文件读取数量

int value = 0;

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 byte[BUFFER_SIZE];

int read = -1;

int value = 0;

int outValue = 0;

byte[] IV = new byte[16];

fin.Read(IV, 0, 16);

byte[] salt = new byte[16];

fin.Read(salt, 0, 16);

SymmetricAlgorithm sma = FileDES.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))

{

// 读取文件长度

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 < numReads; ++i)

{

read = cin.Read(bytes, 0, bytes.Length);

fout.Write(bytes, 0, read);

chash.Write(bytes, 0, read);

value += read;

outValue += read;

}

if (slack > 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 byte[hasher.HashSize / 8];

read = cin.Read(oldHash, 0, oldHash.Length);

if ((oldHash.Length != read) || (!CheckByteArrays(oldHash, curHash)))

throw new CryptoHelpException("文件被破坏");

}

if (outValue != lSize)

throw new CryptoHelpException("文件大小不匹配");

}

}

///

/// 创建加密对象

///

/// 密码

/// 密钥salt

/// 加密对象

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;

}

///

/// 检验两个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 (b1[i] != b2[i])

return false;

}

return true;

}

return false;

}

///

/// 生成指定长度的随机Byte数组

///

/// Byte数组长度

/// 随机Byte数组

private static byte[] GenerateRandomBytes(int count)

{

byte[] bytes = new byte[count];

rand.GetBytes(bytes);

return bytes;

}

}

}

文章出自:越康体育

时间: 2024-11-06 12:56:28

C#的DES文件加解密工具类的相关文章

RSA加解密工具类

Java 实现 import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.interfaces.RSAPrivateKey;import java.secur

161216、使用spring的DefaultResourceLoader自定义properties文件加载工具类

import java.io.IOException; import java.io.InputStream; import java.util.NoSuchElementException; import java.util.Properties; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.co

加密解密工具类(Java,DES)

一个Java版的DES加密工具类,可以用来进行网络数据传输加密,保存密码的时候进行加密. import java.security.Key; import java.security.spec.AlgorithmParameterSpec; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import javax.crypto.spec.I

php des 对称加解密类

<?php header("Content-Type: text/html;charset=utf-8"); /** * des 对称加解密 */ class des { private $key = ''; private $cipher = MCRYPT_DES; //加解密算法 private $modes = MCRYPT_MODE_ECB; //算法模式 private $iv = ''; //初始化向量 /** * 密钥 */ public function __co

CryptoGUI | 文件加解密

分类: 杂类工具    版本: 0.0.3    发布日期: 2015-03-31 根据 crypto 强加密命令行工具制作的可视化版本,可快速进行任意文件的加解密操作,提供丰富的加解密选项以适应多种不同需求:CryptoGui 在 crypto 的基础上进行了人性化定制,使用更方便. 功能简介 支持当今绝大部分对称强加密算法 可定制的密钥长度,从最低32位到最高的448位.信息安全强度由用户自由选择. 算法库基于优秀的 Cryptopp 库封装,已通过FIPS 140-2美国国家信息处理标准一

list集合、txt文件对比的工具类和文件读写工具类

工作上经常会遇到处理大数据的问题,下面两个工具类,是在处理大数据时编写的:推荐的是使用map的方式处理两个list数据,如果遇到list相当大数据这个方法就起到了作用,当时处理了两个十万级的list,使用改方法的变种搞定. 1.txt文件.list集合比较工具 <span style="font-family:KaiTi_GB2312;font-size:18px;">package com.hudong.util.other; import java.util.Colle

spring mvc 文件上传工具类

虽然文件上传在框架中,已经不是什么困难的事情了,但自己还是开发了一个文件上传工具类,是基于springmvc文件上传的. 工具类只需要传入需要的两个参数,就可以上传到任何想要上传的路径: 参数1:HttpServletRequest request 参数2:String storePath   //文件存储相对路径 ,例如:"/upload","/image","/local/file" 返回值:上传到服务器的相对路径 一:代码实现 import

文件上传工具类 UploadUtil.java

package com.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util

L脚本语言实现文件加解密

L脚本语言中可以对内存对象进行AES加解密,我们可以很简单地实现文件加解密 #scp #定义一个秘钥字符串 定义:字符串,str1,abcdefg 打开:文件,file1,c:\1.txt 打开:文件,file2,c:\1-1.txt 定义:整数,size1,0 取大小:file1,size1 显示:size1 申请:内存,mem1,size1 读取:file1,mem1 显示:mem1 加密:mem1,str1 显示:mem1 写入:文件,file2,mem1 释放:内存,mem1 申请:内存