【问题标题】:AES algorithm in C# - Totally confused over nowC# 中的 AES 算法 - 现在完全糊涂了
【发布时间】:2012-02-08 07:28:13
【问题描述】:

我最初搜索 (Google,SO,Bing) 的工作代码,显示如何使用 .NET 中使用 c# 提供的 AES 算法加密和解密密码。我的疑惑来自这两个帖子

  1. http://yossi-yakubov.blogspot.in/2010/07/aes-encryption-using-c-short-way.html

  2. http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged.aspx

#1中,他表明使用CryptoTransform 可以完成所有操作,但MSDN 页面示例显示了复杂流的使用。

  • 我需要这样做吗?

  • 我有什么好处?

  • 谁能澄清我需要遵循的最佳代码以及其他方法中的任何注意事项。

增加混乱this 帖子谈到了加密中的盐,现在我完全迷失了。为什么盐应该出现在加密中而不是散列中。

【问题讨论】:

    标签: c# .net encryption cryptography aes


    【解决方案1】:

    这两种方法都有效,但我想说第一个链接中使用的方法最适合“少量”数据,其中数据可以合理地适合输入 byte[](例如密钥、密码等)。 )。

    第二个链接中的方法更适合“大量”数据,其中将整个输入加载到内存中可能是不可行的,并且流式方法更适合(例如加密网络流上的文件或数据) .

    根据您的需要,第一个链接中的方法可能是合适的。

    至于最后一个链接中提到的盐,这仅用于播种PasswordDeriveBytes,与AES算法本身没有直接关系。

    值得一提的是,AES 也有一种“盐”,它以 IV(初始化向量)的形式出现。这只是随机数据(每次都应该不同),可以与密文一起存储,并确保即使多次加密相同的数据,输出也是不同的。

    考虑到这一点,不应该使用最终链接中显示的方法,因为它似乎每次都会产生相同的输出,因为密钥和 IV 都是完全从输入密码,而 IV 应该是随机字节。

    【讨论】:

    • 现在解释得很好,一切都说得通了。顺便说一句,base64 编码、解码、utf8 编码、解码在解密、加密原始数据的方法内部或外部进行烘焙。我把它们放在外面,以便未来的开发人员可以实现自己的加密后存储byte[]的方式。例如这是现在DAL.ChangePassword(Convert.ToBase64String(AESUtility.EncryptPassword(Encoding.UTF8.GetBytes(password),KEY,IV)));
    • 我想我个人会将字符串传递给该方法,并期望 Base64 字符串输出(因此将 UTF8.GetBytes 和 Convert.ToBase64String 放入 encrypt 方法中)。基本原理是,它减少了在使用该方法的任何地方都必须进行这些转换的开销,并且还确保它是标准的,并且(几乎)保证一个开发人员编写的密码加密可以被另一个开发人员解密,而无需确定哪些转换他们可能在加密时使用过。
    • 核心加密库已经处理了密钥和二进制数据。您不应该围绕它们创建执行相同操作的包装器方法;相反,专注于您的用例并为它们创建类。
    猜你喜欢
    • 2013-12-31
    • 2016-12-17
    • 2020-02-28
    • 2012-11-16
    • 2022-01-23
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-30
    相关资源
    最近更新 更多