using System; using System.Collections.Generic; using System.IO; using System.Security.Cryptography; using DistributedPasswordCracker.Client.Models; namespace DistributedPasswordCracker.Client.Utilities { class PasswordFileHandler { private static readonly Converter Converter = CharToByte; /// /// With this method you can make you own password file /// /// Name of password file /// List of usernames /// List of passwords in clear text /// if usernames and passwords have different lengths public static void WritePasswordFile(String filename, String[] usernames, String[] passwords) { HashAlgorithm messageDigest = new SHA1CryptoServiceProvider(); if (usernames.Length != passwords.Length) { throw new ArgumentException("usernames and passwords must be same lengths"); } using (FileStream fs = new FileStream(filename, FileMode.CreateNew, FileAccess.Write)) using (StreamWriter sw = new StreamWriter(fs)) { for (int i = 0; i < usernames.Length; i++) { byte[] passwordAsBytes = Array.ConvertAll(passwords[i].ToCharArray(), GetConverter()); byte[] encryptedPassword = messageDigest.ComputeHash(passwordAsBytes); String line = usernames[i] + ":" + Convert.ToBase64String(encryptedPassword) + "\n"; sw.WriteLine(line); } } } /// /// Reads all the username + encrypted password from the password file /// /// the name of the password file /// A list of (username, encrypted password) pairs public static List ReadPasswordFile(String filename) { List result = new List(); FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read); using (StreamReader sr = new StreamReader(fs)) { while (!sr.EndOfStream) { String line = sr.ReadLine(); String[] parts = line.Split(":".ToCharArray()); UserInfo userInfo = new UserInfo(parts[0], parts[1]); result.Add(userInfo); } return result; } } public static Converter GetConverter() { return Converter; } /// /// Converting a char to a byte can be done in many ways. /// This is one way ... /// /// /// private static byte CharToByte(char ch) { return Convert.ToByte(ch); } } }