0

在开始之前,我知道在 stackoverflow 上有很多类似的问题,但大多数答案都包含一大段代码,没有任何解释或帮助帮助用户。

我需要做的很简单,从用户那里获取一个字符串作为输入,然后是密码,然后用密码加密字符串并将密文写入文件。然后在用户需要时,从文件中读取密文并对其进行解密,并向用户呈现原始纯文本。我可以处理文件的写入和写入,我只需要加密字符串的帮助。(注意:我不想只加密/解密整个文件 - 因为它必须包含一些未加密的东西 - 只是程序中的一个字符串)

此外,所需的“初始化向量” - 它可以与密码相同吗?或者它可以简单地硬编码到程序中吗?它甚至对安全至关重要吗?如果没有,那么用户是否必须记住密码和 IV?

另一件事,当用户来解密并输入错误的密码时,Rijndael 类中的方法只是引发错误还是什么?

我精通 C#,但我是密码学的新手,所以如果你能引导我完成任何代码或回答你的帖子,我将不胜感激。

谢谢

4

2 回答 2

2

大多数 Rijndael 模式都需要 IV,通常您只需将其添加到密文中,用户无需记住。

由于您使用用户键入的密码进行解密,因此您希望使用Authenticated Encryption以便您的程序可以在输入错误密码时安全地重新提示,否则您的程序可能不会给出任何指示存在问题并吐出随机文本.

我有一个使用带有 HMAC-SHA256 身份验证的 AES-CBC 的示例,我尝试更新并进行了审查,它实际上有一个帮助方法,可以仅使用纯文本和密码处理加密,并且也得到了很好的评论:

字符串的对称认证加密的现代示例。C#

于 2013-02-27T21:28:47.380 回答
1

您需要采取以下步骤:

  1. 根据密码计算密钥。您需要生成一个 8 字节的随机盐和一个迭代计数作为基于密码的密钥派生函数 (PBKDF) 的输入,例如 PBKDF2;
  2. 使用任何编码(如 UTF-8)对字符串进行编码,为您提供密码的明文;
  3. 使用 PKCS#7 填充创建密码,例如 CBC 模式下的 AES-128;
  4. 创建一个随机 IV,这应该是以字节为单位的块大小(因此对于 AES,这将是 16 个字节);
  5. 使用给定的密码加密你的明文,给你密文;
  6. 存储盐、IV 和密文 - 如果需要字符串,可以使用 Base64 等编码。

PBKDF2 在Rfc2898DeriveBytes.

请注意,此答案仅显示如何实现机密性,而不是完整性或真实性。

于 2013-02-27T21:28:40.523 回答