Created
December 1, 2011 15:42
-
-
Save soimort/1417677 to your computer and use it in GitHub Desktop.
ECB-DES
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
void exor4(char *destination, const char *source1, const char *source2) | |
{ | |
*destination &= 0x0F; | |
for (int i = 0; i < 4; i++) | |
*destination |= (((*source1 >> (7 - i)) & 1) ^ ((*source2 >> (7 - i)) & 1)) << (7 - i); | |
} | |
void exor6(char *destination, const char *source1, const char *source2) | |
{ | |
*destination &= 0x03; | |
for (int i = 0; i < 6; i++) | |
*destination |= (((*source1 >> (7 - i)) & 1) ^ ((*source2 >> (7 - i)) & 1)) << (7 - i); | |
} | |
void execPermutation(char *destination, const char *source, | |
int destinationBitSize, int destinationByteNum, int sourceByteNum, const int *v) | |
{ | |
char temp[sourceByteNum]; | |
memcpy(temp, source, sourceByteNum); | |
memset(destination, 0, destinationByteNum); | |
for (int i = 0; i < destinationByteNum; i++) | |
for (int j = 0; j < 8; j++) | |
if (i * 8 + j < destinationBitSize) { | |
destination[i] |= ((temp[(v[i * 8 + j] - 1) / 8] | |
>> (7 - (v[i * 8 + j] - 1) % 8)) & 1) << (7 - j); | |
} | |
} | |
void initialPermutation(char *destination, const char *source) | |
{ | |
int v[] = { | |
58, 50, 42, 34, 26, 18, 10, 2, | |
60, 52, 44, 36, 28, 20, 12, 4, | |
62, 54, 46, 38, 30, 22, 14, 6, | |
64, 56, 48, 40, 32, 24, 16, 8, | |
57, 49, 41, 33, 25, 17, 9, 1, | |
59, 51, 43, 35, 27, 19, 11, 3, | |
61, 53, 45, 37, 29, 21, 13, 5, | |
63, 55, 47, 39, 31, 23, 15, 7, | |
}; | |
execPermutation(destination, source, 64, 8, 8, v); | |
} | |
void finalPermutation(char *destination, const char *source) | |
{ | |
int v[] = { | |
40, 8, 48, 16, 56, 24, 64, 32, | |
39, 7, 47, 15, 55, 23, 63, 31, | |
38, 6, 46, 14, 54, 22, 62, 30, | |
37, 5, 45, 13, 53, 21, 61, 29, | |
36, 4, 44, 12, 52, 20, 60, 28, | |
35, 3, 43, 11, 51, 19, 59, 27, | |
34, 2, 42, 10, 50, 18, 58, 26, | |
33, 1, 41, 9, 49, 17, 57, 25, | |
}; | |
execPermutation(destination, source, 64, 8, 8, v); | |
} | |
void expansionFunction(char *destination, const char *source) | |
{ | |
int v[] = { | |
32, 1, 2, 3, 4, 5, | |
4, 5, 6, 7, 8, 9, | |
8, 9, 10, 11, 12, 13, | |
12, 13, 14, 15, 16, 17, | |
16, 17, 18, 19, 20, 21, | |
20, 21, 22, 23, 24, 25, | |
24, 25, 26, 27, 28, 29, | |
28, 29, 30, 31, 32, 1, | |
}; | |
execPermutation(destination, source, 48, 6, 4, v); | |
} | |
void permutation(char *destination, const char *source) | |
{ | |
int v[] = { | |
16, 7, 20, 21, | |
29, 12, 28, 17, | |
1, 15, 23, 26, | |
5, 18, 31, 10, | |
2, 8, 24, 14, | |
32, 27, 3, 9, | |
19, 13, 30, 6, | |
22, 11, 4, 25, | |
}; | |
execPermutation(destination, source, 32, 4, 4, v); | |
} | |
void permutedChoice1_Left(char *destination, const char *source) | |
{ | |
int v[] = { | |
57, 49, 41, 33, 25, 17, 9, | |
1, 58, 50, 42, 34, 26, 18, | |
10, 2, 59, 51, 43, 35, 27, | |
19, 11, 3, 60, 52, 44, 36, | |
}; | |
execPermutation(destination, source, 28, 4, 8, v); | |
} | |
void permutedChoice1_Right(char *destination, const char *source) | |
{ | |
int v[] = { | |
63, 55, 47, 39, 31, 23, 15, | |
7, 62, 54, 46, 38, 30, 22, | |
14, 6, 61, 53, 45, 37, 29, | |
21, 13, 5, 28, 20, 12, 4, | |
}; | |
execPermutation(destination, source, 28, 4, 8, v); | |
} | |
void permutedChoice2(char *destination, const char *source) | |
{ | |
int v[] = { | |
14, 17, 11, 24, 1, 5, | |
3, 28, 15, 6, 21, 10, | |
23, 19, 12, 4, 26, 8, | |
16, 7, 27, 20, 13, 2, | |
41, 52, 31, 37, 47, 55, | |
30, 40, 51, 45, 33, 48, | |
44, 49, 39, 56, 34, 53, | |
46, 42, 50, 36, 29, 32, | |
}; | |
execPermutation(destination, source, 48, 6, 7, v); | |
} | |
void sBoxes(char *destination, const char *source) | |
{ | |
int v[][64] = { | |
{ | |
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, | |
}, | |
{ | |
15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, | |
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, | |
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, | |
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9, | |
}, | |
{ | |
10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, | |
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, | |
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, | |
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12, | |
}, | |
{ | |
7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, | |
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, | |
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, | |
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14, | |
}, | |
{ | |
2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, | |
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, | |
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, | |
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3, | |
}, | |
{ | |
12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, | |
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, | |
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, | |
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13, | |
}, | |
{ | |
4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, | |
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, | |
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, | |
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12, | |
}, | |
{ | |
13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, | |
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, | |
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, | |
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11, | |
}, | |
}; | |
unsigned long long temp = 0; | |
memcpy(&temp, source, 6); | |
unsigned long tempDest = 0; | |
memset(&tempDest, 0, 4); | |
unsigned long long maskX = 0x7800000000000000; | |
unsigned long long maskY = 0x8400000000000000; | |
for (int i = 0; i < 8; i++) { | |
tempDest |= v[i][(temp & maskX >> 23) + (temp & maskY >> 22) * 16] << (i * 4); | |
temp <<= 6; | |
} | |
memcpy(destination, &tempDest, 4); | |
} | |
void keySchedule(char subkey[][6], const char *key) | |
{ | |
int r[] = {1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1}; | |
unsigned long leftKey, rightKey; | |
permutedChoice1_Left((char *)&leftKey, key); | |
permutedChoice1_Right((char *)&rightKey, key); | |
leftKey &= 0xFFFFFFF0; | |
rightKey &= 0xFFFFFFF0; | |
unsigned long temp = 0; | |
for (int i = 0; i < 16; i++) { | |
temp = ((leftKey <<= r[i]) << 28) | (rightKey <<= r[i]); | |
permutedChoice2(subkey[i], (char *)&temp); | |
} | |
} | |
void fiestel(char *destination, const char *source, const int round, const char *subkey) | |
{ | |
char temp[6]; | |
expansionFunction(temp, source); | |
exor6(temp, subkey, temp); | |
sBoxes(destination, temp); | |
permutation(destination, destination); | |
} | |
void des(char *cipher, const char *plain, const char *key) | |
{ | |
char subkey[16][6]; | |
keySchedule(subkey, key); | |
memcpy(cipher, plain, 8); | |
initialPermutation(cipher, cipher); | |
char temp[4]; | |
for (int i = 0; i < 15; i++) { | |
memcpy(temp, cipher + 4, 4); | |
fiestel(cipher + 4, cipher + 4, i, subkey[i]); | |
exor4(cipher + 4, cipher, cipher + 4); | |
memcpy(cipher, temp, 4); | |
} | |
memcpy(temp, cipher, 4); | |
fiestel(cipher, cipher + 4, 15, subkey[15]); | |
exor4(cipher, temp, cipher); | |
finalPermutation(cipher, cipher); | |
} | |
int main() | |
{ | |
char *plainText = (char *)malloc(128 * sizeof(char)); | |
char *cipherText = (char *)malloc(128 * sizeof(char)); | |
fgets(plainText, 128, stdin); | |
int blockNum = strlen(plainText) / 8 + 1; | |
*(plainText + strlen(plainText)) = 1; | |
for (int i = 0; i < blockNum; i++) | |
des(cipherText + i * 8, plainText + i * 8, "12345678"); | |
for (int i = 0; i < blockNum; i++) | |
for (int j = 0; j < 8; j++) | |
printf("%d: %d %c\n", i * 8 + j, cipherText[i * 8 + j], | |
cipherText[i * 8 + j]); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment