diff --git a/analysis table.h b/analysis table.h new file mode 100644 index 0000000..d4d7eb4 --- /dev/null +++ b/analysis table.h @@ -0,0 +1,142 @@ +#ifndef TASK1_H_INCLUDED +#define TASK1_H_INCLUDED +#include +#include +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