C# 使用Rijndael加密和解密字符串

C# 使用Rijndael加密和解密字符串,c#,security,cryptography,aes,rijndael,C#,Security,Cryptography,Aes,Rijndael,在开始之前,我知道在stackoverflow上有很多类似的问题,但是大多数答案都是由大量代码组成的,没有任何解释或帮助用户 我需要做的很简单,从用户那里输入一个字符串,然后输入密码,然后用密码加密字符串,然后将密码文本写入文件。然后,在用户需要的稍后日期,从文件中读取密码文本并解密,然后将原始纯文本呈现给用户。我可以处理文件的写操作,我只需要字符串加密方面的帮助。(注意:我不想只加密/解密整个文件-因为它必须包含一些未加密的内容-只是程序中的一个字符串) 此外,所需的“初始化向量”是否与密码相

在开始之前,我知道在stackoverflow上有很多类似的问题,但是大多数答案都是由大量代码组成的,没有任何解释或帮助用户

我需要做的很简单,从用户那里输入一个字符串,然后输入密码,然后用密码加密字符串,然后将密码文本写入文件。然后,在用户需要的稍后日期,从文件中读取密码文本并解密,然后将原始纯文本呈现给用户。我可以处理文件的写操作,我只需要字符串加密方面的帮助。(注意:我不想只加密/解密整个文件-因为它必须包含一些未加密的内容-只是程序中的一个字符串)

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

另一件事,当用户解密并输入错误的密码时,Rijndael类中的方法是否会引发错误

我精通C#,但我对密码学还不熟悉,所以如果你能帮我看完任何代码或回复你的帖子,我将不胜感激


谢谢

您需要采取以下步骤:

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


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

    您需要采取以下步骤:

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


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

    大多数Rijndael模式都需要IV,通常您只需在密文前加上它,用户无需记住

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

    我有一个将AES-CBC与HMAC-SHA256身份验证结合使用的示例,我尝试更新并回顾了该示例,它实际上有一个助手方法,只需使用明文和密码即可进行加密,并且得到了很好的评论:


    大多数Rijndael模式都需要IV,通常您只需在密文前加上它,用户无需记住

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

    我有一个将AES-CBC与HMAC-SHA256身份验证结合使用的示例,我尝试更新并回顾了该示例,它实际上有一个助手方法,只需使用明文和密码即可进行加密,并且得到了很好的评论:


    Harvey你有没有做过其他的网络搜索。。?这里有一篇很好的文章来解释如何在MSDN上签出这篇文章,涵盖了这个主题-有很多代码,但它的注释非常多(几乎是逐行),解释了每个阶段发生的事情-它可能无法完全回答您的问题,但它应该为您提供一个很好的过程洞察!哈维,你还做过其他的网络搜索吗。。?这里有一篇很好的文章来解释如何在MSDN上签出这篇文章,涵盖了这个主题-有很多代码,但它的注释非常多(几乎是逐行),解释了每个阶段发生的事情-它可能无法完全回答您的问题,但它应该为您提供一个很好的过程洞察!请注意,从技术上讲,PBKDF2随机盐和随机静脉注射都不是绝对必要的(但也不会造成伤害)。尽管如此,+1。@IlmariKaronen是的,我知道,但是生成足够的随机数据来提取IV可能需要重新执行整个PBKDF函数,这也有其缺点。如果你有足够的空间储存,最好单独制作一个IV。感谢+1。事实上,我上面的评论是错误的:我想说的是,如果您在PBKDF2中使用随机salt来派生密钥,并且只使用该派生密钥加密一条消息,那么使用固定IV应该是可以的。但实际上CBC模式并非如此,尽管对于大多数其他模式也是如此。(然而,即使对于CBC模式,您也可以通过使用原始分组密码加密一个nonce来推导IV,如NIST SP 800-38A附录所示