3

我需要在 asp net mvc 应用程序中创建一个加密的文件容器。

我发现这个程序可以完成这项工作

http://www.michaelcodes.net/post/TrueCrypt-6a-System-Encryption-Benchmarks.aspx

但它应该与.net 集成

有没有办法使用 .NET 库来实现这一点?我还没有找到如何。

特征:

  • 系统需要能够从该容器中添加和删除文件,并在请求时读取内容。但是所有的操作都需要在系统内部完成。
  • C# 实现
4

2 回答 2

2

您可以将文件放在自定义类列表中:

[Serializable]
public class FileEntry
{
 public string FileName {get;set;}
 public string FileRelativePath {get;set;}
 public byte[] FileContents {get;set;}
}

将文件添加到列表中:

List<FileEntry> files = new  List<FileEntry> ();

for .......
{
    files.Add(new FileEntry()
    {
        FileName  = .....,
        FileRelativePath = .....,
        FileContents = File.ReadAllBytes(......),
    };
}

然后,使用 BinarryFormatter 将此结构转换为字节数组:

byte[] filesBytes;
BinaryFormatter ser = new     BinaryFormatter();
using(MemoryStream ms = new MemoryStream())
{
    ser.Serialize(ms, files);
    filesBytes = ms.ToArray();
}

现在,您的结构为 byte[],您可以使用以下简单方法轻松加密它们:

filesBytes = Encrypt(filesBytes , ......);

然后使用一些自定义扩展名将加密的字节保存到某个位置:

File.WriteAllBytes(".........\.....encr",filesBytes);

然后,当您想重新打开文件并读取清除数据时:

byte[] encryptedData = File.ReadAllBytes(".......\.....encr");

用同样的算法解密内容:

byte[] clearContent = Decrypt(encryptedData, ......);

并将内容反序列化为一级结构:

BinaryFormatter ser = new BinaryFormatter();
using(MemoryStream ms = new MemoryStream(clearContent))
{
    List<FileEntry>  files = ser.Deserialize(ms) as List<FileEntry>;
}

然后,如果需要,将文件的内容写入某个位置:

foreach(var file in files)
{
     File.WriteAllBytes(string.Format("........{0}...{1}",file.FileRelativePath , file.FileName), file.FileContents)
}

您可以使用这个关于加密的问题:

使用.NET中的秘密加密/混淆字节数组的简单方法?

是一个关于二进制格式化程序的例子:

我已经在我的博客上发布了这个答案:)

于 2012-12-26T12:20:31.620 回答
1

如果您想使用 TrueCrypt,您可以在系统启动时自动挂载到驱动器,然后在映射的驱动器上使用常规文件操作。

如果您不想通过公共访问(访问相关应用程序的外部访问)来安装卷,那么您确实需要更深入的 API 访问。

我不建议从头开始滚动您自己的 C# 实现。要在 TrueCrypt 中改进安全级别,您需要技巧和时间——这两者都已进入 TC。如果您不同时使用这两种方法,您很容易面临巨大的安全风险。

您可以通过导入 dll 来简单地使用自动互操作(尽管我不能确定)。我相信 TC 是开源的,如果是这样,您可以外包 C/C++ 编码器来编写 .Net 包装器 - 不需要安装卷,但允许内部应用程序仅基于文件的访问。

于 2012-12-26T12:29:14.577 回答