Beispiel #1
0
        private void buttonEnkripsi_Click(object sender, EventArgs e)
        {
            ClearEnkrip();
            string text = textBoxEnkripsiPlainText.Text;
            int    i    = 1;

            dataGridViewProsesEnkripsi.Rows.Add("Plaintext : " + text);
            dataGridViewProsesEnkripsi.Rows.Add("M = MM");
            dataGridViewProsesEnkripsi.Rows.Add("C = M ^ 2 mod N");
            foreach (char c in text)
            {
                dataGridViewProsesEnkripsi.Rows.Add();
                int    now     = (int)c;
                string binary  = now.ToBin(8);
                int    duaKali = (now << 8) + now;
                ulong  res     = Kripto.MultiplyModulo((ulong)duaKali, (ulong)duaKali, N);
                cipher.Add(res);
                dataGridViewProsesEnkripsi.Rows.Add(c + " = " + now + " = " + binary);
                now = dataGridViewProsesEnkripsi.RowCount;
                dataGridViewProsesEnkripsi.Rows.Add("M" + i + " = " + binary + " " + binary + " = " + duaKali);
                if ((ulong)duaKali > N)
                {
                    dataGridViewProsesEnkripsi[0, now].Style.BackColor = Color.Red;
                    dataGridViewProsesEnkripsi.Rows.Add("Pesan lebih besar dari N(" + duaKali + ">" + N + "), silakan cari prima lain jika ingin mengenkripsi pesan ini");
                    return;
                }
                dataGridViewProsesEnkripsi.Rows.Add("C" + i + " = (" + duaKali + ")^2 mod " + N + " = " + res);
                i++;
            }
            buttonDekripsi.Enabled = true;
        }
 private void buttonShowPrime_Click(object sender, EventArgs e)
 {
     if (numericUpDownDari.Value + 10000 < numericUpDownSampai.Value && MessageBox.Show("Range terlalu besar, lanjukan?", "Prima range", MessageBoxButtons.YesNo) == DialogResult.No)
     {
         return;
     }
     dataGridViewNotSortAblePrima.DataSource = Kripto.GetPrime((int)numericUpDownDari.Value, (int)numericUpDownSampai.Value);
 }
Beispiel #3
0
        private void buttonCalculate_Click(object sender, EventArgs e)
        {
            int num = Convert.ToInt32(numericUpDownNumber.Value);
            int pow = Convert.ToInt32(numericUpDownPower.Value);
            int div = Convert.ToInt32(numericUpDownDivisor.Value);

            textBoxResult.Text = QuickModulo(num, pow, div).ToString();
            textBox1.Text      = Kripto.QuickModulo(num, pow, div).ToString();
        }
Beispiel #4
0
        private void buttonHitungD_Click(object sender, EventArgs e)
        {
            ClearKey();
            if (ulong.TryParse(textBoxE.Text, out E))
            {
                ulong max = Math.Max(P, Q) + 1;
                if (E > TN[3] - 1 || E < max)
                {
                    MessageBox.Show("E antara " + max + " sampai " + (TN[3] - 1));
                }
                else if (relatifPrimaD(E))
                {
                    dataGridViewNotSortAbleEEA.Columns.Add("P1", "P1");
                    dataGridViewNotSortAbleEEA.Rows.Add("P = " + P);
                    dataGridViewNotSortAbleEEA.Rows.Add("Q = " + Q);
                    dataGridViewNotSortAbleEEA.Rows.Add("N = " + N);
                    dataGridViewNotSortAbleEEA.Rows.Add("\u03D5(n)(p+1)(q+1) = " + TN[0]);
                    dataGridViewNotSortAbleEEA.Rows.Add("\u03D5(n)(p+1)(q-1) = " + TN[1]);
                    dataGridViewNotSortAbleEEA.Rows.Add("\u03D5(n)(p-1)(q+1) = " + TN[2]);
                    dataGridViewNotSortAbleEEA.Rows.Add("\u03D5(n)(p-1)(q-1) = " + TN[3]);
                    dataGridViewNotSortAbleEEA.Rows.Add("E = " + E);
                    for (int i = 0; i < TN.Length; i++)
                    {
                        D[i] = Kripto.InversModulo(E, TN[i], dataGridViewNotSortAbleEEA);
                    }
                    dataGridViewNotSortAbleEEA.Rows.Add("D(p+1)(q+1) = " + D[0]);
                    dataGridViewNotSortAbleEEA.Rows.Add("D(p+1)(q-1) = " + D[1]);
                    dataGridViewNotSortAbleEEA.Rows.Add("D(p-1)(q+1) = " + D[2]);
                    dataGridViewNotSortAbleEEA.Rows.Add("D(p-1)(q-1) = " + D[3]);

                    textBoxDPPlusQPlus.Text = D[0].ToString();
                    textBoxDPPlusQMin.Text  = D[1].ToString();
                    textBoxDPMinQPlus.Text  = D[2].ToString();
                    textBoxDPMinQMin.Text   = D[3].ToString();

                    int   t = 0;
                    ulong x = N;
                    while (x > 1)
                    {
                        t++;
                        x >>= 1;
                    }
                    numericUpDownBlockSize.Maximum = t;
                    numericUpDownBlockSize.Value   = t;
                    buttonEnkripsi.Enabled         = true;
                }
                else
                {
                    MessageBox.Show(E + " tidak relatif prima");
                }
            }
            else
            {
                MessageBox.Show("Cek E");
            }
        }
Beispiel #5
0
        private bool relatifPrimaD(ulong v)
        {
            bool result = true;

            foreach (ulong t in TN)
            {
                result = result & Kripto.IsRelatifPrima(v, t);
            }
            return(result);
        }
Beispiel #6
0
        private void buttonEnkripsi_Click(object sender, EventArgs e)
        {
            ClearEnkrip();
            if (textBoxEnkripsiPlainText.Text.Length == 0)
            {
                MessageBox.Show("Plaintext kosong");
                return;
            }
            blokSize = (int)numericUpDownBlockSize.Value;
            string        text = textBoxEnkripsiPlainText.Text;
            string        now;
            StringBuilder plainBiner = new StringBuilder();

            foreach (char c in text)
            {
                plainBiner.Append(((int)c).ToBin(8));
            }
            dataGridViewProsesEnkripsi.Rows.Add("Plaintext : " + text);
            dataGridViewProsesEnkripsi.Rows.Add("Ukuran Blok = " + blokSize);
            dataGridViewProsesEnkripsi.Rows.Add();
            dataGridViewProsesEnkripsi.Rows.Add("Plaintext Biner : " + plainBiner.ToString());
            dataGridViewProsesEnkripsi.Rows.Add("C = M ^ E mod N");
            int i = 1;

            while (plainBiner.Length > 0)
            {
                dataGridViewProsesEnkripsi.Rows.Add();
                if (plainBiner.Length < blokSize)
                {
                    now = plainBiner.ToString().PadRight(blokSize, '0');
                    dataGridViewProsesEnkripsi.Rows.Add("M" + i + " = " + plainBiner.ToString());
                    dataGridViewProsesEnkripsi.Rows.Add("Tambah " + (blokSize - plainBiner.Length) + " bit 0 di belakang supaya sesuai ukuran blok");
                }
                else
                {
                    now = plainBiner.ToString(0, blokSize);
                }
                plainBiner.Remove(0, Math.Min(blokSize, plainBiner.Length));
                ulong t = now.BinToUlong();
                dataGridViewProsesEnkripsi.Rows.Add("M" + i + " = " + now + " = " + t);
                ulong c = 0;
                if (checkBoxShowEnkripsiDetail.Checked)
                {
                    dataGridViewProsesEnkripsi.Rows.Add("C" + i + " = " + t + " ^ " + E + " mod " + N);
                    c = Kripto.FastExponent(t, E, N, dataGridViewProsesEnkripsi);
                }
                else
                {
                    c = Kripto.QuickModulo(t, E, N);
                }
                cipher.Add(c);
                dataGridViewProsesEnkripsi.Rows.Add("C" + i++ + " = " + t + " ^ " + E + " mod " + N + " = " + c);
            }
            buttonDekripsi.Enabled = true;
        }
Beispiel #7
0
        private void buttonRandomD_Click(object sender, EventArgs e)
        {
            ulong max = Math.Max(P, Q) + 1;
            ulong t;

            do
            {
                t = (ulong)(random.NextDouble() * (N - max)) + max;
            } while (!Kripto.IsRelatifPrima(t, TN));
            textBoxD.Text = t.ToString();
        }
Beispiel #8
0
        private void buttonHitungY_Click(object sender, EventArgs e)
        {
            ClearKey();
            uint p, g, x;

            if (uint.TryParse(textBoxP.Text, out p) && uint.TryParse(textBoxG.Text, out g) && uint.TryParse(textBoxX.Text, out x))
            {
                P = p;
                G = g;
                X = x;
                if (!Kripto.IsMiller(P, (int)Math.Min(P, (ulong)100)))
                {
                    MessageBox.Show("P bukan prima");
                }
                else if (G >= P || G < 1)
                {
                    MessageBox.Show("G antara 1 sampai " + (P - 1));
                }
                else if (X >= P || X < 1)
                {
                    MessageBox.Show("X antara 1 sampai " + (P - 1));
                }
                else if (!Kripto.IsGeneratorModulo(g, p))
                {
                    MessageBox.Show("G bukan generator modulo P");
                }
                else
                {
                    dataGridViewNotSortAbleKey.Rows.Add("P = " + P);
                    dataGridViewNotSortAbleKey.Rows.Add("G = " + G);
                    dataGridViewNotSortAbleKey.Rows.Add("X = " + X);
                    dataGridViewNotSortAbleKey.Rows.Add("Y = G^X % P");
                    dataGridViewNotSortAbleKey.Rows.Add("Y = " + G + "^" + X + " % " + P);
                    Y = Kripto.FastExponent(G, X, P, dataGridViewNotSortAbleKey);
                    dataGridViewNotSortAbleKey.Rows.Add("Y = " + G + "^" + X + " % " + P + " = " + Y);
                    textBoxY.Text = Y.ToString();
                    int   t    = 0;
                    ulong temp = P;
                    while (temp > 1)
                    {
                        t++;
                        temp >>= 1;
                    }
                    numericUpDownBlockSize.Maximum = t;
                    numericUpDownBlockSize.Value   = t;
                    buttonEnkripsi.Enabled         = true;
                }
            }
            else
            {
                MessageBox.Show("Cek p, q dan x");
            }
        }
        private void buttonTesPrima_Click(object sender, EventArgs e)
        {
            bool isPrima = Kripto.TestPrima(Convert.ToInt64(textBoxNum.Text), 1662803);

            textBoxHasilRabinMiller.Text = "Dengan rabin miller, " + textBoxNum.Text;
            if (isPrima)
            {
                textBoxHasilRabinMiller.Text += " adalah bilangan prima";
            }
            else
            {
                textBoxHasilRabinMiller.Text += " adalah bukan bilangan prima";
            }
        }
Beispiel #10
0
        private void buttonDekripsi_Click(object sender, EventArgs e)
        {
            ClearDekrip();
            StringBuilder plainBiner = new StringBuilder();
            string        now;

            dataGridViewProsesDekripsi.Rows.Add("c = a^(p-1-x) % p");
            dataGridViewProsesDekripsi.Rows.Add("m = c.b % p");
            for (int i = 0; i < ca.Count; i++)
            {
                ulong a = ca[i];
                ulong b = cb[i];
                ulong c = 0, m = 0;
                dataGridViewProsesDekripsi.Rows.Add();
                dataGridViewProsesDekripsi.Rows.Add("c = " + a + "^(" + P + "-1-" + X + ") % " + P);
                if (checkBoxShowDekripsiDetail.Checked)
                {
                    c = Kripto.FastExponent(a, P - 1 - X, P, dataGridViewProsesDekripsi);
                }
                else
                {
                    c = Kripto.QuickModulo(a, P - 1 - X, P);
                }
                m = Kripto.MultiplyModulo(c, b, P);
                plainBiner.Append(m.ToBin(blokSize));
                dataGridViewProsesDekripsi.Rows.Add("m = (" + c + " . " + b + ") % " + P + " = " + m);
            }
            dataGridViewProsesDekripsi.Rows.Add();
            dataGridViewProsesDekripsi.Rows.Add("Plaintext Biner : " + plainBiner.ToString());
            StringBuilder plainText = new StringBuilder();

            while (plainBiner.Length > 0)
            {
                now = plainBiner.ToString(0, Math.Min(8, plainBiner.Length));
                ulong t = now.BinToUlong();
                if (t == 0)
                {
                    dataGridViewProsesDekripsi.Rows.Add(plainBiner.ToString() + " = bit yang ditambahkan");
                    break;
                }
                else
                {
                    dataGridViewProsesDekripsi.Rows.Add(now + " = " + t + " = " + (char)t);
                    plainText.Append((char)t);
                }
                plainBiner.Remove(0, Math.Min(8, plainBiner.Length));
            }
            dataGridViewProsesDekripsi.Rows.Add("Plaintext : " + plainText.ToString());
            textBoxDekripsiPlainText.Text = plainText.ToString();
        }
Beispiel #11
0
        private void buttonDekripsi_Click(object sender, EventArgs e)
        {
            ClearDekrip();
            StringBuilder plainBiner = new StringBuilder();
            string        now        = "";

            dataGridViewProsesDekripsi.Rows.Add("M  = C ^ D mod N");
            for (int i = 0; i < cipher.Count; i++)
            {
                ulong c = cipher[i];
                ulong m = 0;
                dataGridViewProsesDekripsi.Rows.Add();
                dataGridViewProsesDekripsi.Rows.Add("C" + (i + 1) + " = " + c);
                if (checkBoxShowDekripsiDetail.Checked)
                {
                    dataGridViewProsesDekripsi.Rows.Add("M" + (i + 1) + " = " + c + " ^ " + D + " mod " + N);
                    m = Kripto.FastExponent(c, D, N, dataGridViewProsesDekripsi);
                }
                else
                {
                    m = Kripto.QuickModulo(c, D, N);
                }
                now = m.ToBin(blokSize);
                plainBiner.Append(now);
                dataGridViewProsesDekripsi.Rows.Add("M" + (i + 1) + " = " + c + " ^ " + D + " mod " + N + " = " + m);
                dataGridViewProsesDekripsi.Rows.Add("M" + (i + 1) + " = " + now);
            }
            dataGridViewProsesDekripsi.Rows.Add();
            dataGridViewProsesDekripsi.Rows.Add("Plaintext Biner : " + plainBiner.ToString());
            StringBuilder plainText = new StringBuilder();

            while (plainBiner.Length > 0)
            {
                now = plainBiner.ToString(0, Math.Min(8, plainBiner.Length));
                ulong t = now.BinToUlong();
                if (t == 0)
                {
                    dataGridViewProsesDekripsi.Rows.Add(plainBiner.ToString() + " = bit yang ditambahkan");
                    break;
                }
                else
                {
                    dataGridViewProsesDekripsi.Rows.Add(now + " = " + t + " = " + (char)t);
                    plainText.Append((char)t);
                }
                plainBiner.Remove(0, Math.Min(8, plainBiner.Length));
            }
            dataGridViewProsesDekripsi.Rows.Add("Plaintext : " + plainText.ToString());
            textBoxDekripsiPlainText.Text = plainText.ToString();
        }
        private void buttonHitungCRT_Click(object sender, EventArgs e)
        {
            if (dataGridViewCRT.RowCount > 0)
            {
                long a   = Convert.ToInt32(dataGridViewCRT["number", 0].Value);
                long b   = Convert.ToInt32(dataGridViewCRT["divisor", 0].Value);
                long lcm = b;
                for (int i = 1; i < dataGridViewCRT.RowCount; i++)
                {
                    DataGridViewRow row = dataGridViewCRT.Rows[i];
                    long            num = Convert.ToInt64(row.Cells["number"].Value);
                    long            div = Convert.ToInt64(row.Cells["divisor"].Value);
                    lcm = Kripto.LCM(lcm, div);
                    long x   = num - a;
                    long inv = Kripto.InversModulo(b, div);
                    x *= inv;
                    x %= div;
                    a += b * x;
                    b *= div;
                }
                if (a < 0)
                {
                    a += lcm;
                }
                textBox1.Text = "Hasil = " + a;

                /*
                 * int n = dataGridViewCRT.RowCount;
                 * long[] arrNum = new long[n];
                 * long[] arrDiv = new long[n];
                 * for (int i = 0; i < n; i++)
                 * {
                 *  arrNum[i] = Convert.ToInt32(dataGridViewCRT["number", i].Value);
                 *  arrDiv[i] = Convert.ToInt32(dataGridViewCRT["divisor", i].Value);
                 * }
                 * textBox1.Text += " " + Kripto.ChineseRemainderTheorem(arrNum, arrDiv);
                 * //*/
            }
            else
            {
                textBox1.Clear();
            }
        }
Beispiel #13
0
        private void buttonHitungN_Click(object sender, EventArgs e)
        {
            textBoxE.Clear();
            textBoxDPMinQMin.Clear();
            textBoxN.Clear();
            textBoxTotientNPPlusQPlus.Clear();
            buttonRandomE.Enabled = false;
            buttonHitungD.Enabled = false;
            uint p, q;

            if (uint.TryParse(textBoxP.Text, out p) && uint.TryParse(textBoxQ.Text, out q))
            {
                P = p;
                Q = q;
                if (!Kripto.IsMiller(P, (int)Math.Min(P, (ulong)100)))
                {
                    MessageBox.Show("P bukan prima");
                }
                else if (!Kripto.IsMiller(Q, (int)Math.Min(Q, (ulong)100)))
                {
                    MessageBox.Show("Q bukan prima");
                }
                else
                {
                    N             = P * Q;
                    TN[0]         = (P + 1) * (Q + 1);
                    TN[1]         = (P + 1) * (Q - 1);
                    TN[2]         = (P - 1) * (Q + 1);
                    TN[3]         = (P - 1) * (Q - 1);
                    textBoxN.Text = N.ToString();
                    textBoxTotientNPPlusQPlus.Text = TN[0].ToString();
                    textBoxTotientNPPlusQMin.Text  = TN[1].ToString();
                    textBoxTotientNPMinQPlus.Text  = TN[2].ToString();
                    textBoxTotientNPMinQMin.Text   = TN[3].ToString();
                    buttonRandomE.Enabled          = true;
                    buttonHitungD.Enabled          = true;
                }
            }
            else
            {
                MessageBox.Show("Cek p dan q");
            }
        }
Beispiel #14
0
 private void buttonHitungE_Click(object sender, EventArgs e)
 {
     ClearKey();
     if (ulong.TryParse(textBoxD.Text, out D))
     {
         ulong max = Math.Max(P, Q) + 1;
         if (D >= TN || D < max)
         {
             MessageBox.Show("D antara " + max + " sampai " + (TN - 1));
         }
         else if (Kripto.IsRelatifPrima(D, TN))
         {
             dataGridViewNotSortAbleEEA.Columns.Add("P1", "P1");
             dataGridViewNotSortAbleEEA.Rows.Add("P = " + P);
             dataGridViewNotSortAbleEEA.Rows.Add("Q = " + Q);
             dataGridViewNotSortAbleEEA.Rows.Add("N = " + N);
             dataGridViewNotSortAbleEEA.Rows.Add("\u03D5(n) = " + TN);
             dataGridViewNotSortAbleEEA.Rows.Add("D = " + D);
             E = Kripto.InversModulo(D, TN, dataGridViewNotSortAbleEEA);
             dataGridViewNotSortAbleEEA.Rows.Add("E = " + E);
             textBoxE.Text = E.ToString();
             int   t    = 0;
             ulong temp = N;
             while (temp > 1)
             {
                 t++;
                 temp >>= 1;
             }
             numericUpDownBlockSize.Maximum = t;
             numericUpDownBlockSize.Value   = t;
             buttonEnkripsi.Enabled         = true;
         }
         else
         {
             MessageBox.Show(D + " dan " + TN + " tidak relatif prima");
         }
     }
     else
     {
         MessageBox.Show("Cek D");
     }
 }
Beispiel #15
0
        private void buttonHitungN_Click(object sender, EventArgs e)
        {
            ClearKey();
            uint p, q;

            if (uint.TryParse(textBoxP.Text, out p) && uint.TryParse(textBoxQ.Text, out q))
            {
                P = p;
                Q = q;
                if (!Kripto.IsMiller(P, (int)Math.Min(P, (ulong)100)))
                {
                    MessageBox.Show("P bukan prima");
                }
                else if ((P + 1) % 4 != 0)
                {
                    MessageBox.Show("P + 1 tidak habis dibagi 4");
                }
                else if (!Kripto.IsMiller(Q, (int)Math.Min(Q, (ulong)100)))
                {
                    MessageBox.Show("Q bukan prima");
                }
                else if ((Q + 1) % 4 != 0)
                {
                    MessageBox.Show("Q + 1 tidak habis dibagi 4");
                }
                else
                {
                    dataGridViewNotSortAbleEEA.Rows.Add("P = " + P);
                    dataGridViewNotSortAbleEEA.Rows.Add("Q = " + Q);
                    N = P * Q;
                    dataGridViewNotSortAbleEEA.Rows.Add("N = " + N);
                    textBoxN.Text          = N.ToString();
                    buttonEnkripsi.Enabled = true;
                }
            }
            else
            {
                MessageBox.Show("Cek p dan q");
            }
        }
Beispiel #16
0
 private void InvMixColumns(ref int[,] arr)
 {
     int[] temp = new int[4];
     int[,] mc = { { 14, 11, 13, 9 }, { 9, 14, 11, 13 }, { 13, 9, 14, 11 }, { 11, 13, 9, 14 } };
     for (int col = 0; col < 4; col++)
     {
         int res;
         for (int i = 0; i < 4; i++)
         {
             res = 0;
             for (int j = 0; j < 4; j++)
             {
                 res ^= Kripto.GF_8(mc[i, j], arr[j, col]);
             }
             temp[i] = res;
         }
         for (int i = 0; i < 4; i++)
         {
             arr[i, col] = temp[i];
         }
     }
 }
Beispiel #17
0
 private void MixColumns(ref int[,] arr)
 {
     int[] temp = new int[4];
     int[,] mc = { { 2, 3, 1, 1 }, { 1, 2, 3, 1 }, { 1, 1, 2, 3 }, { 3, 1, 1, 2 } };
     for (int col = 0; col < 4; col++)
     {
         int res;
         for (int i = 0; i < 4; i++)
         {
             res = 0;
             for (int j = 0; j < 4; j++)
             {
                 res ^= Kripto.GF_8(mc[i, j], arr[j, col]);
             }
             temp[i] = res;
         }
         for (int i = 0; i < 4; i++)
         {
             arr[i, col] = temp[i];
         }
     }
 }
 private void buttonTambah_Click(object sender, EventArgs e)
 {
     if (Kripto.IsNumber(textBoxNumber.Text) && Kripto.IsNumber(textBoxDivisor.Text))
     {
         int num = Convert.ToInt32(textBoxNumber.Text);
         int div = Convert.ToInt32(textBoxDivisor.Text);
         if (div == 0)
         {
             MessageBox.Show("Divisor shouldn't equals 0");
         }
         else if (num == 0)
         {
             MessageBox.Show("Number shouldn't equals 0");
         }
         else if (num == div)
         {
             MessageBox.Show("Number shouldn't equals divisor");
         }
         else
         {
             if (num > div)
             {
                 num %= div;
             }
             if (num < 0)
             {
                 num += (num / div - 1) * -div;
             }
             dataGridViewCRT.Rows.Add(new object[] { "X =", num, "mod", div });
             textBoxNumber.Clear();
             textBoxDivisor.Clear();
         }
     }
     else
     {
         MessageBox.Show("Input Number");
     }
 }
Beispiel #19
0
        private ulong Lucas(ulong value, ulong key, ulong N, DataGridViewNotSortAble grid, bool printProcess)
        {
            if (key == 0)
            {
                return(2);
            }
            if (key == 1)
            {
                return(value);
            }
            ulong a0 = 2;
            ulong a1 = value;
            long  a2;

            if (printProcess)
            {
                grid.Rows.Add("V[0](" + value + ",1) = 2");
                grid.Rows.Add("V[1](" + value + ",1) = " + value);
            }
            for (ulong i = 2; i <= key; i++)
            {
                a2 = (long)(Kripto.MultiplyModulo(value, a1, N) - a0);
                if (a2 < 0)
                {
                    a2 += (long)N;
                }
                if (printProcess)
                {
                    grid.Rows.Add();
                    grid.Rows.Add("V[" + i + "](" + value + ",1) = (P * V[" + (i - 1) + "](" + value + ",1) - V[" + (i - 2) + "](" + value + ",1)) mod " + N);
                    grid.Rows.Add("V[" + i + "](" + value + ",1) = (" + value + " * " + a1 + " - " + a0 + ") mod " + N);
                    grid.Rows.Add("V[" + i + "](" + value + ",1) = " + a2);
                }
                a0 = a1;
                a1 = (ulong)a2;
            }
            return(a1);
        }
Beispiel #20
0
        private void buttonDekripsi_Click(object sender, EventArgs e)
        {
            ClearDekrip();
            dataGridViewProsesDekripsi.Rows.Add("a = P^-1 mod Q");
            dataGridViewProsesDekripsi.Rows.Add("b = Q^-1 mod P");
            dataGridViewProsesDekripsi.Rows.Add("r = c ^ ((P+1)/4) mod P");
            dataGridViewProsesDekripsi.Rows.Add("s = c ^ ((Q+1)/4) mod Q");
            dataGridViewProsesDekripsi.Rows.Add("x = (a * P * s + b * Q * r) mod N");
            dataGridViewProsesDekripsi.Rows.Add("y = (a * P * s - b * Q * r) mod N");
            dataGridViewProsesDekripsi.Rows.Add("M1 = x");
            dataGridViewProsesDekripsi.Rows.Add("M2 = N - x");
            dataGridViewProsesDekripsi.Rows.Add("M1 = y");
            dataGridViewProsesDekripsi.Rows.Add("M2 = N - y");
            dataGridViewProsesDekripsi.Rows.Add();
            ulong a = Kripto.InversModulo(P, Q, dataGridViewProsesDekripsi);
            ulong b = Kripto.InversModulo(Q, P, dataGridViewProsesDekripsi);

            dataGridViewProsesDekripsi.Rows.Add("a = " + P + "^-1 mod " + Q + " = " + a);
            dataGridViewProsesDekripsi.Rows.Add("b = " + Q + "^-1 mod " + P + " = " + b);
            int i = 1;

            ulong[]       arr       = new ulong[4];
            List <ulong>  m         = new List <ulong>();
            StringBuilder plaintext = new StringBuilder();
            ulong         p4        = (P + 1) / 4;
            ulong         q4        = (Q + 1) / 4;

            foreach (ulong c in cipher)
            {
                ulong r     = Kripto.QuickModulo(c, p4, P);
                ulong s     = Kripto.QuickModulo(c, q4, Q);
                ulong left  = Kripto.MultiplyModulo(Kripto.MultiplyModulo(a, P, N), s, N);
                ulong right = Kripto.MultiplyModulo(Kripto.MultiplyModulo(b, Q, N), r, N);
                ulong x     = (left + right) % N;
                ulong y;
                if (right > left)
                {
                    y = N - right + left;
                }
                else
                {
                    y = (Kripto.MultiplyModulo(Kripto.MultiplyModulo(a, P, N), s, N) - Kripto.MultiplyModulo(Kripto.MultiplyModulo(b, Q, N), r, N)) % N;
                }
                arr[0] = x;
                arr[1] = N - x;
                arr[2] = y;
                arr[3] = N - y;
                dataGridViewProsesDekripsi.Rows.Add();
                dataGridViewProsesDekripsi.Rows.Add("r" + i + " = " + c + " ^ ((" + P + "+1)/4) mod " + P + " = " + r);
                dataGridViewProsesDekripsi.Rows.Add("s" + i + " = " + c + " ^ ((" + Q + "+1)/4) mod " + Q + " = " + s);
                dataGridViewProsesDekripsi.Rows.Add("x" + i + " = (" + a + " * " + P + " * " + s + " + " + b + " * " + Q + " * " + r + ") mod " + N + " = " + x);
                dataGridViewProsesDekripsi.Rows.Add("y" + i + " = (" + a + " * " + P + " * " + s + " - " + b + " * " + Q + " * " + r + ") mod " + N + " = " + y);
                int idx = dataGridViewProsesDekripsi.RowCount;
                for (int j = 0; j < 4; j++)
                {
                    ulong t = arr[j];
                    dataGridViewProsesDekripsi.Rows.Add("M" + (j + 1) + " = " + arr[j] + " = " + arr[j].ToBin(16));
                    if (((t >> 8) & ((1 << 8) - 1)) == (t & ((1 << 8) - 1)))
                    {
                        m.Add(t);
                        dataGridViewProsesDekripsi[0, idx + j].Style.BackColor = Color.LimeGreen;
                    }
                }
                i++;
            }
            dataGridViewProsesDekripsi.Rows.Add();
            i = 1;
            foreach (ulong t in m)
            {
                dataGridViewProsesDekripsi.Rows.Add("M" + i + " = " + t + " = " + t.ToBin(16));
                dataGridViewProsesDekripsi.Rows.Add("M" + i++ + " = " + (t >> 8).ToBin(8) + " = " + (t >> 8) + " = " + (char)(t >> 8));
                plaintext.Append((char)(t >> 8));
            }
            textBoxDekripsiPlainText.Text = plaintext.ToString();
        }
Beispiel #21
0
        private void buttonCalculate_Click(object sender, EventArgs e)
        {
            Regex hexa = new Regex(@"^[0-9A-F]+$");

            if (hexa.IsMatch(textBoxNumber1.Text) && hexa.IsMatch(textBoxNumber2.Text) && hexa.IsMatch(textBoxDivisor.Text))
            {
                try
                {
                    int    num1 = textBoxNumber1.Text.HexToInt();
                    int    num2 = textBoxNumber2.Text.HexToInt();
                    int    div = textBoxDivisor.Text.HexToInt();
                    string bin1 = num1.ToBin();
                    string bin2 = num2.ToBin();
                    string binDiv = div.ToBin();
                    int    len = 5 * (bin1.Length + bin2.Length - 1) / 4;
                    string now, binary;
                    string line = DuplicateChar('-', len);
                    dataGridViewCalcBiner.Rows.Clear();
                    dataGridViewCalcHex.Rows.Clear();

                    InsertDataGridPolinomial(ToPolinomial(bin1));
                    binary = InsertSpace(bin1);
                    now    = string.Concat(DuplicateChar(' ', len - binary.Length), binary);
                    InsertDataGrid(now);

                    InsertDataGridPolinomial(ToPolinomial(bin2));
                    binary = InsertSpace(bin2);
                    now    = string.Concat(DuplicateChar(' ', len - binary.Length), binary);
                    InsertDataGrid(now);

                    InsertDataGridPolinomial(line);
                    InsertDataGrid(line);
                    string binMul = Multiply(bin1, bin2, bin2.Length - 1);

                    line += "XOR";
                    InsertDataGridPolinomial(line);
                    InsertDataGrid(line);

                    InsertDataGridPolinomial(ToPolinomial(binMul));
                    binary = InsertSpace(binMul);
                    now    = string.Concat(DuplicateChar(' ', len - binary.Length), binary);
                    InsertDataGrid(now);

                    int ct = 64;
                    if (binMul.Length > 8)
                    {
                        binDiv = string.Concat(binDiv, DuplicateChar('0', binMul.Length - binDiv.Length));
                    }
                    while (binMul.Length > 8 && ct-- > 0)
                    {
                        InsertDataGridPolinomial(ToPolinomial(binDiv));
                        binary = InsertSpace(binDiv);
                        now    = string.Concat(DuplicateChar(' ', len - binary.Length), binary);
                        InsertDataGrid(now);

                        InsertDataGridPolinomial(line);
                        InsertDataGrid(line);
                        binMul = XOR(binMul, binDiv);
                        InsertDataGridPolinomial(ToPolinomial(binMul));
                        binary = InsertSpace(binMul);
                        now    = string.Concat(DuplicateChar(' ', len - binary.Length), binary);
                        InsertDataGrid(now);
                        while (binMul[0] == '0')
                        {
                            binMul = binMul.Remove(0, 1);
                            binDiv = binDiv.Remove(binDiv.Length - 1, 1);
                        }
                    }
                    int gf = binMul.BinToInt();
                    InsertDataGridPolinomial(ToPolinomial(binMul));
                    InsertDataGrid(now + " = " + gf.ToHex() + "(16) = " + Kripto.GF_8_Hexa(num1, num2));
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
            }
            else
            {
                MessageBox.Show("Hexa tidak valid");
            }
        }
Beispiel #22
0
 private void buttonEnkripsi_Click(object sender, EventArgs e)
 {
     ClearEnkrip();
     if (ulong.TryParse(textBoxK.Text, out K))
     {
         if (K > P - 2 || K < 1)
         {
             MessageBox.Show("K antara 1 sampai " + (P - 2));
         }
         else if (textBoxEnkripsiPlainText.Text.Length == 0)
         {
             MessageBox.Show("Plaintext kosong");
         }
         else
         {
             blokSize = (int)numericUpDownBlockSize.Value;
             string        text = textBoxEnkripsiPlainText.Text;
             string        now;
             StringBuilder plainBiner = new StringBuilder();
             foreach (char c in text)
             {
                 plainBiner.Append(((int)c).ToBin(8));
             }
             dataGridViewProsesEnkripsi.Rows.Add("Plaintext : " + text);
             dataGridViewNotSortAbleKey.Rows.Add("K = " + K);
             dataGridViewProsesEnkripsi.Rows.Add("Ukuran Blok = " + blokSize);
             dataGridViewProsesEnkripsi.Rows.Add();
             dataGridViewProsesEnkripsi.Rows.Add("Plaintext Biner : " + plainBiner.ToString());
             dataGridViewProsesEnkripsi.Rows.Add("a = g^k % p");
             dataGridViewProsesEnkripsi.Rows.Add("b = m.y^k % p");
             int i = 1;
             while (plainBiner.Length > 0)
             {
                 dataGridViewProsesEnkripsi.Rows.Add();
                 dataGridViewProsesEnkripsi.Rows.Add();
                 if (plainBiner.Length < blokSize)
                 {
                     now = plainBiner.ToString().PadRight(blokSize, '0');
                     dataGridViewProsesEnkripsi.Rows.Add("M" + i + " = " + plainBiner.ToString());
                     dataGridViewProsesEnkripsi.Rows.Add("Tambah " + (blokSize - plainBiner.Length) + " bit 0 di belakang supaya sesuai ukuran blok");
                 }
                 else
                 {
                     now = plainBiner.ToString(0, blokSize);
                 }
                 plainBiner.Remove(0, Math.Min(blokSize, plainBiner.Length));
                 ulong t = now.BinToUlong();
                 dataGridViewProsesEnkripsi.Rows.Add("M" + i + " = " + now + " = " + t);
                 ulong a = 0, b = 0;
                 if (checkBoxShowEnkripsiDetail.Checked)
                 {
                     dataGridViewProsesEnkripsi.Rows.Add("a = " + G + "^" + K + " % " + P);
                     a = Kripto.FastExponent(G, K, P, dataGridViewProsesEnkripsi);
                 }
                 else
                 {
                     a = Kripto.QuickModulo(G, K, P);
                 }
                 dataGridViewProsesEnkripsi.Rows.Add("a = " + G + "^" + K + " % " + P + " = " + a);
                 dataGridViewProsesEnkripsi.Rows.Add();
                 if (checkBoxShowEnkripsiDetail.Checked)
                 {
                     dataGridViewProsesEnkripsi.Rows.Add("b = " + t + "." + Y + "^" + K + " % " + P);
                     dataGridViewProsesEnkripsi.Rows.Add(Y + "^" + K + " % " + P);
                     b = Kripto.FastExponent(Y, K, P, dataGridViewProsesEnkripsi);
                     dataGridViewProsesEnkripsi.Rows.Add(Y + "^" + K + " % " + P + " = " + b);
                     dataGridViewProsesEnkripsi.Rows.Add("b = (" + t + "." + b + ") % " + P);
                 }
                 else
                 {
                     b = Kripto.QuickModulo(Y, K, P);
                 }
                 b = Kripto.MultiplyModulo(b, (ulong)t, P);
                 dataGridViewProsesEnkripsi.Rows.Add("b = " + t + "." + Y + "^" + K + " % " + P + " = " + b);
                 ca.Add(a);
                 cb.Add(b);
             }
             buttonDekripsi.Enabled = true;
         }
     }
     else
     {
         MessageBox.Show("Cek k");
     }
 }