public string Export(string passphrase, int N = 16384, int r = 8, int p = 8) { UInt160 script_hash = Contract.CreateSignatureRedeemScript(PublicKey).ToScriptHash(); string address = script_hash.ToAddress(); byte[] addresshash = Encoding.ASCII.GetBytes(address).Sha256().Sha256().Take(4).ToArray(); byte[] derivedkey = SCrypt.DeriveKey(Encoding.UTF8.GetBytes(passphrase), addresshash, N, r, p, 64); byte[] derivedhalf1 = derivedkey.Take(32).ToArray(); byte[] derivedhalf2 = derivedkey.Skip(32).ToArray(); byte[] encryptedkey = XOR(PrivateKey, derivedhalf1).AES256Encrypt(derivedhalf2); byte[] buffer = new byte[39]; buffer[0] = 0x01; buffer[1] = 0x42; buffer[2] = 0xe0; Buffer.BlockCopy(addresshash, 0, buffer, 3, addresshash.Length); Buffer.BlockCopy(encryptedkey, 0, buffer, 7, encryptedkey.Length); return(buffer.Base58CheckEncode()); }
public static byte[] GetPrivateKeyFromNEP2(string nep2, string passphrase, int N = 16384, int r = 8, int p = 8) { if (nep2 == null) { throw new ArgumentNullException(nameof(nep2)); } if (passphrase == null) { throw new ArgumentNullException(nameof(passphrase)); } byte[] data = nep2.Base58CheckDecode(); if (data.Length != 39 || data[0] != 0x01 || data[1] != 0x42 || data[2] != 0xe0) { throw new FormatException(); } byte[] addresshash = new byte[4]; Buffer.BlockCopy(data, 3, addresshash, 0, 4); byte[] derivedkey = SCrypt.DeriveKey(Encoding.UTF8.GetBytes(passphrase), addresshash, N, r, p, 64); byte[] derivedhalf1 = derivedkey.Take(32).ToArray(); byte[] derivedhalf2 = derivedkey.Skip(32).ToArray(); byte[] encryptedkey = new byte[32]; Buffer.BlockCopy(data, 7, encryptedkey, 0, 32); byte[] prikey = XOR(encryptedkey.AES256Decrypt(derivedhalf2), derivedhalf1); Cryptography.ECC.ECPoint pubkey = Cryptography.ECC.ECCurve.Secp256r1.G * prikey; UInt160 script_hash = Contract.CreateSignatureRedeemScript(pubkey).ToScriptHash(); string address = ToAddress(script_hash); if (!Encoding.ASCII.GetBytes(address).Sha256().Sha256().Take(4).SequenceEqual(addresshash)) { throw new FormatException(); } return(prikey); }
public WalletAccount GetAccount(ECPoint pubkey) { return(GetAccount(Contract.CreateSignatureRedeemScript(pubkey).ToScriptHash())); }