S-DES加密

算法步骤:

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

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值