public Matrix R; // secret key public double KeyGen(CodeType codetype, int[] param) { Code code = new Code(); int k = 0, n = 0, r, m, l = param[2]; switch (codetype) { case CodeType.Hamming: r = param[0]; code = new Ham(r); break; case CodeType.RM: r = param[0]; m = param[1]; code = new RM(r, m); break; } k = code.G.size[0]; n = code.G.size[1]; Stopwatch t = new Stopwatch(); t.Start(); //Matrix N N = MatrixFuncs.GenNoise(k); //Matrix P int nn = n + l; P = new Matrix(nn, nn); int[] check = new int[nn]; int ind = 0; for (int i = 0; i < nn; ++i) { do { ind = Common.GetRand() % nn; } while (check[ind] == 1); P.data[ind][i] = 1; check[ind] = 1; } //Matrix R R = new Matrix(k, l); for (int i = 0; i < k; ++i) { for (int j = 0; j < l; ++j) { R.data[i][j] = Common.GetRand() & 1; } } Gp = N * (code.G | R) * P; t.Stop(); return(t.ElapsedMilliseconds / 1000.00); }
public Matrix P; // secret key public double KeyGen(CodeType codetype, int[] param) { Code code = new Code(); int k, n, r = 0, s = 0, m, nn; switch (codetype) { case CodeType.Hamming: r = param[0]; s = param[1]; code = new Ham(r); break; case CodeType.RM: r = param[0]; m = param[1]; s = param[2]; code = new RM(r, m); break; } k = code.G.size[0]; n = code.G.size[1]; nn = n * s; Stopwatch t = new Stopwatch(); t.Start(); //Matrix list N N = new List <Matrix>(); Matrix N_i, NG = new Matrix(); for (int ii = 0; ii < s; ++ii) { N_i = MatrixFuncs.GenNoise(k); N.Add(N_i); NG |= N_i * code.G; } //Matrix P P = new Matrix(nn, nn); int[] check = new int[nn]; int ind = 0; for (int i = 0; i < nn; ++i) { do { ind = Common.GetRand() % nn; } while (check[ind] == 1); P.data[ind][i] = 1; check[ind] = 1; } Gp = NG * P; t.Stop(); return(t.ElapsedMilliseconds / 1000.00); }
public Matrix P; // secret key public double KeyGen(CodeType codetype, int[] param) { Code code = new Code(); int k = 0, n = 0, r, m; switch (codetype) { case CodeType.Hamming: r = param[0]; code = new Ham(r); break; case CodeType.RM: r = param[0]; m = param[1]; code = new RM(r, m); break; } k = code.G.size[0]; n = code.G.size[1]; Stopwatch t = new Stopwatch(); t.Start(); //Matrix N N = MatrixFuncs.GenNoise(k); //Matrix P P = new Matrix(n, n); int[] check = new int[n]; int ind = 0; for (int i = 0; i < n; ++i) { do { ind = Common.GetRand() % n; } while (check[ind] == 1); P.data[ind][i] = 1; check[ind] = 1; } Gp = N * code.G * P; t.Stop(); return(t.ElapsedMilliseconds / 1000.00); }
private void btn_keygen_Click(object sender, EventArgs e) { try { if (cbox_cslist.SelectedIndex == -1) { MessageBox.Show("Выберите криптосистему в выпадающем списке!", "Ошибка"); return; } if (txtbox_cparams.Text == "") { MessageBox.Show("Введите параметры криптосистемы!", "Ошибка"); return; } int[] param = txtbox_cparams.Text.Split(',').Select(x => Int32.Parse(x)).ToArray(); double time = 0; selectedIndex = cbox_cslist.SelectedIndex; switch (cbox_cslist.SelectedIndex) { case 0: { if (param.Length != 1) { MessageBox.Show("Неверное число параметров криптосистемы!", "Ошибка"); return; } if (param[0] < 2) { MessageBox.Show("Некорректные параметры криптосистемы!", "Ошибка"); return; } time = McE.KeyGen(CodeType.Hamming, new[] { param[0] }); ham = new Ham(param[0]); txtbox_keys.Text = "N:\r\n" + McE.N.ToString() + "\r\nP:\r\n" + McE.P.ToString() + "\r\nGp:\r\n" + McE.Gp.ToString(); break; } case 1: { if (param.Length != 2) { MessageBox.Show("Неверное число параметров криптосистемы!", "Ошибка"); return; } if (param[0] < 2 || param[1] < 1) { MessageBox.Show("Некорректные параметры криптосистемы!", "Ошибка"); return; } if (param[1] > 3) { MessageBox.Show("Количество блоков должно быть не больше трёх!", "Ошибка"); return; } time = Sid.KeyGen(CodeType.Hamming, param); ham = new Ham(param[0]); txtbox_keys.Text = ""; for (int i = 0; i < Sid.N.Count; ++i) { txtbox_keys.Text += "N" + (i + 1) + ":\r\n" + Sid.N[i].ToString() + "\r\n"; } txtbox_keys.Text += "P:\r\n" + Sid.P.ToString() + "\r\nGp:\r\n" + Sid.Gp.ToString(); break; } case 2: { if (param.Length != 2) { MessageBox.Show("Неверное число параметров криптосистемы!", "Ошибка"); return; } if (param[0] < 0 || param[1] < 1) { MessageBox.Show("Некорректные параметры криптосистемы!", "Ошибка"); return; } time = McE.KeyGen(CodeType.RM, param); rm = new RM(param[0], param[1]); txtbox_keys.Text = "N:\r\n" + McE.N.ToString() + "\r\nP:\r\n" + McE.P.ToString() + "\r\nGp:\r\n" + McE.Gp.ToString(); break; } case 3: { if (param.Length != 3) { MessageBox.Show("Неверное число параметров криптосистемы!", "Ошибка"); return; } if (param[0] < 0 || param[1] < 1 || param[2] < 1 || param[1] < param[0]) { MessageBox.Show("Некорректные параметры криптосистемы!", "Ошибка"); return; } time = Sid.KeyGen(CodeType.RM, param); rm = new RM(param[0], param[1]); txtbox_keys.Text = ""; for (int i = 0; i < Sid.N.Count; ++i) { txtbox_keys.Text += "N" + (i + 1) + ":\r\n" + Sid.N[i].ToString() + "\r\n"; } txtbox_keys.Text += "P:\r\n" + Sid.P.ToString() + "\r\nGp:\r\n" + Sid.Gp.ToString(); break; } case 4: { if (param.Length != 3) { MessageBox.Show("Неверное число параметров криптосистемы!", "Ошибка"); return; } if (param[0] < 0 || param[1] < 1 || param[2] < 1 || param[1] < param[0]) { MessageBox.Show("Некорректные параметры криптосистемы!", "Ошибка"); return; } time = Wish.KeyGen(CodeType.RM, param); rm = new RM(param[0], param[1]); txtbox_keys.Text = "N:\r\n" + Wish.N.ToString() + "\r\nP:\r\n" + Wish.P.ToString() + "\r\nR:\r\n" + Wish.R.ToString() + "\r\nGp:\r\n" + Wish.Gp.ToString(); break; } } lbl_time.Text = "Time (sec) = " + time; } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка"); } }
public double AttackRM(out Matrix N1, out Matrix P1) { int k = Gp.size[0], n = Gp.size[1]; N1 = new Matrix(k, k); P1 = new Matrix(n, n); Code code = new Code(Gp); Code Gp_reduced; // Compute r, m int r = -1, m = (int)Math.Log(n, 2), k1 = 0; while (k1 < k) { ++r; k1 += Common.C(m, r); } RM rm = new RM(r, m); Stopwatch t = new Stopwatch(); t.Start(); // Reduction //2 * r >= m => reduction on dual code if (2 * r < m || m - r == 1) { Gp_reduced = new Code(code.G); } else { Gp_reduced = new Code(code.H); r = m - r - 1; } while (r > 1) { Gp_reduced = AttackFuncs.Reduction(Gp_reduced, r, m); --r; } // Matrix P Matrix Tmp; int idx = -1; Vector e = new Vector(Enumerable.Repeat(1, n).ToList()); do { ++idx; Tmp = (new Matrix(Gp_reduced.G) - idx) & e; }while (MatrixFuncs.Gauss(Tmp) < m + 1); Tmp = Gp_reduced.G; Tmp -= idx; Matrix RM_1 = (new RM(1, m)).G -= 0; IEnumerable <int> tmp1, tmp2; Matrix P1_inv = new Matrix(n, n); for (int j = 0; j < n; ++j) { tmp1 = Tmp.data.Select(x => x[j]); for (int jj = 0; jj < n; ++jj) { tmp2 = RM_1.data.Select(x => x[jj]); if (tmp1.SequenceEqual(tmp2)) { P1.data[jj][j] = 1; P1_inv.data[j][jj] = 1; break; } } } // Matrix N code.G = code.G * P1_inv; N1 = MatrixFuncs.Transp(MatrixFuncs.SolveEq(MatrixFuncs.Transp(rm.G), MatrixFuncs.Transp(code.G))); t.Stop(); return(t.ElapsedMilliseconds / 1000.00); }