算法步骤:
S-DES(Simplified Data Encryption Standard)是一种简化的数据加密标准,通常用于教学目的。下面是S-DES加密的基本步骤:
1. 生成子密钥:
使用一个10位的密钥,将其分为两个5位的部分,分别为左半部分(LSB)和右半部分(MSB)。
对每个5位的部分进行循环左移1或2位,生成两个新的5位部分。
将这两个新的5位部分合并,并通过一个固定的置换表(P8置换表)生成一个8位的子密钥。
2. 初始置换(IP置换):
将8位的明文块通过一个固定的置换表(IP置换表)进行重新排列。
3. 分为左右两部分:
将初始置换的结果分为左半部分(L0)和右半部分(R0)。
4. 轮函数:
对每一轮(一般有两轮),计算新的左半部分(Li)和右半部分(Ri)。
计算下一轮的左半部分(Li+1):Li+1 = Ri
计算下一轮的右半部分(Ri+1):Ri+1 = Li ⊕ f(Ri, Ki),其中⊕表示异或操作,f是轮函数,Ki是生成的子密钥。
5. 轮函数f的计算:
将右半部分通过一个扩展/置换操作(E/P扩展置换)扩展为8位。
将扩展的结果与生成的子密钥进行异或操作。
将异或的结果分为两个4位部分,分别通过S-盒替代。
将S-盒替代的结果通过一个固定的置换表(P4置换表)进行重新排列,得到最终的4位结果。
6. 逆初始置换(IP逆置换):
将经过轮函数计算后的左右部分进行合并,并通过一个逆初始置换表(IP逆置换表)得到最终的8位密文块。
以上是S-DES加密的基本步骤。需要注意的是,S-DES是一个非常简化的加密算法,不适合用于实际的安全应用,仅用于学术和教学目的。
题目:
要求编写一个C++的程序,输入为8bit的明文,10bit的密钥,输出8bit的密文
输入:
10111101
1110001101
输出:
11111011
代码:
#include<iostream>
#include <bitset>
using namespace std;
int IP[8] = { 2,6,3,1,4,8,5,7 };
int IPIN[8] = { 4,1,3,5,7,2,8,6 };
int P10[10] = { 3,5,2,7,4,10,1,9,8,6 };
int P8[8] = { 6,3,7,4,8,5,10,9 };
int EP[8] = { 4,1,2,3,2,3,4,1 };
int P4Before[4] = { 1,4,2,3 };
int P4[4] = { 2,4,3,1 };
int SS1[4][4] = { {1,0,3,2},{3,2,1,0},{0,2,1,3},{3,1,3,2} };
int SS2[4][4] = { {0,1,2,3},{2,0,1,3},{3,0,1,0},{2,1,0,3} };
void replace(string& str, int arr[],int len)
{
char* item = new char[len];
for (int i = 0; i < len; i++)
{
int index = arr[i] - 1;
item[i] = str[index];
}
str = string(item, len);
delete[] item;
}
string leftmove(string str, int times)
{
int len = str.length();
int mid = len / 2;
string leftPart = str.substr(0, mid);
string rightPart = str.substr(mid);
string leftMoved = leftPart.substr(times % mid) + leftPart.substr(0, times % mid);
string rightMoved = rightPart.substr(times % (len - mid)) + rightPart.substr(0, times % (len - mid));
return leftMoved + rightMoved;
}
string xorOperation(string str1, string str2)
{
int len = str1.length();
string result;
for (int i = 0; i < len; i++)
{
result += (str1[i] == str2[i]) ? '0' : '1';
}
return result;
}
int binaryToDecimal(string binary) {
bitset<8> bits(binary);
return bits.to_ulong();
}
string RandKtoS(string R,string K)
{
replace(R, EP, 8);
string XOR = xorOperation(R, K);
string S1 = XOR.substr(0, 4);
string S2 = XOR.substr(4);
replace(S1, P4Before, 4);
replace(S2, P4Before, 4);
int S1H = binaryToDecimal(S1.substr(0, 2));
int S1L = binaryToDecimal(S1.substr(2));
int S2H = binaryToDecimal(S2.substr(0, 2));
int S2L = binaryToDecimal(S2.substr(2));
int SL = SS1[S1H][S1L];
int SR = SS2[S2H][S2L];
string SL2 = bitset<2>(SL).to_string();
string SR2 = bitset<2>(SR).to_string();
string S = SL2 + SR2;
replace(S, P4, 4);
return S;
}
int main()
{
string mingwen, miyao;
cin >> mingwen >> miyao;
replace(mingwen, IP,8);
string L0 = mingwen.substr(0, 4);
string R0 = mingwen.substr(4);
string L1 = R0;
//求K1和K2
replace(miyao, P10, 10);
string LS1=leftmove(miyao, 1);
string LS2 = leftmove(LS1, 2);
replace(LS1, P8, 8);
string K1 = LS1;
replace(LS2, P8, 8);
string K2 = LS2;
//第一次求F
string F1 = RandKtoS(R0,K1);
string R1 = xorOperation(F1, L0);
//第二次求F
string F2 = RandKtoS(R1, K2);
string L2 = xorOperation(L1, F2);
string R2 = R1;
string miwen = L2 + R2;
replace(miwen, IPIN,8);
cout << miwen;
return 0;
}