public override CCKey GetKey(string password) { var encrypted = PartialEncrypted.ToArray(); //Derive passfactor using scrypt with ownerentropy and the user's passphrase and use it to recompute passpoint byte[] passfactor = CalculatePassFactor(password, LotSequence, OwnerEntropy); var passpoint = CalculatePassPoint(passfactor); var derived = SCrypt.CoinComputeDerivedKey2(passpoint, this.AddressHash.Concat(this.OwnerEntropy).ToArray()); //Decrypt encryptedpart1 to yield the remainder of seedb. var seedb = DecryptSeed(encrypted, derived); var factorb = Hashes.Hash256(seedb).ToBytes(); var curve = ECKey.Secp256k1; //Multiply passfactor by factorb mod N to yield the private key associated with generatedaddress. var keyNum = new BigInteger(1, passfactor).Multiply(new BigInteger(1, factorb)).Mod(curve.N); var keyBytes = keyNum.ToByteArrayUnsigned(); if (keyBytes.Length < 32) { keyBytes = new byte[32 - keyBytes.Length].Concat(keyBytes).ToArray(); } var key = new CCKey(keyBytes, fCompressedIn: IsCompressed); var generatedaddress = key.PubKey.GetAddress(Network); var addresshash = HashAddress(generatedaddress); if (!Utils.ArrayEqual(addresshash, AddressHash)) { throw new SecurityException("Invalid password (or invalid Network)"); } return(key); }
public static byte[] CalculateDecryptionKey(byte[] Passpoint, byte[] addresshash, byte[] ownerEntropy) { return(SCrypt.CoinComputeDerivedKey2(Passpoint, addresshash.Concat(ownerEntropy).ToArray())); }