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/windows.cpp

140 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.

#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;
}