Created
September 1, 2019 18:59
-
-
Save HendrikSikke/0598152a42ec44afaa450a4e7d57eae5 to your computer and use it in GitHub Desktop.
created to answer https://crypto.stackexchange.com/questions/72900/how-are-the-four-8-bit-permutation-tables-of-present-cipher-calculated
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
/* created to answer | |
https://crypto.stackexchange.com/questions/72900/how-are-the-four-8-bit-permutation-tables-of-present-cipher-calculated */ | |
#include <stdint.h> | |
#include <stdio.h> | |
/*nibble box */ | |
const uint8_t sbox[16]={0xC, 5, 6, 0xB, 9,0,0xA, 0xD,3,0xE, 0xF, 8,4,7,1,2}; | |
static void print_table(const char *name, uint8_t t[256]){ | |
fprintf(stdout, "%s:\n", name); | |
for (int i=0; i<256; i++){ | |
fprintf(stdout, "%02x%c", t[i], (((i+1) % 16) ? ' ' : '\n')); | |
} | |
fprintf(stdout, "\n"); | |
return; | |
} | |
int main(void){ | |
int b; | |
uint8_t T0[256], T1[256], T2[256], T3[256]; | |
for (b= 0; b<256; b++){ | |
uint8_t U = sbox[(b >> 4)&0x0f]; | |
uint8_t L = sbox[b & 0xf]; | |
uint8_t hn0,hn1,hn2,hn3; | |
hn0 = ( (U & 1) << 1 ) | (L & 1); | |
hn1 = (U & 2) | ((L & 2) >> 1 ); | |
hn2 = ( (U & 4) >> 1 ) | ((L & 4) >> 2 ); | |
hn3 = ( (U & 8) >> 2 ) | ((L & 8) >> 3 ); | |
T0[b] = hn0 | ( hn1 << 2 ) | (hn2 << 4 ) | (hn3 << 6 ); | |
T1[b] = hn3 | ( hn0 << 2 ) | (hn1 << 4 ) | (hn2 << 6 ); | |
T2[b] = hn2 | ( hn3 << 2 ) | (hn0 << 4 ) | (hn1 << 6 ); | |
T3[b] = hn1 | ( hn2 << 2 ) | (hn3 << 4 ) | (hn0 << 6 ); | |
} | |
print_table("T0", T0); | |
print_table("T1", T1); | |
print_table("T2", T2); | |
print_table("T3", T3); | |
return 0; | |
} | |
/* based on this analysis of the origin of the post permutation bits: | |
bit 0 = byte 0, subbit 0 from byte 0, subbit 0 | |
bit 1 = byte 0, subbit 1 from byte 0, subbit 4 | |
bit 2 = byte 0, subbit 2 from byte 1, subbit 0 | |
bit 3 = byte 0, subbit 3 from byte 1, subbit 4 | |
bit 4 = byte 0, subbit 4 from byte 2, subbit 0 | |
bit 5 = byte 0, subbit 5 from byte 2, subbit 4 | |
bit 6 = byte 0, subbit 6 from byte 3, subbit 0 | |
bit 7 = byte 0, subbit 7 from byte 3, subbit 4 | |
bit 8 = byte 1, subbit 0 from byte 4, subbit 0 | |
bit 9 = byte 1, subbit 1 from byte 4, subbit 4 | |
bit 10 = byte 1, subbit 2 from byte 5, subbit 0 | |
bit 11 = byte 1, subbit 3 from byte 5, subbit 4 | |
bit 12 = byte 1, subbit 4 from byte 6, subbit 0 | |
bit 13 = byte 1, subbit 5 from byte 6, subbit 4 | |
bit 14 = byte 1, subbit 6 from byte 7, subbit 0 | |
bit 15 = byte 1, subbit 7 from byte 7, subbit 4 | |
bit 16 = byte 2, subbit 0 from byte 0, subbit 1 | |
bit 17 = byte 2, subbit 1 from byte 0, subbit 5 | |
bit 18 = byte 2, subbit 2 from byte 1, subbit 1 | |
bit 19 = byte 2, subbit 3 from byte 1, subbit 5 | |
bit 20 = byte 2, subbit 4 from byte 2, subbit 1 | |
bit 21 = byte 2, subbit 5 from byte 2, subbit 5 | |
bit 22 = byte 2, subbit 6 from byte 3, subbit 1 | |
bit 23 = byte 2, subbit 7 from byte 3, subbit 5 | |
bit 24 = byte 3, subbit 0 from byte 4, subbit 1 | |
bit 25 = byte 3, subbit 1 from byte 4, subbit 5 | |
bit 26 = byte 3, subbit 2 from byte 5, subbit 1 | |
bit 27 = byte 3, subbit 3 from byte 5, subbit 5 | |
bit 28 = byte 3, subbit 4 from byte 6, subbit 1 | |
bit 29 = byte 3, subbit 5 from byte 6, subbit 5 | |
bit 30 = byte 3, subbit 6 from byte 7, subbit 1 | |
bit 31 = byte 3, subbit 7 from byte 7, subbit 5 | |
bit 32 = byte 4, subbit 0 from byte 0, subbit 2 | |
bit 33 = byte 4, subbit 1 from byte 0, subbit 6 | |
bit 34 = byte 4, subbit 2 from byte 1, subbit 2 | |
bit 35 = byte 4, subbit 3 from byte 1, subbit 6 | |
bit 36 = byte 4, subbit 4 from byte 2, subbit 2 | |
bit 37 = byte 4, subbit 5 from byte 2, subbit 6 | |
bit 38 = byte 4, subbit 6 from byte 3, subbit 2 | |
bit 39 = byte 4, subbit 7 from byte 3, subbit 6 | |
bit 40 = byte 5, subbit 0 from byte 4, subbit 2 | |
bit 41 = byte 5, subbit 1 from byte 4, subbit 6 | |
bit 42 = byte 5, subbit 2 from byte 5, subbit 2 | |
bit 43 = byte 5, subbit 3 from byte 5, subbit 6 | |
bit 44 = byte 5, subbit 4 from byte 6, subbit 2 | |
bit 45 = byte 5, subbit 5 from byte 6, subbit 6 | |
bit 46 = byte 5, subbit 6 from byte 7, subbit 2 | |
bit 47 = byte 5, subbit 7 from byte 7, subbit 6 | |
bit 48 = byte 6, subbit 0 from byte 0, subbit 3 | |
bit 49 = byte 6, subbit 1 from byte 0, subbit 7 | |
bit 50 = byte 6, subbit 2 from byte 1, subbit 3 | |
bit 51 = byte 6, subbit 3 from byte 1, subbit 7 | |
bit 52 = byte 6, subbit 4 from byte 2, subbit 3 | |
bit 53 = byte 6, subbit 5 from byte 2, subbit 7 | |
bit 54 = byte 6, subbit 6 from byte 3, subbit 3 | |
bit 55 = byte 6, subbit 7 from byte 3, subbit 7 | |
bit 56 = byte 7, subbit 0 from byte 4, subbit 3 | |
bit 57 = byte 7, subbit 1 from byte 4, subbit 7 | |
bit 58 = byte 7, subbit 2 from byte 5, subbit 3 | |
bit 59 = byte 7, subbit 3 from byte 5, subbit 7 | |
bit 60 = byte 7, subbit 4 from byte 6, subbit 3 | |
bit 61 = byte 7, subbit 5 from byte 6, subbit 7 | |
bit 62 = byte 7, subbit 6 from byte 7, subbit 3 | |
bit 63 = byte 7, subbit 7 from byte 7, subbit 7 | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment