60 lines
1.1 KiB
C
60 lines
1.1 KiB
C
|
#include "spn.h"
|
||
|
|
||
|
unsigned char do_perm(unsigned char w, unsigned char perm[8]) {
|
||
|
unsigned char output = 0x00;
|
||
|
|
||
|
for (int i = 0; i < 8; i++) {
|
||
|
output |= (w & (1 << i)) >> i << perm[i];
|
||
|
}
|
||
|
|
||
|
return output;
|
||
|
}
|
||
|
|
||
|
unsigned char do_subst(unsigned char w, unsigned char subst[16]) {
|
||
|
unsigned char output = 0x00;
|
||
|
|
||
|
output |= subst[(w & 0xF)];
|
||
|
output |= subst[(w & 0xF0) >> 4] << 4;
|
||
|
|
||
|
return output;
|
||
|
}
|
||
|
|
||
|
unsigned char encrypt(
|
||
|
unsigned char w,
|
||
|
unsigned short key,
|
||
|
unsigned char perm[8],
|
||
|
unsigned char subst[16]
|
||
|
) {
|
||
|
unsigned char k0 = key & 0xFF;
|
||
|
unsigned char k1 = (key & 0xFF00) >> 8;
|
||
|
|
||
|
w ^= k0;
|
||
|
w = do_subst(w, subst);
|
||
|
w = do_perm(w, perm);
|
||
|
|
||
|
w ^= k1;
|
||
|
w = do_subst(w, subst);
|
||
|
w = do_perm(w, perm);
|
||
|
|
||
|
return w;
|
||
|
}
|
||
|
|
||
|
unsigned char decrypt(
|
||
|
unsigned char w,
|
||
|
unsigned short key,
|
||
|
unsigned char perm[8],
|
||
|
unsigned char subst[16]
|
||
|
) {
|
||
|
unsigned char k0 = key & 0xFF;
|
||
|
unsigned char k1 = (key & 0xFF00) >> 8;
|
||
|
|
||
|
w = do_perm(w, perm);
|
||
|
w = do_subst(w, subst);
|
||
|
w ^= k1;
|
||
|
|
||
|
w = do_perm(w, perm);
|
||
|
w = do_subst(w, subst);
|
||
|
w ^= k0;
|
||
|
|
||
|
return w;
|
||
|
}
|