1. 下面是 DES 的一个 S 盒,如果输入为 011001,求输出值(6 分)
时间: 2024-04-07 19:32:39 浏览: 218
首先,将输入 011001 按照 S 盒的规则进行置换,得到新的输入为 100101。
接下来,将新的输入分成两个部分,左边 1 位和右边 5 位。左边 1 位为 1,所以在第 1 行查找。右边 5 位为 00101,所以在第 2 列查找。
通过交叉点所在的行和列,得到 S 盒的输出值为 3(二进制表示为 0011)。
因此,输入 011001 经过 S 盒的输出值为 3。
相关问题
通过建一个86416的三维集合数组生成DES的差分分布表S的C语言代码,例如S[2][32][12]存放了第二个S盒输入差为32,输出差为12的所有可能输入的具体值(输入值可能不止一个,也可能为空,所以S[i][j][k]本身是一个集合)
以下是一个简单的C语言代码示例,用于生成DES的差分分布表S的三维集合数组:
```c
#include <stdio.h>
#define S_COUNT 8
#define S_INPUT_DIFF_MAX 63
#define S_OUTPUT_DIFF_MAX 15
int S[S_COUNT][S_INPUT_DIFF_MAX + 1][S_OUTPUT_DIFF_MAX + 1];
void generate_S_table() {
// 遍历所有可能的S盒输入差和输出差
for (int s = 0; s < S_COUNT; s++) {
for (int input_diff = 0; input_diff <= S_INPUT_DIFF_MAX; input_diff++) {
for (int output_diff = 0; output_diff <= S_OUTPUT_DIFF_MAX; output_diff++) {
// 计算当前输入差和输出差的数量
int count = 0;
for (int input = 0; input < 64; input++) {
int output = S_BOX[s][input];
int input_diff_actual = __builtin_popcount(input ^ (input ^ output_diff));
int output_diff_actual = __builtin_popcount(output ^ (output ^ output_diff));
if (input_diff_actual == input_diff && output_diff_actual == output_diff) {
// 如果输入差和输出差与当前差分相同,则将当前输入添加到集合中
S[s][input_diff][output_diff] |= (1 << input);
count++;
}
}
printf("S[%d][%d][%d]: %d possible inputs\n", s, input_diff, output_diff, count);
}
}
}
}
int main() {
generate_S_table();
return 0;
}
```
该代码使用了一个三维数组 `S` 来存储所有S盒不同输入差和输出差的所有可能输入的具体值。在 `generate_S_table` 函数中,我们遍历所有可能的S盒输入差和输出差,并计算与当前差分相同的所有输入的数量。对于每个输入差和输出差,我们使用一个 `int` 类型的变量来表示一个输入值集合,其中每个位表示一个64个可能输入中的一个。我们使用 `__builtin_popcount` 函数来计算输入差和输出差的数量,然后将输入添加到集合中。最后,我们将集合的大小打印到控制台上。
通过建一个8*64*16的三维集合数组生成DES的差分分布表S的C语言代码,例如S[2][32][12]存放了第二个S盒输入差为32,输出差为12的所有可能输入值(输入值可能不止一个,也可能为空,所以S[i][j][k]本身是一个集合)
下面是生成DES差分分布表S的C语言代码:
```c
#include <stdio.h>
// 定义S盒
int S[8][64] = {
{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},
{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},
{10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12},
{7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14},
{2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3},
{12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13},
{4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12},
{13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11}
};
// 定义差分分布表S
int S_diff[8][64][16];
// 初始化差分分布表S
void init_S_diff() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 64; j++) {
for (int k = 0; k < 64; k++) {
int input_diff = j ^ k; // 计算输入差
int output_diff = S[i][j] ^ S[i][k]; // 计算输出差
S_diff[i][input_diff][output_diff]++; // 统计差分分布
}
}
}
}
int main() {
init_S_diff(); // 初始化差分分布表S
// 输出差分分布表S
for (int i = 0; i < 8; i++) {
printf("S%d:\n", i + 1);
for (int j = 0; j < 64; j++) {
for (int k = 0; k < 16; k++) {
printf("S_diff[%d][%d][%d]: {", i, j, k);
for (int l = 0; l < 64; l++) {
if (S_diff[i][j][k] && ((l ^ j) == k)) {
printf("%d ", l);
}
}
printf("}\n");
}
}
}
return 0;
}
```
该代码采用三重循环遍历S盒中的所有输入值,计算输入差和输出差,并统计差分分布。差分分布表S_diff的下标分别对应S盒的编号、输入差和输出差,S_diff[i][j][k]存放了第i个S盒输入差为j,输出差为k的所有可能输入值。在初始化差分分布表S_diff后,可以输出S_diff的所有元素,即生成DES的差分分布表S。
阅读全文