#include "des56.h"
#include <stdlib.h>
#include <stdio.h>
#include <map>
#include <vector>
#include <string.h>
#define ENCRYPT 0
#define DECRYPT 1
using namespace std;
void DES_21_bit_key(const char pt[8],char ct[8],int decrypt, char key[3])
{
keysched ks;
char big_key[8] = {0};
memcpy(big_key,key,3);
fsetkey(big_key,&ks);
if (ct != pt)
memcpy(ct,pt,8);
fencrypt(ct,decrypt,&ks);
}
void double_DES_21(char block[8],int decrypt, char key1[3], char key2[3])
{
if(decrypt) {
DES_21_bit_key(block,block,decrypt,key2);
DES_21_bit_key(block,block,decrypt,key1);
} else {
DES_21_bit_key(block,block,decrypt,key1);
DES_21_bit_key(block,block,decrypt,key2);
}
}
void next_key(char key1[])
{
key1[2] += 2;
if(key1[2] == 0)
{
key1[1] += 2;
if(key1[1]==0)
{
key1[0] += 2;
}
}
}
int main()
{
char x[8] = {'a','b','c','d','e','f','g','h'};
char y[8] = {0x03,0x8d ,0x8a,0xdf ,0x90, 0xe7 ,0x0b,0xbe};
char z[8] = {0, 1, 2, 3, 4, 5, 6, 7};
char key1[3] = {0};
char key2[3] = {0};
int i = 0;
map<vector<char>,vector<char> > M;
for(; i < (1 << 21); i++)
{
DES_21_bit_key(x, z, 0, key1);
vector<char> K(key1,key1+3);
vector<char> Z(z,z+8);
M[Z] = K;
next_key(key1);
}
bzero(key1, 3);
i = 0;
for(; i < (1 << 21); i++)
{
DES_21_bit_key(y, z, 1, key1);
vector<char> K(key1,key1+3);
vector<char> Z(z,z+8);
map<vector<char>,vector<char> >::iterator L = M.find(Z);
if (L != M.end())
{
for(int i = 0; i < 3; i++)
{
key2[i] = M[Z][i];
}
break;
}
else
next_key(key1);
}
char block1[8] = {0x1a, 0xe8, 0xba, 0x6f, 0xb4, 0x0f, 0xf2, 0xea};
char block2[8] = {0xc9, 0xfc, 0xdf, 0x8c, 0xc4, 0x79, 0x0b, 0xcc};
char block3[8] = {0xc4, 0x8e, 0x20, 0xb6, 0xc0, 0xb5, 0x15, 0x8e};
double_DES_21(block1, 1, key2, key1);
double_DES_21(block2, 1, key2, key1);
double_DES_21(block3, 1, key2, key1);
for(int i = 0; i < 8; i++)
printf("%c", block1[i]);
for(int i = 0; i < 8; i++)
printf("%c", block2[i]);
for(int i = 0; i < 8; i++)
printf("%c", block3[i]);
double_DES_21(block1, 0, key2, key1);
double_DES_21(block2, 0, key2, key1);
double_DES_21(block3, 0, key2, key1);
for(int i = 0; i < 8; i++)
printf("%hhx", block1[i]);
for(int i = 0; i < 8; i++)
printf("%hhx", block2[i]);
for(int i = 0; i < 8; i++)
printf("%hhx", block3[i]);
return 0;
}