/// <summary> /// indexer /// </summary> /// <param name="i"></param> /// <returns></returns> public byte[] this[uint i] { get { byte[] wrapped_keys = File.ReadAllBytes(PATH); byte[] iter_bytes = new byte[4]; byte[] salt = new byte[32]; Array.Copy(wrapped_keys, 0, iter_bytes, 0, 4); Array.Copy(wrapped_keys, 4, salt, 0, 32); int iter = BitConverter.ToInt32(iter_bytes, 0); byte[] outter_key = DeriveKeyFunction.PBKDF2(PASSWORD, salt, iter, 32); byte[] enc_keys = new byte[wrapped_keys.Length - (4 + 32)]; Array.Copy(wrapped_keys, (4 + 32), enc_keys, 0, enc_keys.Length); Cryptography <AesCryptoServiceProvider> aes = new Cryptography <AesCryptoServiceProvider>(outter_key); byte[] denc_all_keys = aes.Decrypt(enc_keys); byte[] key = new byte[32]; uint idx = i * 32; Array.Copy(denc_all_keys, idx, key, 0, 32); return(key); } }
/// <summary> /// CreateStore /// </summary> /// <param name="path">path to store</param> /// <param name="passowrd">password</param> /// <param name="key">keys</param> public static void CreateStore(string path, string passowrd, params byte[][] key) { byte[] key_data = new byte[key.Length * key_size]; // pack all keys in an byte[] for (int i = 0; i < key.Length; ++i) { Array.Copy(key[i], 0, key_data, i * 32, (int)key_size); } // enc with aes byte[] dk = DeriveKeyFunction.DeriveKey(passowrd); byte[] iter_bytes = new byte[4]; byte[] salt = new byte[32]; byte[] kek = new byte[32]; // copy values Array.Copy(dk, 0, iter_bytes, 0, 4); Array.Copy(dk, 4, salt, 0, 32); Array.Copy(dk, 4 + 32, kek, 0, 32); int iters = BitConverter.ToInt32(iter_bytes, 0); Cryptography <AesCryptoServiceProvider> aes = new Cryptography <AesCryptoServiceProvider>(kek); //Cryptography<Aes> aes = new Cryptography<Aes>(kek); byte[] enc_all_keys = aes.Encrypt(key_data); byte[] iters_salt_enc_all_keys = new byte[enc_all_keys.Length + 4 + 32]; // write salt and iters to enc_all_keys Array.Copy(iter_bytes, 0, iters_salt_enc_all_keys, 0, 4); Array.Copy(salt, 0, iters_salt_enc_all_keys, 4, 32); Array.Copy(enc_all_keys, 0, iters_salt_enc_all_keys, 4 + 32, enc_all_keys.Length); if (File.Exists(path)) { File.Delete(path); } // save File.WriteAllBytes(path, iters_salt_enc_all_keys); }