/// <summary>
        /// Creates a clone of this BioInspiredKey object.
        /// </summary>
        /// <returns>
        /// A new BioInspiredKey object whose values are
        /// copied from the calling object.
        /// </returns>
        public BioInspiredKey Clone()
        {
            BioInspiredKey clone = new BioInspiredKey(
                mu1, x01, mu2, x02, mu3, x03, mu4, x04, SecretImage);

            return(clone);
        }
        /// <summary>
        /// Generates a new random key that is within the valid keyspace
        /// with a randomly generated secret image.
        /// </summary>
        /// <param name="secretImageWidth">
        /// The width in pixels for the generated secret image.
        /// </param>
        /// <param name="secretImageHeight">
        /// The height in pixels for the generated secret image.
        /// </param>
        /// <returns>
        /// A new BioInspiredKey object whose values are within the
        /// correct logistic map keyspace for chaos and a randomly
        /// generated secret image.
        /// </returns>
        public static BioInspiredKey Generate(
            int secretImageWidth, int secretImageHeight)
        {
            BioInspiredKey newKey = Generate();

            newKey.SecretImage = ImageEncryption.GenerateSecretImage(
                secretImageWidth, secretImageHeight);

            return(newKey);
        }
        /// <summary>
        /// Generates a new random key that is within the valid keyspace.
        /// </summary>
        /// <returns>
        /// A new BioInspiredKey object whose values are within the
        /// correct logistic map keyspace.
        /// </returns>
        public static BioInspiredKey Generate()
        {
            Random rand = new Random();

            double scalar = (4.0 - 3.569955672);

            BioInspiredKey newKey = new BioInspiredKey(
                (scalar * rand.NextDouble()) + 3.569955672,  // mu1
                rand.NextDouble(),                           // x01
                (scalar * rand.NextDouble()) + 3.569955672,  // mu2
                rand.NextDouble(),                           // x02
                (scalar * rand.NextDouble()) + 3.569955672,  // mu3
                rand.NextDouble(),                           // x03
                (scalar * rand.NextDouble()) + 3.569955672,  // mu4
                rand.NextDouble());                          // x04

            return(newKey);
        }
 /// <summary>
 /// Full initialization constructor.
 /// </summary>
 /// <param name="plaintextImage">
 /// The image that is to be encrypted.
 /// </param>
 /// <param name="key">
 /// The BioInspiredKey object that is used to encrypt the image.
 /// </param>
 public BioInspiredEncryptor(Bitmap plaintextImage, BioInspiredKey key)
 {
     PlaintextImage = (Bitmap)plaintextImage.Clone();
     Key            = key.Clone();
 }
 /// <summary>
 /// Basic initialization constructor with a predefined plaintext image.
 /// </summary>
 /// <param name="plaintextImage">
 /// The image that will be encrypted once a key is defined.
 /// </param>
 public BioInspiredEncryptor(Bitmap plaintextImage)
     : this(plaintextImage, BioInspiredKey.Generate())
 {
 }
 /// <summary>
 /// Basic constructor with a predefined key.
 /// </summary>
 /// <param name="key">
 /// The BioInspiredKey object that will be used by the cryptosystem.
 /// </param>
 public BioInspiredEncryptor(BioInspiredKey key)
     : this(null, key)
 {
 }