文件加密解密全解

using System.Security.Cryptography;
using System.IO;
using System.Text;
using System;
using System.Collections.Generic;
using System.Windows.Forms;
namespace KingBoy.KBFileCryp
{
    /// <summary>
    /// 文件加密
    /// </summary>
    class CrypToFile
    {
        /// <summary>
        /// 将字符串转变成字节数组
        /// </summary>
        /// <param name="strPWD">字符串</param>
        /// <returns>返回字节数组</returns>
        private byte[] getByte(string strPWD)
        {
            try
            { 
              //将字符串转换为字符数组
                char[] temp = strPWD.ToCharArray();
                byte[] btemp = new byte[16];

int i = 0;
                //初始化数组
                for (i = 0; i < 16; i++)
                    btemp[i] = 0;
                //根据密码长度,去前16位,后面免去
                if (temp.Length < 16) //16位以内密码
                for (i = 0; i < temp.Length; i++)
                    btemp[i] = Convert.ToByte(temp[i]);
            else //超过32位密码,自取16位
                for (i = 0; i < 16; i++)
                    btemp[i] = Convert.ToByte(temp[i]);
                return btemp;
            }
            catch (Exception)
            {
                return null;
            }
        }
        /// <summary>
        /// 文件加密
        /// </summary>
        /// <param name="inName">加密文件路径</param>
        /// <param name="outName">加密后文件存放路径</param>
        ///<param name="strPWD">密码</param>
        /// <returns>true表示加密成功,false表示加密失败!</returns>
        public bool EncryptData(string inName, string outName,string strPWD)
        {
            try
            {
                //判断加密文件是否存在
                if (File.Exists(inName) == false)
                    //加密源文件不存在!
                    return false;
                byte[] rijnKey=getByte(strPWD);
                byte[] rijnIV = getByte(strPWD);
                //创建加密文件的加密源文件fin和目标文件流fout.
                FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
                FileStream fout = new FileStream(outName, FileMode.Create, FileAccess.Write);
                fout.SetLength(0);
                //创建字节数组变量存储文件读写所需的临时空间
                byte []bin = new byte[100]; 
                 //定义保存字节写入的总长度变量fdlen
                long rdlen = 0;
                //定义被加密文件流的长度变量totlen
                long totlen = fin.Length; 
                //定义变量保存在某一时刻写入字节数len.
                int len = 0;
                //创建加密机制对象
                SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
                CryptoStream encStream = new CryptoStream(fout, rijn.CreateEncryptor(rijnKey, rijnIV), CryptoStreamMode.Write);

//读取源文件,加密后写入目标文件fout
                while (rdlen < totlen)
                {
                    len = fin.Read(bin, 0, 100);
                    encStream.Write(bin, 0, len);
                    rdlen =Convert.ToInt32(rdlen + len);
                }
                encStream.Close();
                fout.Close();
                fin.Close();
                return true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return false;
            }
        }
        /// <summary>
        /// 文件解密
        /// </summary>
        /// <param name="inName">加密文件路径</param>
        /// <param name="outName">加密后的文件路径</param>
        ///<param name="strPWD">密码</param>
        /// <returns>true表示解密成功,false表示解密失败!</returns>
        public bool DecryptData(string inName, string outName,string strPWD)
        {
            try
            {
                //判断解密文件是否存在
                if (File.Exists(inName) == false)
                    //解密源文件不存在!
                    return false;
                byte[] rijnKey =getByte(strPWD);
                byte[] rijnIV =getByte(strPWD);
                //创建加密文件的加密源文件fin和目标文件流fout.
                FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
                FileStream fout = new FileStream(outName, FileMode.Create, FileAccess.Write);
                fout.SetLength(0);
                //创建字节数组变量存储文件读写所需的临时空间
                byte []bin = new byte[100];
                //定义保存字节写入的总长度变量fdlen
                long rdlen = 0;
                //定义被加密文件流的长度变量totlen
                long totlen = fin.Length;
                //定义变量保存在某一时刻写入字节数len.
                int len = 0;
                //创建加密机制对象
                SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
                CryptoStream encStream = new CryptoStream(fout, rijn.CreateDecryptor(rijnKey, rijnIV), CryptoStreamMode.Write);
                //读取源文件,加密后写入目标文件fout
                while (rdlen < totlen)
                {
                    len = fin.Read(bin, 0, 100);
                    encStream.Write(bin, 0, len);
                    rdlen = Convert.ToInt32(rdlen + len);
                }
                encStream.Close();
                fout.Close();
                fin.Close();
                return true;
            }
            catch (Exception)
            {
                
                return false;
            }
        }
        /// <summary>
        /// 加密指定文件夹中所有文件
        /// </summary>
        /// <param name="folderPath">指定路径</param>
        /// <param name="strPwd">加密密码</param>
        public void EncryptFolder(string folderPath,string strPwd)
        {
            DirectoryInfo di = new DirectoryInfo(folderPath);
            if (di.Exists == true) //表示的是目录
            {
                //获取当前目录下所有子目录
                int i = 0;
                for (i = 0; i < di.GetDirectories().Length; i++)
                {
                    EncryptFolder(di.GetDirectories()[i].FullName,strPwd);
                }
                //加密当前文件夹下所有文件
                //根据用户选择的路径,获取相关文件集合
                FileInfo fi = new FileInfo(folderPath);
                FileInfo []files=di.GetFiles();
                for (i = 0; i < di.GetFiles().Length; i++)
                {
                    fi = files[i];
                    if (EncryptData(fi.FullName, fi.FullName.Split(‘.‘)[0] + "_pwd." + fi.FullName.Split(‘.‘)[1], strPwd) == false)
                    {
                        MessageBox.Show("加密失败!");
                        return;
                    }
                    else
                    {
                        fi.Delete();
                    }
                }

}
        }
        /// <summary>
        /// 解密指定文件夹中所有文件
        /// </summary>
        /// <param name="folderPath">指定路径</param>
        /// <param name="strPwd">解密密码</param>
        public void DecryptFolder(string folderPath, string strPwd)
        {
            DirectoryInfo di = new DirectoryInfo(folderPath);
            if (di.Exists == true) //表示的是目录
            {
                //获取当前目录下所有子目录
                int i = 0;
                for (i = 0; i < di.GetDirectories().Length; i++)
                {
                    DecryptFolder(di.GetDirectories()[i].FullName, strPwd);
                }
                //加密当前文件夹下所有文件
                //根据用户选择的路径,获取相关文件集合
                FileInfo fi = new FileInfo(folderPath);
                FileInfo[] files = di.GetFiles();
               for (i = 0; i < di.GetFiles().Length; i++)
                {
                    fi = files[i];
                    if (DecryptData(fi.FullName, fi.FullName.Split(‘.‘)[0].Substring(0, fi.FullName.Split(‘.‘)[0].Length - 4) + "." + fi.FullName.Split(‘.‘)[1], strPwd) == false)
                    {
                        MessageBox.Show("解密失败!");
                        return;
                    }
                    else
                    {
                        fi.Delete();
                    }
                }

}
        }
    }
    class CryptoMemoryStream
    {
        DESCryptoServiceProvider key = new DESCryptoServiceProvider();
        // Encrypt the string.
        public byte[] Encrypt(string PlainText)
        {
            // Create a memory stream.
            MemoryStream ms = new MemoryStream();
            // Create a CryptoStream using the memory stream and the 
            // CSP DES key.  
            CryptoStream encStream = new CryptoStream(ms, key.CreateEncryptor(), CryptoStreamMode.Write);
            // Create a StreamWriter to write a string
            // to the stream.
            StreamWriter sw = new StreamWriter(encStream);
            // Write the plaintext to the stream.
            sw.WriteLine(PlainText);

//Close the StreamWriter and CryptoStream.
            sw.Close();
            encStream.Close();

// Get an array of bytes that represents
            // the memory stream.

byte[] buffer = ms.ToArray();
            // Close the memory stream.
            ms.Close();

// Return the encrypted byte array.
            return buffer;
        } //Encrypt

// Decrypt the byte array.
        public string Decrypt(byte[] CypherText)
        {    // Create a memory stream to the passed buffer.

MemoryStream ms = new MemoryStream(CypherText);
            // Create a CryptoStream using the memory stream and the 
            // CSP DES key. 
            //Dim encStream As New CryptoStream(ms, key.CreateDecryptor(), CryptoStreamMode.Read);
            CryptoStream encStream = new CryptoStream(ms, key.CreateDecryptor(), CryptoStreamMode.Read);
            // Create a StreamReader for reading the stream.
            // Dim sr As New StreamReader(encStream);
            StreamReader sr = new StreamReader(encStream);
            // Read the stream as a string.
            //Dim val As String = sr.ReadLine();
            string val = sr.ReadLine();
            // Close the streams.
            sr.Close();
            encStream.Close();
            ms.Close();
            return val;
        }//Decrypt
    }//CryptoMemoryStream
}

