一、实验目的:
理解DES算法并掌握S盒替换原理,用代码实现S盒替换。
二、实验过程:
1.学习DES算法的三个步骤中的第二步:16轮的迭代运算。
2.学习S盒替换 :首先输入一个六位二进制数,把这个六位二进制数的第一位和第六位提取出来组成二位二进制数并转换为十进制数作为S盒的行数,接着把六位二进制数的剩余第二位至第五位转换为十进制数作为S盒的列数,最后通过行数和列数查找对应S盒的数并转换为四位二进制数。
三、实验代码及结果:
(1)实验代码:
#include<iostream>
using namespace std;
int S1[4][16] = { {14,4,13,1,2,15,11,8,3,10,6,12,5,9,0,7},{0,15,7,4,14,2,13,1,10,6,12,11,9,5,3,8},{4,1,14,8,13,6,2,11,15,12,9,7,3,10,5,0},{15,12,8,2,4,9,1,7,5,11,3,14,10,0,6,13} };
//S1盒数据
int S2[4][16] = { {15,1,8,14,6,11,3,4,9,7,2,13,12,0,5,10},{3,13,4,7,15,2,8,14,12,0,1,10,6,9,11,5},{0,14,7,11,10,4,13,1,5,8,12,6,9,3,2,15},{13,8,10,1,3,15,4,2,11,6,7,12,0,5,14,9} };
//S2盒数据
//十进制转化为二进制
void convert_10_to_2(int S) {//S为十进制数
int i; //i为十进制转换为二进制的位数
int p[1000]; //用数组p存储的二进制数
for (i = 0; S != 0; i++) { //for循环将十进制数转换为二进制数并用p存储二进制数
p[i] = S % 2;
S /= 2;
}
//如果十进制转换为二进制结果不是四位数,则在二进制数前加0
int q = i;
while (4 - q) {
cout<<0;
q++;
}
for (int t = i - 1; t >= 0; t--) {//倒循环输出二进制数
cout << p[t];
}
}
//二进制转化为十进制
int convert_2_to_10(int x) {//x为二进制数
int s = 0;//s为二进制转换后的十进制数
int t = 1;
while (x) {//while循环使十进制转换为二进制
s += x % 10 * t;
t *= 2;
x /= 10;
}
return s;//返回十进制数s
}
int main() {
int s; cout << "请输入一个六位二进制数:"; cin >> s;//s为输入的六位二进制数
int b1 = s % 10, b6 = s / 100000;//b1为六位二进制数的第一位数,b6为六位二进制数的第六位数
int b25 = s / 10 % 10000;//b25为六位二进制数的2-5位数
int n = b1 * 2 + b6;//n表示为S盒的行数
int m = convert_2_to_10(b25);//m表示为S盒的列数
string Str;//Str为选择的S1盒还是S2盒
cout << "请选择S1盒还是S2盒:" ;
cin >> Str;
if (Str == "S1")//如果选择S1盒输出相对应的二进制数
{
printf("S1[%d][%d] =%d\n", n, m, S1[n][m]);
printf("%d转换为二进制数为", S1[n][m]);
convert_10_to_2(S1[n][m]);
}//如果选择S2盒输出对应的二进制数
else if(Str == "S2"){
printf("S2[%d][%d] = %d\n", n, m,S2[n][m]);
printf("%d转换为二进制数为", S2[n][m]);
convert_10_to_2(S2[n][m]);
}
return 0;
}
(2)实验结果: