Вот то что написал, почему то не работает дешифрование. Помогите плзз. | Код | using System; using System.Collections; using System.Windows.Forms;
namespace alg_rukzaka { public class Rukzak { private int size = 10; private ulong[] private_key; private ulong[] public_key; private ArrayList list = new ArrayList(); private ArrayList reslist = new ArrayList(); private ulong N = 0; // sum of all elements private_key private int X = 0, Y = 0; public Rukzak() { private_key = new ulong[size]; public_key = new ulong[size]; } public Rukzak(int s) { size = s; private_key = new ulong[size]; public_key = new ulong[size]; } public void CreateUpSequence(ListBox list) { list.Items.Clear(); Random r = new Random(); checked { ulong sum = 0; for (int i = 0; i < size; i++) { sum = 0; for (int j = 0; j < i; j++) sum += private_key[j];
private_key[i] = sum + 1; list.Items.Add(private_key[i]); } } } public void CreateNormalSequence(Label l1,Label l2,ListBox lst) { lst.Items.Clear(); N = 0; X = 0; Random r = new Random(); for (int i = 0; i < size; i++) N += private_key[i]; l1.Text = N.ToString(); while (NOD(N,(ulong)X) != 1) X = r.Next(); l2.Text = X.ToString(); for (int i = 0; i < size; i++) { public_key[i] = (private_key[i] * (ulong)X) % N; lst.Items.Add(public_key[i]); }
} public void Encrypt(RichTextBox t1,RichTextBox t2) { t2.Text = ""; list.Clear(); char[] txt = t1.Text.ToCharArray(); int[] bits = new int[size*(txt.Length-1)]; int[] sb = new int[8]; ulong sum = 0; int h = 0; for (int i = 0; i < txt.Length; i++) { sb = GetBits(Convert.ToInt32(txt[i])); for (int j = 0; j < sb.Length; j++) bits[h++] = sb[j]; }
for (int i = 0; i < bits.Length; i+=size) { int step = 0; sum = 0; for (int j = i; j < (size+i); j++) { sum += (ulong)bits[j]*public_key[step++]; } list.Add(sum); t2.Text += sum + " "; } } public void Decrypt(RichTextBox t,Label l,RichTextBox txt) { t.Text = ""; reslist.Clear(); Y = 0; int[] bits = new int[size * (txt.Text.Length - 1)]; int[] sb = new int[8]; int h=bits.Length-1; ulong tmp = 0; int k=0; Random r = new Random(); while ((ulong)(X*Y)%N!=1) Y = r.Next(); l.Text = Y.ToString(); for (int i = 0; i < list.Count; i++) { tmp = ((ulong)list[i] * (ulong)Y) % N; reslist.Add(tmp); t.Text += reslist[i].ToString() + " "; } for (int v = 0; v < reslist.Count; v++) { for (int i = size - 1; i >= 0; i--) { if (private_key[i] <= (ulong)reslist[v]) { bits[h] = 1; reslist[v] = (ulong)reslist[v] - private_key[i]; h--; } else { bits[h] = 0; h--; } } } t.Text += "\n"; for (int i = 0; i < bits.Length; i++) t.Text += bits[i].ToString(); t.Text += "\n"; for (int i = 0; i < bits.Length; i++) { if (k >= sb.Length) { k = 0; t.Text += GetDigit(sb) + " "; } sb[k++] = bits[i]; } } private int[] GetBits(int number) { int displayMask = 1 << 7; int[] mas = new int[8];
for (int c = 0; c < 8; c++) { mas[c] = (number & displayMask) == 0 ? 0 : 1; number <<= 1; }
return mas; } private int GetDigit(int[] mas) { string tmp = ""; int res = 0; for (int i = 0; i < mas.Length; i++) tmp += mas[i].ToString(); res = Convert.ToInt32(tmp, 2); return res; } private int NOD(ulong a, ulong b) { if (a == 0 || b == 0) return 0; //if (Math.Abs(Convert.ToInt32(a)) > Math.Abs(Convert.ToInt32(b))) if (a > b) { if (b == 1) return 1; return NOD(b, a % b); } else { if (a == 1) return 1; return NOD(a, b % a); } }
} }
|
|