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(); } }
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"); } }
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(); }