Beispiel #1
0
        /// <summary>
        /// 加密解密过程主函数
        /// </summary>
        /// <param name="data">输入数据</param>
        /// <param name="key">输入密钥</param>
        /// <param name="isEncrypt">true为加密,false为解密</param>
        /// <returns>加密则输出密文,解密则输出明文</returns>
        private Bitset Process(Bitset data, Bitset key, bool isEncrypt)
        {
            // 先生成子密钥
            GenerateSubKeys(key);

            // 初始置换
            Bitset processingData = DataIP.Perform(data);

            // 循环roundCount次,每轮调用轮函数
            for (int i = 0; i < roundCount; ++i)
            {
                // 使用第i个subkey进行轮函数
                // 加密和解密的区别仅仅是使用子密钥的顺序不同
                processingData = RoundFunction.Process(processingData,
                                                       subKeys[isEncrypt ? i : roundCount - i - 1]);
                //Console.WriteLine(i + " : " + processingData);

                // 如果不是最后一轮,进行左右置换SW
                if (i != roundCount - 1)
                {
                    Bitset left  = processingData.LeftHalf();
                    Bitset right = processingData.RightHalf();
                    processingData = Bitset.Join(right, left);
                }
            }
            // 最后执行逆置换IP^(-1)
            processingData = DataIPRev.Perform(processingData);
            return(processingData);
        }
Beispiel #2
0
        /// <summary>
        /// 生成子密钥(工作密钥)过程
        /// </summary>
        /// <param name="processingKey">输入密钥</param>
        public void GenerateSubKeys(Bitset key)
        {
            subKeys = new Bitset[roundCount];
            // 初始置换,64->56比特
            Bitset processingKey = KeyIP.Perform(key);

            //拆成左右两半各28比特
            Bitset left  = processingKey.LeftHalf();
            Bitset right = processingKey.RightHalf();

            // 循环roundCount次,生成子密钥(工作密钥)
            for (int i = 0; i < roundCount; ++i)
            {
                //循环左移
                left  = left.ShiftLeft(ShiftArray[i]);
                right = right.ShiftLeft(ShiftArray[i]);

                //合并后用PC置换
                subKeys[i] = SubKeyPC.Perform(Bitset.Join(left, right));
            }
        }
Beispiel #3
0
        /// <summary>
        /// 轮函数的主处理函数
        /// </summary>
        /// <param name="input">输入的64比特(包括Li-1与Ri-1)</param>
        /// <param name="key">输入的子密钥</param>
        /// <returns>输出的64比特(包括Li与Ri)</returns>
        public Bitset Process(Bitset input, Bitset key)
        {
            //判断输入是否合法
            if (input.Length != 64 || key.Length != 48)
            {
                throw new ArgumentException("输入不合法");
            }

            // 拆成两个32比特,Ri不动,Li进行处理
            Bitset left  = input.LeftHalf();
            Bitset right = input.RightHalf();

            // 计算轮函数f值,先R进行E矩阵置换,从32比特变为48比特:
            Bitset f = EMatrix.Perform(right);

            // 然后将f值与密钥相异或
            f = f.Xor(key);

            // 将值拆成8个6bit串,输入S盒
            Bitset[] groups = f.SplitByLength(6);
            for (int i = 0; i < 8; ++i)
            {
                // 进行S盒变换
                groups[i] = S[i].Perform(groups[i]);
            }
            // 将f和成一个01串
            f = Bitset.Join(groups);

            // 再经过P盒坐标置换
            f = PBox.Perform(f);

            // 与L_(i-1)异或
            f = f.Xor(left);

            //输出结果,注意没有经过左右交换SW
            return(Bitset.Join(f, right));
        }