Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* READ_RAW - Read raw encoded number */
- /* READ_NUM - Read decoded number */
- /* WRITE_NUM - Write encoded number */
- /* WRITE_HEADER - Write the static header used for all stored numbers */
- #define READ_RAW(x) ((x) & 0x3FFFF)
- #define READ_NUM(x) ((int)(READ_RAW(x) - 0x1ffff))
- #define WRITE_NUM(n, x) ((n) = (((n) & 0xfffc0000) | ((unsigned int)(x + 0x1ffff) & 0x3ffff)))
- #define WRITE_HEADER(n) ((n) &= 0x3FFFFFF | 0x50000000)
- /* An array used for the encryption... somehow */
- unsigned int someArray[] = {
- 0b00010000010101011011011110011110,
- 0b11001111000001101101100010100010,
- 0b01011001101011111111111000111000,
- 0b10111111001010100100101111101110,
- 0b10100101111011101101100010100000,
- 0b00010011110101111111111000111100,
- 0b00100101101110100100101111100110,
- 0b01100010000101101101100010110000,
- 0b00000010010011111111111000011100,
- 0b10000010001100100100101110100110,
- 0b00111010100000110110111110101110,
- 0b01001010001010010010011110111110,
- 0b11011000100011011011011110011110,
- 0b01001101010010010010000001000000,
- 0b11100100101101111111011100011110,
- 0b00100100011110100101100110100010,
- 0b11001100101100110100101110100110,
- 0b11000111111100010110111110101110,
- 0b10001100100001010010011110111110,
- 0b01001100000110000000000000000000,
- 0b01110000001110000000000000000000,
- 0b00001110011000000000000000000000,
- 0b01010110101001011011011110011110,
- 0b10100000111111101101100010100010,
- 0b01111100001001111111111000111000,
- 0b01100111111001111111110001110001,
- 0b10101110100100000000000000000000,
- 0b01100010100110000000000000000000,
- 0b10010010100010000000000000000000,
- 0b00101001101000000000000000000000,
- 0b10010100011000000000000000000000,
- 0b01001000011100000000000000000000,
- };
- /* Encrypts numbers by the key */
- unsigned int encryptFormattedNumber(unsigned int num, int key)
- {
- unsigned int result = 0, mask = 1;
- num = READ_RAW(num ^ (-0x2751 * key));
- for (int bit = 0; bit < 32; bit++) {
- int temp = mask;
- if (!(__popcnt((READ_RAW(num) | 0x10000000) & someArray[bit]) & 1))
- temp = 0;
- result |= temp;
- mask <<= 1;
- }
- return result;
- }
- /* Decrypts numbers by key */
- unsigned int decryptFormattedNumber(unsigned int num, int key)
- {
- unsigned int partialDec1 = num ^ (0x1F3D8AF * key);
- unsigned int rotl = _rotl(num, 7);
- unsigned int rotr = _rotr(num, 3);
- unsigned int partialDec2 = (rotl ^ rotr);
- return (partialDec1 ^ partialDec2);
- }
- /* Example usage function */
- void example() {
- unsigned int numToStore = 50;
- unsigned int key = 20;
- unsigned int dataToEncrypt = 0;
- WRITE_HEADER(dataToEncrypt);
- WRITE_NUM(dataToEncrypt, numToStore);
- unsigned int encrypted = encryptFormattedNumber(dataToEncrypt, key);
- unsigned int decryptedDirty = decryptFormattedNumber(encrypted, key);
- unsigned int decryptedClean = decryptedDirty & ~0x3FC0000; /* Clean excess bits */
- WRITE_HEADER(decryptedClean); /* Correct header */
- assert(READ_NUM(dataToEncrypt) == READ_NUM(decryptedClean));
- }
- | 31 26 | 25 18 | 17 0 |
- | Header (static) | Excess | Bias encoded number |
- | 010100 | 00000000 | 000000000000000000 |
Add Comment
Please, Sign In to add comment