MartinS
MartinS

Reputation: 751

ElGamal C# implementation

I want to implement ElGamal encryption. I need this for my school work but when I want do decryption the last step is always 0 cause of (b/Math.Pow(a,x))%primenumber is always less then 1.

Here is the keys generation:

public void GenerateKey() {
    this.x = 3;
    this.prvocislo = PrimeGen.findPrimes(29).Max(); //prime number
    this.g = this.prvocislo % 12;
    this.y = Convert.ToInt32(Math.Pow(this.g, this.x) % this.prvocislo);
    this.k = 23;//601}

Here is encrypt function:

public string Encrypt(string word) {
            List<string> words = new List<string>();

            words = PrimeGen.SplitToArray(word, 2);

            string encrypted="";

            string sss = PrimeGen.GetStringFromBytes(PrimeGen.GetBytesFromInt(PrimeGen.GetIntFromBytes(PrimeGen.GetBytesFromString("ah")))); //returns ah so conversion works
            foreach (string s in words)
            {
                int a = Convert.ToInt32(Math.Pow(g,k) % prvocislo);
                int b = Convert.ToInt32((Math.Pow(y, k) * PrimeGen.GetIntFromBytes(PrimeGen.GetBytesFromString(s))) % prvocislo);
                string aS = PrimeGen.GetStringFromBytes(PrimeGen.INT2LE(a + posun));
                string bS = PrimeGen.GetStringFromBytes(PrimeGen.INT2LE(b + posun));
                encrypted = encrypted + aS + bS;
            }
            return encrypted;

        }

Here is my decrypt function:

   public string Decrypt(string ElgamalEncrypted) {
            string decrypted = "";
            for (int i = 0; i < ElgamalEncrypted.Length; i = i + 2) {
                string aS = ElgamalEncrypted.Substring(i, 2);
                string bS = ElgamalEncrypted.Substring(i + 2, 2);
                int a = PrimeGen.GetIntFromBytes(PrimeGen.GetBytesFromString(aS)) - posun;
                int b = PrimeGen.GetIntFromBytes(PrimeGen.GetBytesFromString(bS)) - posun;
                if(b==0) b=1;
                if (a == 0) a = 1;
                decrypted=decrypted+PrimeGen.GetStringFromBytes(PrimeGen.GetBytesFromInt(Convert.ToInt32(((b/Math.Pow(a,x))%prvocislo))));


            }
            return decrypted;
        }

Upvotes: 1

Views: 5952

Answers (1)

CodesInChaos
CodesInChaos

Reputation: 108790

You're using Math.Pow(base, exponent) % modulus for modular exponentiation. That doesn't work because floating points can't represent the large integers crypto needs. Use System.Numerics.BigInteger.ModPow(base, exponent, modulus) instead.

The division probably doesn't work because you use integer division, instead of multiplying with the modular multiplicative inverse of the right side.

Upvotes: 3

Related Questions