コード例 #1
0
        public static bool CheckPassword(string password, KeyStore keystore)
        {
            byte[] derivedkey = new byte[32];

            KeyStoreKdfInfo kdf = keystore.Crypto.Kdf;
            KeyStoreAesInfo aes = keystore.Crypto.Aes;

            if (!KeyStoreCrypto.EncryptScrypt(password
                                              , kdf.Params.N
                                              , kdf.Params.R
                                              , kdf.Params.P
                                              , kdf.Params.Dklen
                                              , kdf.Params.Salt
                                              , out derivedkey))
            {
                Console.WriteLine("fail to generate scrypt.");
                return(false);
            }

            byte[] iv         = aes.Params.Iv;
            byte[] ciphertext = aes.Text;
            byte[] mac        = keystore.Crypto.Mac;

            if (!KeyStoreCrypto.VerifyMac(derivedkey, ciphertext, mac))
            {
                Console.WriteLine("Password do not match.");
                return(false);
            }

            return(true);
        }
コード例 #2
0
        public static bool DecryptKeyStore(string password, KeyStore keystore, out byte[] privatekey)
        {
            byte[] derivedkey = new byte[32];

            privatekey = null;

            KeyStoreKdfInfo kdf = keystore.Crypto.Kdf;
            KeyStoreAesInfo aes = keystore.Crypto.Aes;

            if (!KeyStoreCrypto.EncryptScrypt(password
                                              , kdf.Params.N
                                              , kdf.Params.R
                                              , kdf.Params.P
                                              , kdf.Params.Dklen
                                              , kdf.Params.Salt
                                              , out derivedkey))
            {
                Console.WriteLine("fail to generate scrypt.");
                return(false);
            }

            byte[] iv         = aes.Params.Iv;
            byte[] ciphertext = aes.Text;
            byte[] mac        = keystore.Crypto.Mac;

            if (!KeyStoreCrypto.VerifyMac(derivedkey, ciphertext, mac))
            {
                Console.WriteLine("Password do not match.");
                return(false);
            }

            byte[] cipherkey = KeyStoreCrypto.GenerateCipherKey(derivedkey);

            privatekey = new byte[32];
            using (var am = new Aes128CounterMode(iv))
                using (var ict = am.CreateDecryptor(cipherkey, null))
                {
                    ict.TransformBlock(ciphertext, 0, ciphertext.Length, privatekey, 0);
                }
            return(true);
        }
コード例 #3
0
        public static bool GenerateKeyStore(string path,
                                            string password,
                                            byte[] privatekey,
                                            string address,
                                            int n,
                                            int r,
                                            int p,
                                            int dklen,
                                            out string file_name)
        {
            file_name = null;
            KdfParam kdf_param = new KdfParam()
            {
                Dklen = dklen, N = n, R = r, P = p
            };

            byte[] salt;
            byte[] derivedkey;
            if (!KeyStoreCrypto.GenerateScrypt(password, kdf_param.N, kdf_param.R, kdf_param.P, kdf_param.Dklen, out salt, out derivedkey))
            {
                Console.WriteLine("fail to generate scrypt.");
                return(false);
            }
            kdf_param.Salt = salt;

            byte[] cipherkey  = KeyStoreCrypto.GenerateCipherKey(derivedkey);
            byte[] iv         = RandomGenerator.GenerateRandomBytes(16);
            byte[] ciphertext = new byte[32];

            using (var am = new Aes128CounterMode(iv.Clone() as byte[]))
                using (var ict = am.CreateEncryptor(cipherkey, null))
                {
                    ict.TransformBlock(privatekey, 0, privatekey.Length, ciphertext, 0);
                }

            byte[] mac = KeyStoreCrypto.GenerateMac(derivedkey, ciphertext);

            KeyStore keystore = new KeyStore()
            {
                Version = 1,
                Address = address,
                Crypto  = new KeyStoreCryptoInfo()
                {
                    Kdf = new KeyStoreKdfInfo()
                    {
                        Name   = KDF_SCRYPT,
                        Params = kdf_param
                    },
                    Aes = new KeyStoreAesInfo()
                    {
                        Name   = AES128CTR,
                        Text   = ciphertext,
                        Params = new AesParam()
                        {
                            Iv = iv
                        }
                    },
                    Mac = mac
                },
            };

            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }

            string json = JsonConvert.SerializeObject(keystore, Formatting.Indented);

            file_name = DateTime.UtcNow.ToString("yyyy-MM-ddTHH-mm-ss.ffff") + "__" + keystore.Address + ".keystore";
            path     += Path.DirectorySeparatorChar + file_name;
            using (var file = File.CreateText(path))
            {
                file.Write(json);
                file.Flush();
            }

            return(true);
        }