时间: 2024-08-03 23:34:52

文件加密解密全解的相关文章

java 文件加密解密

1 package com.test; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.security.KeyPair; 9 import java.security.KeyPairGenerator; 10

Linux安全机制之文件加密解密

[何为加密解密] 加密:就是把明文转换成密文的过程,是使用某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容. 解密:就是把密文转换成明文的过程,授权用户通过使用与密文加密相对应的算法转译出明文. [常用密码算法和协议] 对称加密:同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密: 常用的对称加密算法:DES (56).3DES.AES (128,192,256,384,512).Blowfish.Twofish.

android 中文件加密 解密 算法实战

现在项目里面有一个需求,本项目里面下载的视频和文档都不允许通过其他的播放器播放,在培训机构里面这样的需求很多.防止有人交一份钱,把所有的课件就拷给了别人.这样的事情培训机构肯定是不愿意的.现在我项目里面也出了这么个需求.下面介绍一下我的实现. 思路: 首先下载文件,这个就不说了,java代码写个下载管理器. 下载完成后存储文件的时候不是直接存储,要加密存储,加密方法是将文件的每个字节与这个字节在流中的下标做异或运算. 在我们项目里面播放的时候要解密,方法也是将文件的每个字节与这个字节在流中的下标

对文件加密解密算法设计

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Security.Cryptography;

Android之zip文件加密解压及进度条的实现

zip文件的解压能够使用java的zip库,可是没有实现对加密文件的解压功能,这里能够使用zip4j来实现.详细能够參看该文<Android下zip压缩文件加密解密的完美解决方式>.该文件里没有实现解压进度的功能,这里进行一简单的实现. Zip4jSp.java /** * unzip file to dest dir with password in thread. * * @param zipFile * @param dest * @param passwd * @param chars

RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密

原文:RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider  DESCryptoServiceProvider 是用于对称加密 RSACryptoServiceProvider是用于非对称加密  对称加密的意思:有一个密钥 相当于加密算法,加密用它来加

DES加密解密帮助类

public class DESCrypto { /// <summary> /// 初始化des实例秘钥及向量 /// </summary> /// <param name="key"></param> /// <returns></returns> private static DESCryptoServiceProvider InitDESInstance(string key) { DESCryptoSer

步步为营-17-FileStream-文件加密/解密

以前使用的File是操作小的文本文件,用的并不常见,FileStream(操作字节),可以操作所有格式的文件,用途较广泛 下面做一个通过文件流给文件加密解密的小软件. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System

RandomAccessFile类进行文件加密

文件加密/解密示例. package io; import java.io.*; public class encrypt { private File file; //存储文件对象信息 byte[] buf;  //缓冲区,存储文件中的所有数据    RandomAccessFile fp; //用参数filename指定的文件构造一个filed对象存储 //同时为缓冲区buf分配与文件长度相等的存储空间 public encrypt(String filename){ file=new Fi