加密/解密初学者问题

时间:2011-07-08 19:31:41

标签: c# .net visual-studio-2008 encryption

我从未做过任何加密或解密,所以我决定跳进去尝试制作类似于FolderLock的东西。以下问题主要是设计问题,但混合了一些编码问题。

http://www.newsoftwares.net/folderlock/

无论如何,我处于初始阶段并且有一些初步问题。

  1. 加密文件夹时,实际上是在加密文件夹内的所有文件,而不是文件夹本身,因为文件夹无法加密。这是对的吗?

  2. 此外,我已经编写了我的加密/解密代码,但我想要加入密码。我的计划是,当用户选择要加密的文件夹/文件时,让他们设置一个密码,该密码将链接到解密文件夹/文件所需的密钥。好主意还是坏主意?有人有更好的建议吗?我正在讨论为程序本身设置一个密码来解锁任何加密文件/文件夹......

  3. 如何更改Windows 7中的文件夹(我已加密)在打开时要求输入密码,而不是只打开并显示所有加密文件?

  4. 最后,当您加密文件时(使用当前的代码编写方式),您最终会得到加密的原始文件和该文件的加密版本。我确定我知道答案,但是我是否删除了原始版本并保留了加密版本?如果由于某种原因,解密失败并且我没有备份我的文件怎么办?我也应该创建文件备份吗?

  5. 感谢您的帮助!我确实试图谷歌搜索上面的问题,但似乎大多数人这样做比我高得多,所以我找不到很多有用的答案。

    编辑:让我解释一下,当我尝试创建类似于FolderLock的东西时,这仅适用于我的教育。我不打算创建一个商业上可行的应用程序,只是做一些有趣的事情并同时学习。

3 个答案:

答案 0 :(得分:3)

如何通过单一答案加密文件和文件夹的问题。当我们谈论Windows环境时,您可以在大致三个不同级别加密文件:

  1. Hard disk Encryption:在这种情况下,您加密完整的硬盘,这意味着整个磁盘都是加密的。 BitLocker就是一个例子。在这种情况下,您将加密除主引导记录之外的所有内容。写入硬盘的每个字节都是加密的,包括操作系统。

  2. 过滤器驱动程序或文件系统加密:您可以编写自己的过滤器驱动程序或文件系统驱动程序,以便在文件写入磁盘时有选择地和透明地加密和解密文件。大多数业务目标加密解决方案都提供此类功能。 Microsoft以Encrypting File System的形式拥有自己的解决方案。这样做的好处是它可以更好地与操作系统集成,加密文件和文件夹看起来像所有其他应用程序的普通文件。 TrueCrypt是另一个执行此类加密的程序,它是开源的,因此您可能需要查看它。

  3. 应用程序级加密:您还可以在应用程序级别加密我想要调用的文件。如果您不编写自己的过滤器驱动程序,则无法超越此级别。这意味着您加密文件的方式与使用WinZip压缩文件的方式类似。加密文件对于其他应用程序可视为不同格式的文件,而不是原始格式。基本上它与使用WinZip / WinRAR压缩文件没什么不同,除了压缩你加密它。如果您使用WinZip压缩文件夹,它仍将被压缩为单个文件。如果您在此级别执行此操作,则与加密相同。您可以为Windows资源管理器编写外壳扩展,使其“看起来”像文件夹,但实际上它仍然是一个文件,并且您将无法从另一个应用程序“另存为...”到该文件夹​​中。例如,如果双击该文件,您可能还需要提供用于浏览文件夹的GUI。

  4. 我假设您正在寻找要在应用程序级别进行加密的应用程序。在这种情况下,您应该了解这种方法的局限性,如上所述。

    关于你的问题:

    1. 您可以将文件夹加密到容器中,再次考虑WinZip / WinRar,或者您可以将文件夹中的每个文件分别加密到其单独的文件中。

    2. 对于密码/密钥使用,我建议使用随机密钥来加密实际数据。然后使用从一个或多个密码派生的密钥在单独的密钥槽中加密此密钥。这将允许您拥有文件的多个密码。至于算法,我推荐使用AES-128,因为它是一种经过验证且速度非常快的算法。要使用AES,您需要创建一个特定长度的密钥和IV(每个AES-128 128位)。创建这些密钥的最佳方法是使用Rfc2898DeriveBytes和用户输入的实际密码。不要忘记您应该使用HMAC来验证文件的实际解密是否正确。您可以使用HMAC仅验证随机密钥是否已正确解密,这意味着您无需在整个内容上运行HMAC。

    3. 为此你需要编写一个shell扩展,但这只会让你到目前为止。例如,您无法将文件从word保存到加密文件夹中,因为这实际上只是加密文件的容器格式。

    4. 我建议您将其留给用户来创建文件备份。删除的任何文件也应该是wiped securely,因为简单的删除不足以从文件系统中删除文件的所有痕迹。

答案 1 :(得分:1)

  1. 文件夹只是文件的集合。就您的应用程序而言,它只能加密文件夹的内容。
  2. 您应该使用密码来派生密钥。在.NET中,您可以使用Rfc2898DeriveBytes执行此操作。这意味着您甚至不存储密钥。密码密钥。如果可以避免,切勿自行保管钥匙。这样,攻击者的唯一选择就是蛮力;逆向工程不会产生任何有用的东西。
  3. 您可能需要写一个shell extension才能做到这一点。这完全是一个不同的主题。 (我希望你对COM Interop / PInvoke感到满意。)
  4. 这一切都取决于你想要多少“验证”。例如,您可以计算原始文件的SHA-256哈希值;加密它;然后解密它;散列解密文件;并确保哈希匹配。诀窍是将所有这些作为原子操作。您可能还希望存储未加密文件的SHA-256(即使在删除未加密的内容之后),以便稍后解密时;你可以验证它是否正确完成。在这种情况下,您使用哈希作为校验和。

答案 2 :(得分:-2)

  1. 是的,不是。文件系统具有加密标志,可以应用于文件夹。这很重要,因为在该文件夹中创建的新文件将自动加密。但是文件夹本身未加密。

  2. 我不太明白......如果它像TrueCrypt一样工作,那么这是个好主意。

  3. 哪个密码?无论如何,如果它是你的加密方法,那么你必须深入研究Windows Shell API和对象,我不太确定这种扩展是否可以用于.NET(我想我在某处看到它不是,实际上它会从某种原因,我忘了失败)

  4. 我不明白为什么解密会失败。显然任何事情都可能失败,包括硬盘驱动器,但随后每个文件都会失败,你无法保护它。

相关问题