You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
the_difference_analysis_of_des/analysis table.h

143 lines
4.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#ifndef TASK1_H_INCLUDED
#define TASK1_H_INCLUDED
#include<stdio.h>
#include<stdlib.h>
void hello() {
printf("fsdf");
}
int mainFuntion(int in[6]) {
int In[6];
for (int i = 0; i < 6; i++) {
In[i] = in[i];
} //定义输入异或
int k;
//int i;
void Differ(int In[6]); //fp是指针用来指向FILE类型的对象。
void s_box(int array[6], int brray[4], int crray[4][16]); //根据des把结果写成8个6比特串的并联每一个s盒把6比特映射到4比特
//则array是输入比特串是6位 brray是输出比特串是4位crray是s盒4X16
printf("差分分布统计表\n");
printf("\n输入差分: ");
for (k = 0; k <= 5; k++) { //打印当前输入异或
printf("%d", In[k]);
}
printf("\n");
Differ(In); //调用差分方法
return 0;
}
void Differ(int In[6])
{ //定义了s盒《密码学原理与实践》P76页S1
int s[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}
};
int b[6]; //可能的输入
int d[6];
int e[4], f[4], Out[4], n[4];//n[4]是输出差分0000~1111
int flag;
int l;
int k;
int i, j;
int count; //定义一个计数器
void s_box(int array[6], int brray[4], int crray[4][16]);
printf("————————————————————————————————————————————————————\n");
printf("S1的输出差分\t可能的输入\n");
for (i = 0; i <= 15; i++)
{
{
int t; //遍历输出异或
t = i; //四位二进制数0000~1111存在数组n中
n[3] = t % 2; t = t / 2;
n[2] = t % 2; t = t / 2;
n[1] = t % 2; t = t / 2;
n[0] = t % 2;
}
//printf("输出差分:");
for (k = 0; k <= 3; k++) //打印当前的输出异或
{
printf("%d", n[k]);
}
printf("\t\t");
count = 0; //将当前输出异或分布初始化为0次
for (j = 0; j <= 63; j++) //遍历输入六元组
{
{ int t;
t = j;
b[5] = t % 2; t = t / 2;
b[4] = t % 2; t = t / 2;
b[3] = t % 2; t = t / 2;
b[2] = t % 2; t = t / 2;
b[1] = t % 2; t = t / 2;
b[0] = t % 2;
}
for (l = 0; l <= 5; l++)
d[l] = b[l] ^ In[l]; //将数组进行按位异或操作求出当前输入异或下x对应的x*并保存在数组d[]中
s_box(b, e, s); //b是输入x e是s盒在输入为b时的输出
s_box(d, f, s); //d是b在输入异或为in[l]对应下的输入x*f是s盒在输入为b时的输出
for (k = 0; k <= 3; k++)
Out[k] = e[k] ^ f[k]; //求出输出差分存在Out数组中
flag = 1; //并将标志位置1
for (k = 0; k <= 3; k++)
{
if (Out[k] != n[k])
{
flag = 0;
break;
}
}
if (flag == 1) {//符合当前输出差分的时候,当前输出差分的计数器加一
count = count + 1;
for (int z = 0; z < 6; z++) {
printf("%d", b[z]);
}
printf(",");
}
}
if (count == 0)
printf("没有可能输入");
else
printf("\t输入数量为:%d", count);
printf("\n");
}
printf("————————————————————————————————————————————————————\n");
}
void s_box(int array[6], int brray[4], int crray[4][16])
{
int p, q, t;
p = 2 * array[0] + array[5]; //用b1b6比特决定s盒的行取值为p
q = 2 * 2 * 2 * array[1] + 2 * 2 * array[2] + 2 * array[3] + array[4]; //用b2b3b4b5决定s盒的列取值为q
t = crray[p][q]; //t就是s盒在输入为array[6]时的输出
brray[3] = t % 2;
t = t / 2;
brray[2] = t % 2;
t = t / 2;
brray[1] = t % 2;
t = t / 2;
brray[0] = t % 2; //把t转换成二进制数存储在brray中
}
#endif // TASK1_H_INCLUDED
#pragma once