|
|
#include<stdio.h>
|
|
|
#include<stdlib.h>
|
|
|
#include<time.h>
|
|
|
#include<windows.h>
|
|
|
#include<string.h>
|
|
|
#include<math.h>
|
|
|
#include"analysis table.h"
|
|
|
#include "des.h"
|
|
|
#include "hack.h"
|
|
|
#include "key table.h"
|
|
|
#include<iostream>
|
|
|
#include<cstdlib>
|
|
|
#include<cstring>
|
|
|
#include<fstream>
|
|
|
using namespace std;
|
|
|
|
|
|
|
|
|
int main() {
|
|
|
|
|
|
int chooseNum;
|
|
|
int q;
|
|
|
|
|
|
printf(" \n\n\n\n\n\n\n \n");
|
|
|
printf(" ################################################################\n");
|
|
|
printf(" ## ##\n");
|
|
|
printf(" ## ##\n");
|
|
|
printf(" ## DES差分分析 ##\n");
|
|
|
printf(" ## ##\n");
|
|
|
printf(" ## ##\n");
|
|
|
printf(" ## ##\n");
|
|
|
printf(" ################################################################\n\n");
|
|
|
printf(" 请按任何键以继续 ,, ");
|
|
|
getchar();
|
|
|
system("cls");
|
|
|
|
|
|
printf("\n\n\n\n\n\n\n 请选择任务序号:\n");
|
|
|
printf(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
|
|
|
printf(" @ @\n");
|
|
|
printf(" @ ** 1=任务1 差分分析统计表 ** @\n");
|
|
|
printf(" @ ** 2=任务2 输出密钥集合 ** @\n");
|
|
|
printf(" @ ** 3=任务3 三轮差分攻击 ** @\n");
|
|
|
printf(" @ ** 4=任务4 六轮差分攻击 ** @\n");
|
|
|
printf(" @ ** ** @\n");
|
|
|
printf(" @ ** 5= 退出 ** @\n");
|
|
|
printf(" @ @\n");
|
|
|
printf(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
|
|
|
printf(" 请输入您的选择:");
|
|
|
scanf("%d", &chooseNum);
|
|
|
getchar();
|
|
|
|
|
|
while (chooseNum != 5)
|
|
|
{
|
|
|
switch (chooseNum)
|
|
|
{
|
|
|
case 1:
|
|
|
printf("请输入6位差分:");
|
|
|
char intput[6];
|
|
|
scanf("%s", intput);
|
|
|
//gets_s(intput);
|
|
|
int intputchafen[6];
|
|
|
for (q = 0; q < 6; q++) {
|
|
|
if (intput[q] == '0')
|
|
|
intputchafen[q] = 0;
|
|
|
else intputchafen[q] = 1; //防止用户输入了些奇奇怪怪的数字
|
|
|
}
|
|
|
printf("\n");
|
|
|
mainFuntion(intputchafen);
|
|
|
system("PAUSE");
|
|
|
break;
|
|
|
|
|
|
case 2:
|
|
|
char E[6];
|
|
|
char ee[6]; //E*
|
|
|
char hello[4]; //输出差分
|
|
|
|
|
|
printf("s盒的输入E:(6位)");
|
|
|
|
|
|
scanf("%s",E);
|
|
|
printf("s盒的输入e:(6位)");
|
|
|
scanf("%s",ee);
|
|
|
|
|
|
printf("s盒的输出差分hello:(4位)");
|
|
|
scanf("%s",hello);
|
|
|
mainFuntion4(E, ee, hello);
|
|
|
system("PAUSE");
|
|
|
break;
|
|
|
|
|
|
case 3:
|
|
|
system("3rnd.exe");
|
|
|
break;
|
|
|
|
|
|
case 4:
|
|
|
ull inA = 0, inB = 0, outA = 0, outB = 0;
|
|
|
ull inC = 0, inD = 0, outC = 0, outD = 0;
|
|
|
ull key;
|
|
|
printf("请输入初始64位密钥(十六进制以0x开头):\n");
|
|
|
cin >> hex >> key;
|
|
|
//ull key = 0xF0F0F0F0F0F0F0F0;
|
|
|
/* ull key = 0xF1F2F3F4F5F6F7F8;*/
|
|
|
|
|
|
DesHacker hacker;
|
|
|
for (int i = 0; i < 2; i++) {
|
|
|
constructCipherPlaintexts(key, 1, inA, inB, outA, outB); // 随机生成满足第一种差分特征的两个明密文对
|
|
|
hacker.addCipherPlaintexts(inA, inB, outA, outB); // 将构造好的明密文对传入DesHacker中
|
|
|
}
|
|
|
for (int i = 0; i < 2; i++) {
|
|
|
constructCipherPlaintexts(key, 2, inC, inD, outC, outD); // 随机生成满足第二种差分特征的两个明密文对
|
|
|
hacker.addCipherPlaintexts(inC, inD, outC, outD);
|
|
|
}
|
|
|
|
|
|
if (hacker.hack()) { // 差分分析
|
|
|
ull result_key = hacker.getKey();
|
|
|
printf("Success\n");
|
|
|
print_long_hex(result_key);
|
|
|
}
|
|
|
else {
|
|
|
printf("Failed...\n");
|
|
|
}
|
|
|
system("PAUSE");
|
|
|
break;
|
|
|
}
|
|
|
system("cls");
|
|
|
printf("\n\n\n\n\n\n\n 请选择任务序号:\n");
|
|
|
printf(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
|
|
|
printf(" @ @\n");
|
|
|
printf(" @ ** 1=任务1 差分分析统计表 ** @\n");
|
|
|
printf(" @ ** 2=任务2 输出密钥集合 ** @\n");
|
|
|
printf(" @ ** 3=任务3 三轮差分攻击 ** @\n");
|
|
|
printf(" @ ** 4=任务4 六轮差分攻击 ** @\n");
|
|
|
printf(" @ ** ** @\n");
|
|
|
printf(" @ ** 5= 退出 ** @\n");
|
|
|
printf(" @ @\n");
|
|
|
printf(" @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
|
|
|
printf(" 请输入您的选择:");
|
|
|
scanf("%d", &chooseNum);
|
|
|
getchar();
|
|
|
}
|
|
|
return 0;
|
|
|
}
|