/// <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); }
/// <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)); } }
/// <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)); }