bool key_check (const unsigned char *key) { unsigned long v = 3; unsigned char i = 0; while (i < 12) v += key [i++] ^ v * 2; return key [12] == v % 10; } inline unsigned char key_product (const unsigned char *key) { return key [1]; } unsigned long key_public (const unsigned char *key) { unsigned char pub [8]; unsigned char i = 2, j = 0; while (i < 10) pub [j++] = key [i++]; return toint (pub, 8); } inline unsigned long key_private (const unsigned char *key) { return toint (key + 10, 3); } void key_decode (const unsigned char *key, unsigned char *deckey) { unsigned char seq [] = {6, 0, 2, 9, 3, 11, 1, 7, 5, 4, 10, 8}; unsigned char i = 11; unsigned long v = 330078017; do { seq [i] = key [seq [i]]; if (seq [i] < 8) { seq [i] ^= v & 7; v >>= 3; } else seq [i] ^= i & 1; deckey [i] = seq [i]; } while (i--); }