Esempio n. 1
0
        public void MatrixIntGF26Test()
        {
            int time = 100;

            for (int i = 0; i < time; i++)
            {
                var matrix  = new MatrixIntGF26(RandomHelper.GetHillMatrix());
                var inverse = matrix.Inverse();
                var multify = matrix.MultifyMod(inverse);
                Assert.IsTrue(multify.IsUnit());
            }
        }
Esempio n. 2
0
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="ekey">密钥,必须是可逆的方阵</param>
        public HillCipher(int[,] ekey)
        {
            this.EKEY = new MatrixIntGF26(ekey);
            if (!this.EKEY.HasInverse())
            {
                throw new Exception("加密矩阵无法在有限域内求得逆矩阵");
            }
            this.DKEY        = EKEY.Inverse();
            this.groupLength = ekey.GetLength(0);   // 如果执行到这里,已经说明矩阵是方阵

            // TODO Delete
            //Debug.WriteLine($"{EKEY.ToString()}{System.Environment.NewLine}" +
            //    $"x{System.Environment.NewLine}{DKEY.ToString()}{System.Environment.NewLine}" +
            //    $"={System.Environment.NewLine}{EKEY.MultifyMod(DKEY)}");
        }
Esempio n. 3
0
        public void HillCipherTest()
        {
            // 这个矩阵有问题,//后来发现是不能求逆
            int[,] ekey = new int[, ] {
                { 10, 05, 07, 02, 08, 21, 09, 16, 24 },
                { 23, 02, 11, 16, 16, 04, 15, 09, 23 },
                { 07, 07, 01, 19, 04, 04, 20, 23, 20 },
                { 19, 16, 21, 05, 02, 02, 18, 20, 15 },
                { 12, 24, 05, 19, 20, 08, 14, 14, 07 },
                { 13, 03, 16, 04, 04, 02, 03, 21, 14 },
                { 18, 15, 02, 04, 07, 10, 01, 15, 24 },
                { 04, 19, 01, 09, 23, 21, 13, 04, 09 },
                { 18, 12, 11, 18, 05, 14, 22, 08, 21 }
            };

            var mat = new MatrixIntGF26(ekey);
            var inv = mat.Inverse();
            var mul = mat.MultifyMod(inv);
        }