Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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, "Ошибка");
            }
        }
Ejemplo n.º 5
0
        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);
        }