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); }
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(); }
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 bool relatifPrimaD(ulong v) { bool result = true; foreach (ulong t in TN) { result = result & Kripto.IsRelatifPrima(v, t); } return(result); }
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; }
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(); }
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"; } }
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(); }
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(); } }
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"); } }
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 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"); } }
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]; } } }
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"); } }
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); }
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(); }
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"); } }
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"); } }