我看到了一些代码
string password = "11111111"; byte[] salt = Encoding.ASCII.GetBytes("22222222"); Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(password,salt); RijndaelAlg.Key = key.GetBytes(RijndaelAlg.KeySize / 8);
我可以看到密钥是由Rfc2898DeriveBytes生成的密码和盐.然后AES通过GetBytes检索密钥.
但问题是,RFC2898DeriveBytes做了什么以及key.GetBytes(cb)做了什么?任何人都可以详细说明吗?我无法从文档中获取它.
解决方法
RFC2898是指2000年9月发布的基于密码的加密规范.实际上,Rfc2898DeriveBytes使用密码和salt来生成密钥.它使用的方法称为PBKDF2(基于密码的密钥派生函数#2),并在RFC2898的5.2节中定义.从第5.2节:
PBKDF2 applies a pseudorandom function (see Appendix B.1 for an example) to derive keys. The length of the derived key is essentially unbounded. (However,the maximum effective search space for the derived key may be limited by the structure of the underlying pseudorandom function. See Appendix B.1 for further discussion.) PBKDF2 is recommended for new applications.
有关详细信息,请参阅RFC2898.
至于Rfc2898DeriveBytes.GetBytes的作用,它会在每次调用时返回一个不同的键;它实际上只是使用相同的密码和盐重复应用PBKDF2,但也是迭代计数.
这在RFC doc中概述,其中PBKDF2定义为
PBKDF2 (P,S,c,dkLen)
其中P是密码,S是盐,c是迭代计数,dkLen是所需密钥的长度.