使用Rijndael加密和解密字符串

时间:2013-02-27 16:19:20

标签: c# security cryptography aes rijndael

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

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

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

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

我对C#很熟悉,但我不熟悉加密技术,所以如果你能引导我完成任何代码或回答你的帖子,我将非常感激。

由于

2 个答案:

答案 0 :(得分:2)

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

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

我有一个使用AES-CBC和HMAC-SHA256身份验证的示例,我尝试并保持最新和审查,它实际上有一个帮助方法,只用明文和密码处理加密,并且也有很好的评论:

Modern Examples of Symmetric Authenticated Encryption of a string. C#

答案 1 :(得分:1)

您需要执行以下步骤:

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

    中实施

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