private void btnVerify_Click(object sender, EventArgs e)
 {
     if (string.IsNullOrWhiteSpace(inputSignature.Text))
     {
         MessageBox.Show("Input text should not be empty!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
     }
     else if (string.IsNullOrWhiteSpace(inputPublicExponent.Text))
     {
         MessageBox.Show("The public key is wrong!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
     }
     else if (string.IsNullOrWhiteSpace(inputPublicModulus.Text))
     {
         MessageBox.Show("The public key is wrong!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
     }
     else
     {
         RSAKey publicKey = new RSAKey(BigInteger.Parse(inputPublicModulus.Text), BigInteger.Parse(inputPublicExponent.Text));
         BigInteger signature = BigInteger.Parse(inputSignature.Text);
         if (RSAPKCS1V1_5Signature.verify(publicKey, inputPlainText.Text, signature))
         {
             MessageBox.Show("The text is original!", "Valid signature", MessageBoxButtons.OK, MessageBoxIcon.None);
         }
         else
         {
             MessageBox.Show("The text was spoofed!", "Invalid signature", MessageBoxButtons.OK, MessageBoxIcon.Error);
         }
         
     }
 }
        /**
         * An implementation of the RSASP method: Assuming that the designated
         * RSA private key is a valid one, this method computes a signature
         * representative for a designated message representative signed
         * by the holder of the designated RSA private key.
         * 
         * @param K the RSA private key.
         * @param m the message representative: an integer between
         *          0 and n - 1, where n
         *          is the RSA modulus.
         * @return the signature representative, an integer between
         *         0 and n - 1, where n
         *         is the RSA modulus.
         */
        public static BigInteger RSASP1(RSAKey K, BigInteger m)
        {
            // 1. If the representative c is not between 0 and n - 1, output
            // "representative out of range" and stop.
            BigInteger n = K.getModulus();
            if (m.CompareTo(BigInteger.Zero) < 0 || m.CompareTo(n - BigInteger.One) > 0)
                throw new ArgumentException();
            // 2. The representative m is computed as follows.
            BigInteger result;
            // a. If the first form (n, d) of K is used, let m = c^d mod n.
            BigInteger d = K.getExponent();
            result = BigInteger.ModPow(m, d, n);

            // 3. Output m
            return result;
        }
 private void btnSign_Click(object sender, EventArgs e)
 {
     if (string.IsNullOrWhiteSpace(inputPlainText.Text))
     {
         MessageBox.Show("Input text should not be empty!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
     }
     else if (string.IsNullOrWhiteSpace(inputPrivateExponent.Text))
     {
         MessageBox.Show("The private key is wrong!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
     }
     else if (string.IsNullOrWhiteSpace(inputPrivateModulus.Text))
     {
         MessageBox.Show("The private key is wrong!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning);
     }
     else
     {
         RSAKey privateKey = new RSAKey(BigInteger.Parse(inputPrivateModulus.Text), BigInteger.Parse(inputPrivateExponent.Text));
         RSAKey publicKey = new RSAKey(BigInteger.Parse(inputPublicModulus.Text), BigInteger.Parse(inputPublicExponent.Text));
         byte[] octetSignature = RSAPKCS1V1_5Signature.sign(privateKey, inputPlainText.Text);
         inputSignature.Text = RSAPKCS1V1_5Signature.OS2IP(octetSignature).ToString();
     }
 }
 private void btnGeneratePublicKey_Click(object sender, EventArgs e)
 {
     BigInteger p = PrimeNumberGenerator.GenerateLargePrime(155);
     BigInteger q = PrimeNumberGenerator.GenerateLargePrime(152);
     BigInteger n = p * q;
     BigInteger publ_e = PrimeNumberGenerator.GenerateLargePrime(6);
     RSAKey publicKey = new RSAKey(n, publ_e);
     inputPublicModulus.Text = publicKey.getModulus().ToString();
     inputPublicExponent.Text = publicKey.getExponent().ToString();
 }
 private void btnGeneratePrivateKey_Click(object sender, EventArgs e)
 {
     RSAKey privateKey;
     RSAKey publicKey;
     BigInteger encrypted;
     BigInteger decrypted;
     BigInteger test = new BigInteger(11);
     do
     {
         BigInteger p = PrimeNumberGenerator.GenerateLargePrime(155);
         BigInteger q = PrimeNumberGenerator.GenerateLargePrime(152);
         BigInteger n = p * q;
         BigInteger fi = (p - 1) * (q - 1);
         BigInteger publ_e = genCoPrime(fi);
         BigInteger d = modInverse(publ_e, fi);
         
         privateKey = new RSAKey(n, d);
         publicKey = new RSAKey(n, publ_e);
         encrypted = RSAPKCS1V1_5Signature.RSASP1(privateKey, test);
         decrypted = RSAPKCS1V1_5Signature.RSAVP1(publicKey, encrypted);
     } while (test != decrypted);
     //BigInteger n = BigInteger.Parse("145906768007583323230186939349070635292401872375357164399581871019873438799005358938369571402670149802121818086292467422828157022922076746906543401224889672472407926969987100581290103199317858753663710862357656510507883714297115637342788911463535102712032765166518411726859837988672111837205085526346618740053");
     //BigInteger publ_e = BigInteger.Parse("65537");
     //BigInteger d = BigInteger.Parse("89489425009274444368228545921773093919669586065884257445497854456487674839629818390934941973262879616797970608917283679875499331574161113854088813275488110588247193077582527278437906504015680623423550067240042466665654232383502922215493623289472138866445818789127946123407807725702626644091036502372545139713");
     
     inputPrivateModulus.Text = privateKey.getModulus().ToString();
     inputPrivateExponent.Text = privateKey.getExponent().ToString();
     inputPublicModulus.Text = publicKey.getModulus().ToString();
     inputPublicExponent.Text = publicKey.getExponent().ToString();
 }
 public static bool verify(RSAKey K, String M, BigInteger S)
 {
     int modBits = bitLength(S);
     int k = (modBits + 7) / 8;
     return verify(K, M, I2OSP(S, k));
 }
 /**
  * Signature verification operation.
  * 
  *  @param K signer's RSA public key
  *  @param M message whose signature is to be verified, an octet string
  *  @param S signature to be verified, an octet string of length k, where
  *           k is the length in octets of the RSA modulus n
  *  
  *  @return true/false - "valid signature"/"invalid signature"
  */
 public static bool verify(RSAKey K, String M, byte[] S)
 {
     // 1. Length checking: If the length of the signature S is not k octets,
     // output "invalid signature" and stop.
     int modBits = bitLength(K.getModulus());
     int k = (modBits + 7) / 8;
     if (S.Length != k)
         return false;
     // 2. RSA verification:
     // a. Convert the signature S to an integer signature representative
     // s (see Section 4.2): s = OS2IP (S).
     BigInteger s = OS2IP(S);
     // b. Apply the RSAVP1 verification primitive (Section 5.2.2) to the
     // RSA public key (n, e) and the signature representative s to
     // produce an integer message representative m:
     // m = RSAVP1 ((n, e), s).
     // If RSAVP1 outputs "signature representative out of range,"
     // output "invalid signature" and stop.
     BigInteger m;
     try
     {
         m = RSAVP1(K, s);
     }
     catch (ArgumentException x)
     {
         return false;
     }
     // c. Convert the message representative m to an encoded message EM
     // of length k octets (see Section 4.1): EM = I2OSP (m, k).
     // If I2OSP outputs "integer too large," output "invalid signature"
     // and stop.
     byte[] EM;
     try
     {
         EM = I2OSP(m, k);
     }
     catch (ArgumentException x)
     {
         return false;
     }
     // 3. EMSA-PKCS1-v1_5 encoding: Apply the EMSA-PKCS1-v1_5 encoding
     // operation (Section 9.2) to the message M to produce a second
     // encoded message EM' of length k octets:
     // EM' = EMSA-PKCS1-V1_5-ENCODE (M, k).
     // If the encoding operation outputs "message too long," output
     // "message too long" and stop. If the encoding operation outputs
     // "intended encoded message length too short," output "RSA modulus
     // too short" and stop.
     byte[] EMp = EMSA_PKCS1_V1_5_ENCODE(M, k).Reverse().ToArray();
     // 4. Compare the encoded message EM and the second encoded message EM'.
     // If they are the same, output "valid signature"; otherwise, output
     // "invalid signature."
     for (int i = 0; i < EM.Length; i++)
     {
         if (EM[i] != EMp[i])
         {
             return false;
         }
     }
         return true;
 }
 /**
  * Signature generation operation.
  * 
  * @param K signer's RSA private key
  * @param M message to be signed, an octet string
  * @return signature, an octet string of length k, where k is the length in octets of the RSA modulus n
  */
 public static byte[] sign(RSAKey K, String M)
 {
     // 1. EMSA-PKCS1-v1_5 encoding: Apply the EMSA-PKCS1-v1_5 encoding
     // operation (Section 9.2) to the message M to produce an encoded
     // message EM of length k octets:
     //
     // EM = EMSA-PKCS1-V1_5-ENCODE (M, k).
     //
     // If the encoding operation outputs "message too long," output
     // "message too long" and stop. If the encoding operation outputs
     // "intended encoded message length too short," output "RSA modulus
     // too short" and stop.
     int modBits = bitLength(K.getModulus());
     int k = (modBits + 7) / 8;
     byte[] EM = EMSA_PKCS1_V1_5_ENCODE(M, k);
     BigInteger test = OS2IP(EM);
     // 2. RSA signature:
     // a. Convert the encoded message EM to an integer message epresentative
     // m (see Section 4.2): m = OS2IP (EM).
     BigInteger m = OS2IP(EM);
     // b. Apply the RSASP1 signature primitive (Section 5.2.1) to the RSA
     // private key K and the message representative m to produce an
     // integer signature representative s: s = RSASP1 (K, m).
     BigInteger s = RSASP1(K, m);
     // c. Convert the signature representative s to a signature S of length
     // k octets (see Section 4.1): S = I2OSP (s, k).
     // 3. Output the signature S.
     return I2OSP(s, k);
 }
 /**
  * An implementation of the RSAVP method: Assuming that the designated
  * RSA public key is a valid one, this method computes a message
  * representative for the designated signature representative
  * generated by an RSA private key, for a message intended for the holder of
  * the designated RSA public key.
  * 
  * @param K the RSA public key.
  * @param s the signature representative, an integer between
  *          0 and n - 1, where n is the RSA modulus.
  * @return a message representative: an integer between 0
  *         and n - 1, where n is the RSA modulus.
  */
 public static BigInteger RSAVP1(RSAKey K, BigInteger s)
 {
     // 1. If the representative m is not between 0 and n - 1, output
     // "representative out of range" and stop.
     BigInteger n = K.getModulus();
     if (s.CompareTo(BigInteger.Zero) < 0 || s.CompareTo(n - BigInteger.One) > 0)
         throw new ArgumentException();
     // 2. Let c = m^e mod n.
     BigInteger e = K.getExponent();
     BigInteger result = BigInteger.ModPow(s, e, n); ;
     // 3. Output c.
     return result;
 }