Guest User

Untitled

a guest
Jan 20th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.21 KB | None | 0 0
  1. /* READ_RAW - Read raw encoded number */
  2. /* READ_NUM - Read decoded number */
  3. /* WRITE_NUM - Write encoded number */
  4. /* WRITE_HEADER - Write the static header used for all stored numbers */
  5. #define READ_RAW(x) ((x) & 0x3FFFF)
  6. #define READ_NUM(x) ((int)(READ_RAW(x) - 0x1ffff))
  7. #define WRITE_NUM(n, x) ((n) = (((n) & 0xfffc0000) | ((unsigned int)(x + 0x1ffff) & 0x3ffff)))
  8. #define WRITE_HEADER(n) ((n) &= 0x3FFFFFF | 0x50000000)
  9.  
  10. /* An array used for the encryption... somehow */
  11. unsigned int someArray[] = {
  12. 0b00010000010101011011011110011110,
  13. 0b11001111000001101101100010100010,
  14. 0b01011001101011111111111000111000,
  15. 0b10111111001010100100101111101110,
  16. 0b10100101111011101101100010100000,
  17. 0b00010011110101111111111000111100,
  18. 0b00100101101110100100101111100110,
  19. 0b01100010000101101101100010110000,
  20. 0b00000010010011111111111000011100,
  21. 0b10000010001100100100101110100110,
  22. 0b00111010100000110110111110101110,
  23. 0b01001010001010010010011110111110,
  24. 0b11011000100011011011011110011110,
  25. 0b01001101010010010010000001000000,
  26. 0b11100100101101111111011100011110,
  27. 0b00100100011110100101100110100010,
  28. 0b11001100101100110100101110100110,
  29. 0b11000111111100010110111110101110,
  30. 0b10001100100001010010011110111110,
  31. 0b01001100000110000000000000000000,
  32. 0b01110000001110000000000000000000,
  33. 0b00001110011000000000000000000000,
  34. 0b01010110101001011011011110011110,
  35. 0b10100000111111101101100010100010,
  36. 0b01111100001001111111111000111000,
  37. 0b01100111111001111111110001110001,
  38. 0b10101110100100000000000000000000,
  39. 0b01100010100110000000000000000000,
  40. 0b10010010100010000000000000000000,
  41. 0b00101001101000000000000000000000,
  42. 0b10010100011000000000000000000000,
  43. 0b01001000011100000000000000000000,
  44. };
  45.  
  46. /* Encrypts numbers by the key */
  47. unsigned int encryptFormattedNumber(unsigned int num, int key)
  48. {
  49. unsigned int result = 0, mask = 1;
  50. num = READ_RAW(num ^ (-0x2751 * key));
  51.  
  52. for (int bit = 0; bit < 32; bit++) {
  53. int temp = mask;
  54. if (!(__popcnt((READ_RAW(num) | 0x10000000) & someArray[bit]) & 1))
  55. temp = 0;
  56.  
  57. result |= temp;
  58. mask <<= 1;
  59. }
  60.  
  61. return result;
  62. }
  63.  
  64. /* Decrypts numbers by key */
  65. unsigned int decryptFormattedNumber(unsigned int num, int key)
  66. {
  67. unsigned int partialDec1 = num ^ (0x1F3D8AF * key);
  68. unsigned int rotl = _rotl(num, 7);
  69. unsigned int rotr = _rotr(num, 3);
  70. unsigned int partialDec2 = (rotl ^ rotr);
  71.  
  72. return (partialDec1 ^ partialDec2);
  73. }
  74.  
  75. /* Example usage function */
  76. void example() {
  77. unsigned int numToStore = 50;
  78. unsigned int key = 20;
  79.  
  80. unsigned int dataToEncrypt = 0;
  81. WRITE_HEADER(dataToEncrypt);
  82. WRITE_NUM(dataToEncrypt, numToStore);
  83.  
  84. unsigned int encrypted = encryptFormattedNumber(dataToEncrypt, key);
  85. unsigned int decryptedDirty = decryptFormattedNumber(encrypted, key);
  86. unsigned int decryptedClean = decryptedDirty & ~0x3FC0000; /* Clean excess bits */
  87. WRITE_HEADER(decryptedClean); /* Correct header */
  88.  
  89. assert(READ_NUM(dataToEncrypt) == READ_NUM(decryptedClean));
  90. }
  91.  
  92. | 31 26 | 25 18 | 17 0 |
  93. | Header (static) | Excess | Bias encoded number |
  94. | 010100 | 00000000 | 000000000000000000 |
Add Comment
Please, Sign In to add comment