public static DHRovnice Run(ListBox listBox, long Q1, long mod1, long Q2, long mod2) { if (mod2 > mod1) { long mezi = mod2; mod2 = mod1; mod1 = mezi; mezi = Q2; Q2 = Q1; Q1 = mezi; } DHRovnice rovnice1 = new DHRovnice(); DHRovnice rovnice2 = new DHRovnice(); long prava1 = Q2 * mod1; string lajna = mod1.ToString() + "c" + " ≡ " + Q2.ToString() + "∙" + mod1.ToString() + " ≡ " + prava1.ToString(); listBox.Items.Add(lajna); long prava2 = Q1 * mod2; lajna = mod2.ToString() + "c" + " ≡ " + Q1.ToString() + "∙" + mod2.ToString() + " ≡ " + prava2.ToString(); listBox.Items.Add(lajna); listBox.Items.Add("--------------------------------------"); rovnice1.Prava = prava1; rovnice2.Prava = prava2; rovnice1.Leva = mod1; rovnice2.Leva = mod2; while (rovnice1.Leva > 1 && rovnice2.Leva > 1) { DHRovnice taVetsi; DHRovnice taMensi; if (rovnice1.Leva > rovnice2.Leva) { taVetsi = rovnice1; taMensi = rovnice2; } else { taVetsi = rovnice2; taMensi = rovnice1; } int q = (int)(taVetsi.Leva / taMensi.Leva); long novaLeva = taVetsi.Leva - q * taMensi.Leva; long novaPrava = taVetsi.Prava - q * taMensi.Prava; lajna = novaLeva.ToString() + "c" + " ≡ " + taVetsi.Prava.ToString() + " - (" + q.ToString() + "∙" + taMensi.Prava.ToString() + ") ≡ " + novaPrava.ToString(); taVetsi.Leva = novaLeva; taVetsi.Prava = novaPrava; listBox.Items.Add(lajna); } long bigModul = mod1 * mod2; long theCislo = rovnice1.Leva > rovnice2.Leva ? rovnice2.Prava : rovnice1.Prava; theCislo = theCislo % bigModul; lajna = "c ≡ " + theCislo.ToString() + " (mod " + (bigModul).ToString() + ")"; if (theCislo < 0) { theCislo = theCislo + bigModul; lajna = lajna + " ≡ " + theCislo.ToString() + "(mod " + bigModul.ToString() + ")"; } listBox.Items.Add(lajna); rovnice1.Prava = theCislo; rovnice2.Prava = theCislo; rovnice1.Leva = bigModul; rovnice2.Leva = bigModul; return(rovnice1.Leva > rovnice2.Leva ? rovnice2 : rovnice1); }
public static void Dekodovani(ListBox listBox, long p, long q, long m) { if (p % 4 != 3 || q % 4 != 3) { throw new Exception("koeficienty nejsou delitelne 4 se zbytekem 3 "); } long m1, m2; m1 = m % p; m2 = m % q; string lajna = m.ToString() + "mod " + p + " ≡ " + m1; listBox.Items.Add(lajna); listBox.Items.Add(m.ToString() + "mod " + q + " ≡ " + m2); listBox.Items.Add(" "); lajna = "první m = √" + m1 + "^" + p + " ≡ ±"; long pRed = (p + 1) / 4; lajna = lajna + m1 + "^" + pRed; listBox.Items.Add(lajna); m1 = Umocnovac.Run(listBox, m1, pRed, p); if ((-(m1 - p)) % p < m1) { lajna = "m ≡ ±" + m1; m1 = (-(m1 - p)) % p; listBox.Items.Add(lajna + " ≡ ±" + m1); } else { listBox.Items.Add("m ≡ ±" + m1); } listBox.Items.Add(" "); lajna = "druhé m = √" + m2 + "^" + q + " ≡ ±"; long qRed = (q + 1) / 4; lajna = lajna + m2 + "^" + qRed; listBox.Items.Add(lajna); m2 = Umocnovac.Run(listBox, m2, qRed, q); if ((-(m2 - q)) % q < m2) { lajna = "m ≡ ±" + m2; m2 = (-(m2 - q)) % q; listBox.Items.Add(lajna + " ≡ ±" + m2); } else { listBox.Items.Add("m ≡ ±" + m2); } listBox.Items.Add("**************************************"); listBox.Items.Add("pro m ≡ " + m1 + " mod " + p + " & m ≡ " + m2 + "mod " + q); DHRovnice rovnice1 = Rovnice.Run(listBox, m1, p, m2, q); listBox.Items.Add("pro m ≡ " + (-m1) + " mod " + p + " & m ≡ " + m2 + "mod " + q); DHRovnice rovnice2 = Rovnice.Run(listBox, -m1, p, m2, q); listBox.Items.Add("**************************************"); long vysledek1 = rovnice1.Prava; long vysledek2 = -(vysledek1 - rovnice1.Leva) % rovnice1.Leva; long vysledek3 = rovnice2.Prava; long vysledek4 = -(vysledek3 - rovnice2.Leva) % rovnice2.Leva; listBox.Items.Add("vysledek: ±" + vysledek1 + ", ±" + vysledek2 + " | " + "±" + vysledek3 + ", " + "±" + vysledek4); listBox.Items.Add(" "); }
private void button3_Click(object sender, EventArgs e) { long message = Int32.Parse(m.Text); long qE = Int32.Parse(E.Text); long Q = Int32.Parse(q.Text); long P = Int32.Parse(p.Text); listBox2.Items.Clear(); string lajna = "φ(" + P.ToString() + "∙" + Q.ToString() + ")" + " = "; long Pz = P; long Qz = Q; P = Phi.phi((int)P); Q = Phi.phi((int)Q); long d = P * Q; lajna = lajna + P.ToString() + "∙" + Q.ToString() + " = " + d.ToString(); listBox2.Items.Add(lajna); lajna = d.ToString() + "d" + " ≡ " + "0"; listBox2.Items.Add(lajna); lajna = qE.ToString() + "d" + " ≡ " + "1"; listBox2.Items.Add(lajna); listBox2.Items.Add("-------------------------"); DHRovnice rovnice = Inverze.Run(listBox2, d, qE); listBox2.Items.Add("--------------------------"); long umocneni = rovnice.Prava; lajna = "m ≡" + message + "^" + umocneni + "≡"; long c1 = message % Pz; long m1 = umocneni % Phi.phi((int)Pz); lajna = lajna + c1 + "^" + m1; listBox2.Items.Add(lajna); long finalni1 = Umocnovac.Run(listBox2, c1, m1, Pz); lajna = "m" + " ≡ " + finalni1 + " (mod" + Pz + ")"; listBox2.Items.Add(lajna); long c2 = message % Qz; long m2 = umocneni % Phi.phi((int)Qz); lajna = "m ≡" + message + "^" + umocneni + "≡" + c2 + "^" + m2; listBox2.Items.Add(lajna); long finalni2 = Umocnovac.Run(listBox2, c2, m2, Qz); lajna = "m" + " ≡ " + finalni2 + " (mod" + Qz + ")"; listBox2.Items.Add(lajna); listBox2.Items.Add("-----------------------------"); Rovnice.Run(listBox2, finalni1, Pz, finalni2, Qz); }
public static void Kodovani(ListBox listBox, long p, long q, long m) { long c1 = m % p; long c2 = m % q; string lajna = "c ≡" + m + "^2" + " ≡ " + c1 + "^2" + " ≡ "; c1 = c1 * c1; c1 = c1 % p; lajna = lajna + c1 + " (mod " + p + ")"; listBox.Items.Add(lajna); lajna = "c ≡" + m + "^2" + " ≡ " + c2 + "^2" + " ≡ "; c2 = c2 * c2; c2 = c2 % q; lajna = lajna + c2 + " (mod " + q + ")"; listBox.Items.Add(lajna); DHRovnice rovnice = Rovnice.Run(listBox, c1, p, c2, q); long bigModul = rovnice.Leva; long c = rovnice.Prava; lajna = "vysledek = " + c + "(mod " + bigModul + ")"; listBox.Items.Add(lajna); }
private void button2_Click(object sender, EventArgs e) { listBox2.Items.Clear(); long message = Int32.Parse(m.Text); long qE = Int32.Parse(E.Text); long Q = Int32.Parse(q.Text); long P = Int32.Parse(p.Text); StringBuilder builder = new StringBuilder(); builder.Append("c ≡ "); builder.Append(message.ToString()); builder.Append(" ^ "); builder.Append(qE.ToString()); long c1 = message % P; long reducedE = (long)(qE % MathEngine.Phi.phi((int)P)); builder.Append(" ≡ "); builder.Append(c1); builder.Append(" ^ "); builder.Append(reducedE); listBox2.Items.Add(builder.ToString()); builder.Clear(); c1 = Umocnovac.Run(listBox2, c1, reducedE, P); builder.Append(" ≡ "); c1 = c1 % P; builder.Append(c1); builder.Append(" (mod" + P.ToString() + ")"); listBox2.Items.Add(builder.ToString()); builder.Clear(); /////////////////////////// builder.Append("c ≡ "); builder.Append(message.ToString()); builder.Append(" ^ "); builder.Append(qE.ToString()); long c2 = message % Q; long reducedE2 = qE % MathEngine.Phi.phi((int)Q); builder.Append(" ≡ "); builder.Append(c2); builder.Append(" ^ "); builder.Append(reducedE2); listBox2.Items.Add(builder.ToString()); builder.Clear(); c2 = Umocnovac.Run(listBox2, c2, reducedE2, Q); builder.Append(" ≡ "); c2 = c2 % Q; builder.Append(c2); builder.Append(" (mod" + Q.ToString()); listBox2.Items.Add(builder.ToString() + ")"); builder.Clear(); listBox2.Items.Add("------------------------------------------------------"); DHRovnice rovnice = Rovnice.Run(listBox2, c1, P, c2, Q); }
public static DHRovnice Run(ListBox listBox, long d0, long d1) { DHRovnice rovnice1 = new DHRovnice(); DHRovnice rovnice2 = new DHRovnice(); rovnice1.Leva = d0; rovnice1.Prava = 0; rovnice2.Leva = d1; rovnice2.Prava = 1; string lajna; DHRovnice taVetsi; DHRovnice taMensi; while (rovnice1.Leva > 1 && rovnice2.Leva > 1) { if (rovnice1.Leva > rovnice2.Leva) { taVetsi = rovnice1; taMensi = rovnice2; } else { taVetsi = rovnice2; taMensi = rovnice1; } int q = (int)(taVetsi.Leva / taMensi.Leva); long novaLeva = taVetsi.Leva - q * taMensi.Leva; long novaPrava = taVetsi.Prava - q * taMensi.Prava; lajna = novaLeva.ToString() + "d" + " ≡ " + taVetsi.Prava.ToString() + " - (" + q.ToString() + "∙" + taMensi.Prava.ToString() + ") ≡ " + novaPrava.ToString(); taVetsi.Leva = novaLeva; taVetsi.Prava = novaPrava; listBox.Items.Add(lajna); } taMensi = rovnice1.Leva > rovnice2.Leva ? rovnice2 : rovnice1; if (taMensi.Prava < 0) { taMensi.Prava = taMensi.Prava + d0; lajna = "d ≡ " + taMensi.Prava.ToString(); listBox.Items.Add(lajna); } return(taMensi); }