Skip to content

Instantly share code, notes, and snippets.

@HendrikSikke
Created September 1, 2019 18:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save HendrikSikke/0598152a42ec44afaa450a4e7d57eae5 to your computer and use it in GitHub Desktop.
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 */
#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