java在AES加密时,有时会使用SecureRandom随机数作为密钥,这时的secret被当成了种子,以下这种实现
String secret = "secret";
byte[] seed = secret.getBytes();
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(seed);
keyGen.init(128, sr);
SecretKey key = keyGen.generateKey();
byte[] keyArray =key.getEncoded();
因为是固定长度(128bit),并且不超过160bit,C#可以使用下面的方式达到与java使用SecureRandom生成伪随机数一样的效果
这里上下两块代码中的keyArray是相等的
string secret = "secret";
byte[] seed = Encoding.UTF8.GetBytes(secret );
using (var st = new SHA1CryptoServiceProvider())
{
//return sha1.ComputeHash(seed);
using(var nd = new SHA1CryptoServiceProvider())
{
var rd = nd.ComputeHash(st.ComputeHash(seed));
byte[] keyArray = rd.Take(16).ToArray();
}
}