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/key table.h

180 lines
5.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 TASK4_H_INCLUDED
#define TASK4_H_INCLUDED
#include<stdio.h>
#include<stdlib.h>
void CharToInt6(char a[6], int b[6]); //6位字符型转整型
void CharToInt4(char a[4], int b[4]); //4位字符型转整型
int mainFuntion4(char E[6], char ee[6], char hello[4]) {
int EInt[6];
int eeInt[6];
int helloInt[4];
CharToInt6(E, EInt);
CharToInt6(ee, eeInt);
CharToInt4(hello, helloInt);
void happy(int EInt[6], int eeInt[6], int helloInt[4]); //实现P138例4-2的函数
// 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");
happy(EInt, eeInt, helloInt);
return 0;
}
void happy(int EInt[6], int eeInt[6], int helloInt[4])
{ //定义了s盒
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];
int flag;
int l, k;
int i, j;
int g, h;
int p, q;
int u, v; //l,k,i,j,g,h,p,q均为循环所需要的变量
int count; //定义一个计数器
int in[13][6];
int test[13][6];
// void s_box(int array[6],int brray[4],int crray[4][16]);
// void CharToInt6(char a[6],int b[6]);//6位字符型转整型
// void CharToInt4(char a[4],int b[4]);//4位字符型转整型
int a[6];
for (i = 0; i < 6; i++) {
a[i] = EInt[i] ^ eeInt[i]; //输入差分
}
count = 0; //将当前输出异或分布初始化为0次
for (j = 0; j <= 63; j++) //遍历输入六元组
{
{ int t; //b[]为可能的输入
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 < 6; l++)
d[l] = b[l] ^ a[l]; //将数组进行按位异或操作求出当前输入异或下x对应的x*并保存在数组d[]中 In为输入差分
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 < 4; k++)
Out[k] = e[k] ^ f[k]; //求出输出差分存在Out数组中
flag = 1; //并将标志位置1
for (k = 0; k < 4; k++)
{
if (Out[k] != helloInt[k]) //输出差分与用户输入的输入差分不匹配
{
flag = 0;
break;
}
}
if (flag == 1) {//符合当前输出差分的时候,当前输出差分的计数器加一
count = count + 1;
if (count > 0) {
for (int z = 0; z < 6; z++) {
//int r=count-1;
in[count - 1][z] = b[z];
}
}
}
}
in[count][0] = 2; //无论count是否为零最后都在下一行开头赋一个大于1的值。用于后面的筛选
printf("可能的输入为:\n");
if (count == 0)printf("由于没有输入的可能值,所以没有密钥集合。");
else {
for (g = 0; g < 13; g++) {
if (in[g][0] > 1)
break;
else {
for (h = 0; h < 6; h++)
{
printf(" %d ", in[g][h]);
if ((h + 1) % 6 == 0)
printf("\n");
}
}
}
}
for (p = 0; p < 13; p++) {
for (q = 0; q < 6; q++)
{
test[p][q] = in[p][q] ^ EInt[q];
}
}
printf("密钥可能为:\n");
if (count == 0)printf("由于没有输入的可能值,所以没有密钥集合。");
else {
for (u = 0; u < 13; u++) {
if (in[u][0] > 1)
break;
else {
for (v = 0; v < 6; v++)
{
printf(" %d ", test[u][v]);
if ((v + 1) % 6 == 0)
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中
// }
void CharToInt6(char a[6], int b[6]) {
for (int q = 0; q < 6; q++) {
if (a[q] == '0')
b[q] = 0;
else b[q] = 1; //防止用户输入了些奇奇怪怪的数字
}
}
void CharToInt4(char a[4], int b[4]) {
for (int q = 0; q < 4; q++) {
if (a[q] == '0')
b[q] = 0;
else b[q] = 1; //防止用户输入了些奇奇怪怪的数字
}
}
#endif // TASK4_H_INCLUDED
#pragma once