Advertisement
Guest User

Untitled

a guest
Nov 17th, 2014
273
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.29 KB | None | 0 0
  1. /**
  2. * Compile with: g++ -g --std=gnu++0x sampleProg.cpp -lssl -lcrypto
  3. */
  4.  
  5. #include <unistd.h>
  6. #include <iostream>
  7. #include <openssl/md4.h>
  8. #include <openssl/des.h>
  9. #include <string>
  10. #include <cstring>
  11. #include <mutex>
  12. #include <vector>
  13. #include <pthread.h>
  14. #include <cmath>
  15.  
  16. #define atoll DONT_USE_THIS_FUNCTION
  17. #define MESSAGE_SIZE 8
  18. #define HEX 16
  19.  
  20. using namespace std;
  21.  
  22. typedef unsigned int u64 __attribute__((mode(DI)));
  23.  
  24. u64 cHash;
  25. u64 endHash;
  26.  
  27. //a POW function better suited for large integers
  28. u64 long_pow(u64 base, u64 power){
  29. long long toReturn = 1;
  30.  
  31. if(power > 0)
  32. while(power--) toReturn *= base;
  33. else if(power < 0)
  34. while(power++) toReturn /= base;
  35.  
  36. return toReturn;
  37. }
  38.  
  39. //a local reimplementation of atoll
  40. u64 local_atoll(const char* input, unsigned int base){
  41.  
  42. if(base < 1 || base > 16 || input == NULL){
  43. errno = EINVAL;
  44. return 0;
  45. }
  46.  
  47. long long toReturn = 0;
  48. bool neg = false;
  49.  
  50. for(int power = 0; power < strlen(input); power++){
  51. long long digit;
  52. switch(input[power]){
  53. case '-' : neg = !neg; break;
  54. case '0' : digit = 0; break;
  55. case '1' : digit = 1; break;
  56. case '2' : digit = 2; break;
  57. case '3' : digit = 3; break;
  58. case '4' : digit = 4; break;
  59. case '5' : digit = 5; break;
  60. case '6' : digit = 6; break;
  61. case '7' : digit = 7; break;
  62. case '8' : digit = 8; break;
  63. case '9' : digit = 9; break;
  64. case 'a' :
  65. case 'A' : digit = 10; break;
  66. case 'b' :
  67. case 'B' : digit = 11; break;
  68. case 'c' :
  69. case 'C' : digit = 12; break;
  70. case 'd' :
  71. case 'D' : digit = 13; break;
  72. case 'e' :
  73. case 'E' : digit = 14; break;
  74. case 'f' :
  75. case 'F' : digit = 15; break;
  76. default : exit(-3);
  77. }
  78. toReturn += digit * long_pow(base, strlen(input)-(power+1));
  79. }
  80. if(neg) toReturn *= -1;
  81.  
  82. return toReturn;
  83. }
  84.  
  85. //compare a known encrypted message with a potential encrypted message
  86. //given a key and a unencrypted message
  87. //NOTE: Possibly wrong
  88. bool singleDESTest(char *_key, const char* in,
  89. const char* outTest){
  90.  
  91. int cryptStatus = 0;
  92. unsigned char* result = NULL;
  93. bool toReturn = false;
  94. DES_key_schedule schedule;
  95. DES_cblock key;
  96. u64 message, knownCipher;
  97.  
  98. message = local_atoll(in, HEX);
  99. knownCipher = local_atoll(outTest, HEX);
  100.  
  101.  
  102. result = (unsigned char*) malloc(MESSAGE_SIZE);
  103. memcpy(key, _key, 8);
  104.  
  105. DES_set_odd_parity((DES_cblock*)&key);
  106. DES_set_key_checked((DES_cblock*)&key, &schedule);
  107.  
  108. DES_cfb64_encrypt( (unsigned char*)message, result, MESSAGE_SIZE,
  109. &schedule, (DES_cblock*)&key, &cryptStatus, DES_ENCRYPT);
  110.  
  111. toReturn = !memcmp(result, outTest, 8);
  112. free(result);
  113.  
  114. return toReturn;
  115. }
  116.  
  117. /**
  118. * INPUT: [start hash] [end hash] [plain text] [cipher text]
  119. *
  120. * OUTPUT: ["Found one!" | NULL]
  121. *
  122. * NOTE: ALL io is done in hex, plaintext and ciphertext MUST be 16
  123. * charcters long
  124. */
  125. int main(int argc, char** argv){
  126.  
  127. u64 testHash = local_atoll(argv[0], HEX);
  128. char testKey[8];
  129.  
  130. while(testHash <= local_atoll(argv[1], HEX)){
  131.  
  132. memcpy(&testKey, &testHash, 8);
  133.  
  134. if(singleDESTest(testKey, argv[3], argv[4]))
  135. cout << "Found one!" << endl;
  136. testHash++;
  137. }
  138.  
  139. return 0;
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement