示例#1
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");
            }
        }
        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();
            }
        }
示例#3
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");
     }
 }
示例#4
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();
        }