It is more secure, in that method, to use
System.Security.Cryptography.RNGCryptoServiceProvider class than Random and then use it's GetBytes method to get a byte value which OP then takes the modulus of
words.Length. For example:
using System.Security.Cryptography;
# ...
public static String RandomSeed() {
RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
byte[] randomNumber = new byte[1];
string res = "";
for (int i = 0; i < 12; i++) {
rngCsp.GetBytes(randomNumber);
int r = randomNumber[0] % words.Length;
res += words[r].ToLower() + (i < 11 ? " " : "");
}
rngCsp.Dispose();
return res;
}
# ...
Note: I did not test this code for syntax errors.