public static EllipticCurveEncryptionInformation Create(IEnumerable <EcKeyPair> publicKeys, byte[] secretKey) { var ephemeralKey = EllipticCurveCryptographer.CreateKeyPair(true); var result = new EllipticCurveEncryptionInformation { EphemeralKey = ephemeralKey.ExportPublicKey(), }; result.DerivedSecrets = new List <DerivedSecret>(); foreach (var publicKey in publicKeys) { var deriveSecret = EllipticCurveCryptographer.DeriveSecret(ephemeralKey, publicKey); var input = new MemoryStream(secretKey); var output = new MemoryStream(); SymmetricEncryption.Encrypt(input, output, deriveSecret); var saltedHash = publicKey.GetPublicKeySaltedHash(); var derivedSecret = new DerivedSecret { PublicKeyHash = saltedHash.hash, PublicKeyHashSalt = saltedHash.salt, EncryptedSharedSecret = output.ToArray() }; result.DerivedSecrets.Add(derivedSecret); } return(result); }