using System.Security.Cryptography;
private static readonly char[] AcceptableCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*()_-+=[{]};:<>|./?".ToCharArray();
public static void Main()
ReadOnlySpan<char> charSpan = AcceptableCharacters;
var secure = RandomNumberGenerator.GetString(charSpan, 20);
Console.WriteLine($"Super Top Secret Temporary Password: {secure}");
string securePassword = PasswordGenerator.GenerateSecurePassword(12, 4);
Console.WriteLine("Generated Secure Password: " + securePassword);
public class PasswordGenerator
private static readonly char[] AlphanumericCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".ToCharArray();
private static readonly char[] NonAlphanumericCharacters = "!@#$%^&*()_-+=[{]};:<>|./?".ToCharArray();
public static string GenerateSecurePassword(int length, int numberOfNonAlphanumericCharacters)
if (length < 1 || numberOfNonAlphanumericCharacters > length || numberOfNonAlphanumericCharacters < 0)
throw new ArgumentException("Invalid length or number of non-alphanumeric characters specified.");
char[] password = new char[length];
int[] selectedIndexes = Enumerable.Range(0, length).ToArray();
using (RandomNumberGenerator rng = RandomNumberGenerator.Create())
byte[] randomBytes = new byte[length];
rng.GetBytes(randomBytes);
selectedIndexes = selectedIndexes.OrderBy(x => randomBytes[x % randomBytes.Length]).ToArray();
for (int i = 0; i < numberOfNonAlphanumericCharacters; i++)
password[selectedIndexes[i]] = NonAlphanumericCharacters[randomBytes[i % randomBytes.Length] % NonAlphanumericCharacters.Length];
for (int i = numberOfNonAlphanumericCharacters; i < length; i++)
password[selectedIndexes[i]] = AlphanumericCharacters[randomBytes[i % randomBytes.Length] % AlphanumericCharacters.Length];
return new string(password);