C#中的AES算法-现在完全搞糊涂了
我最初在(Google,SO,Bing)中搜寻一段工作代码,该代码显示了如何使用.NET中可用的AES算法使用c#加密和解密密码。我的怀疑来自这两篇文章 在#1中,他展示了一切都可以通过C#中的AES算法-现在完全搞糊涂了,c#,.net,encryption,cryptography,aes,C#,.net,Encryption,Cryptography,Aes,我最初在(Google,SO,Bing)中搜寻一段工作代码,该代码显示了如何使用.NET中可用的AES算法使用c#加密和解密密码。我的怀疑来自这两篇文章 在#1中,他展示了一切都可以通过加密转换来完成,但是MSDN页面示例展示了复杂流的使用 我需要这样做吗 一个比另一个有什么好处 有人能澄清一下我需要遵循的最佳代码以及其他方法中的注意事项吗 更让人困惑的是,这篇文章谈到了salt在加密中的作用,现在我完全不知所措。为什么salt应该出现在加密中而不是散列中。这两种方法都有效,但我要说的是
加密转换来完成,但是MSDN
页面示例展示了复杂流的使用
- 我需要这样做吗
- 一个比另一个有什么好处
- 有人能澄清一下我需要遵循的最佳代码以及其他方法中的注意事项吗
更让人困惑的是,这篇文章谈到了salt在加密中的作用,现在我完全不知所措。为什么salt应该出现在加密中而不是散列中。这两种方法都有效,但我要说的是,在第一个链接中使用的方法最适合“少量”数据,数据可以合理地放入输入字节[]
(例如钥匙、密码等)
来自第二链路的方法更适合于“大”数据量,其中将整个输入加载到存储器中可能是不可行的,并且流方法更适合(例如,加密网络流上的文件或数据)
考虑到您的需要,第一个链接中的方法可能是合适的
至于最后一个链接中提到的salt,它仅用于种子PasswordDeriveBytes
,与AES算法本身没有直接关系
然而值得一提的是,AES还有一种“盐”,其形式为IV(初始化向量)。这只是随机数据(每次都应该不同),可以与密文一起存储,并确保即使多次加密同一数据,输出也会不同
考虑到这一点,不应使用最后一个链接中显示的方法,因为它似乎每次都会产生相同的输出,因为密钥和IV都是完全根据输入的密码生成的,而IV应该是随机字节。这两种方法都有效,但我想说的是,第一个链接中使用的方法最适合“少量”数据,其中数据可以合理地放入输入字节[]
(例如,密钥、密码等)
来自第二链路的方法更适合于“大”数据量,其中将整个输入加载到存储器中可能是不可行的,并且流方法更适合(例如,加密网络流上的文件或数据)
考虑到您的需要,第一个链接中的方法可能是合适的
至于最后一个链接中提到的salt,它仅用于种子PasswordDeriveBytes
,与AES算法本身没有直接关系
然而值得一提的是,AES还有一种“盐”,其形式为IV(初始化向量)。这只是随机数据(每次都应该不同),可以与密文一起存储,并确保即使多次加密同一数据,输出也会不同
考虑到这一点,不应该使用最后一个链接中显示的方法,因为它似乎每次都会产生相同的输出,因为密钥和IV都是完全根据输入的密码生成的,而IV应该是随机字节。现在解释得很好,一切都是有意义的。顺便说一句,只有一个怪癖会导致基本编码,解码,utf8编码,解码在解密、加密原始数据的方法内部或外部烘焙。我将它们放在外部,以便未来的开发人员可以在加密后实现自己存储字节[]
的方法。例如,下面就是DAL.ChangePassword(Convert.ToBase64String(AESUtility.EncryptPassword)(Encoding.UTF8.GetBytes(password),KEY,IV))
我个人认为我会将字符串传递给该方法,并期望Base64字符串输出(因此将UTF8.GetBytes和Convert.ToBase64String放入加密方法中)。其基本原理是,它减少了在使用该方法的任何地方都必须进行这些转换的开销,并且还确保了该方法是标准的,并且(几乎是)保证一个开发人员编写的密码加密可以由另一个开发人员解密,而无需确定加密时可能使用的转换。核心加密库已经处理密钥和二进制数据。您不应该围绕它们创建做同样事情的包装器方法;相反,专注于你的用例并为它们创建类。现在一切都解释得很好。顺便说一句,Base64编码、解码、utf8编码、解码都是在解密、加密原始数据的方法内部或外部进行的。我将它们放在外部,以便未来的开发人员能够实现他们自己存储字节[]的方式
加密后。例如,下面就是DAL.ChangePassword(Convert.ToBase64String(AESUtility.EncryptPassword)(Encoding.UTF8.GetBytes(password),KEY,IV))我个人认为我会将字符串传递给该方法,并期望Base64字符串输出(因此将UTF8.GetBytes和Convert.ToBase64String放入加密方法中)。其基本原理是,它减少了在使用该方法的任何地方都必须进行这些转换的开销,并且还确保了该方法是标准的,并且(几乎是)保证一个开发人员编写的密码加密可以由另一个开发人员解密,而无需确定加密时可能使用的转换。核心加密库已经处理密钥和二进制数据。您不应该围绕它们创建做同样事情的包装器方法;相反,关注您的用例并为它们创建类。