Advertisement
Guest User

MD2II Hash function for creating encryption keys (gcc)

a guest
Apr 18th, 2024
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 12.81 KB | Source Code | 0 0
  1. /* MD2-II Hash Function */
  2. /* by Alexander PUKALL 2005 */
  3. /* Code free for all, even for commercial software */
  4. /* No restriction to use. Public Domain */
  5.  
  6. /* Hash a user password in a 528-byte key (4224 bits) */
  7. /* For BLOWFISH II */
  8. /* compile with gcc : gcc md2II.c -o md2II */
  9.  
  10. /* Based on MD2 by Ronald Rivest 1989 */
  11.  
  12. /* Users never use passwords long enough and random enough. */
  13. /* This function takes a user password as input and provides */
  14. /* a 528-byte key as output. This 528-byte key is then passed to Blowfish II. */
  15.  
  16. /* MD2-II can be used to hash passwords for Blowfish by simply */
  17. /* change #define n1 528 to */
  18. /* #define n1 72 for Blowfish 576 bits or */
  19. /* #define n1 56 for Blowfish 448 bits */
  20.  
  21. /* MD2-II can be used with other algorithms like */
  22. /* #define n1 16 for AES-128 (128 bits) */
  23. /* #define n1 16 for IDEA (128 bits). It avoids IDEA weak keys */
  24. /* #define n1 21 for 3DES (168 bits). */
  25. /* #define n1 24 for AES-192 (192 bits) */
  26. /* #define n1 32 for AES-256 (256 bits) */
  27.  
  28. /* MD2-II can be used to create a session key from a user password */
  29. /* and initialization vector. */
  30.  
  31. /* MD2-II is not intended for general use like MD5 or SHA1. */
  32. /* It is only for hashing passwords. */
  33. /* For this purpose, it is completely secure since */
  34. /* the hash is never accessible to an attacker. */
  35. /* So pre-image or collision attacks don't work. */
  36.  
  37.  
  38. #include <stdio.h>
  39. #include <string.h>
  40.  
  41. #define n1 528
  42.  
  43.  
  44. int x1,x2,i;
  45. unsigned char h2[n1];
  46. unsigned char h1[n1*3];
  47.  
  48.  
  49. static void init()
  50. {
  51.    
  52.    x1 = 0;
  53.    x2 = 0;
  54.     for (i = 0; i < n1; i++)
  55.         h2[i] = 0;
  56.     for (i = 0; i < n1; i++)
  57.         h1[i] = 0;
  58. }
  59.  
  60. static void hashing(unsigned char t1[], size_t b6)
  61. {
  62.     static unsigned char s4[256] =
  63.     {   13, 199,  11,  67, 237, 193, 164,  77, 115, 184, 141, 222,  73,
  64.         38, 147,  36, 150,  87,  21, 104,  12,  61, 156, 101, 111, 145,
  65.        119,  22, 207,  35, 198,  37, 171, 167,  80,  30, 219,  28, 213,
  66.        121,  86,  29, 214, 242,   6,   4,  89, 162, 110, 175,  19, 157,
  67.          3,  88, 234,  94, 144, 118, 159, 239, 100,  17, 182, 173, 238,
  68.         68,  16,  79, 132,  54, 163,  52,   9,  58,  57,  55, 229, 192,
  69.        170, 226,  56, 231, 187, 158,  70, 224, 233, 245,  26,  47,  32,
  70.         44, 247,   8, 251,  20, 197, 185, 109, 153, 204, 218,  93, 178,
  71.        212, 137,  84, 174,  24, 120, 130, 149,  72, 180, 181, 208, 255,
  72.        189, 152,  18, 143, 176,  60, 249,  27, 227, 128, 139, 243, 253,
  73.         59, 123, 172, 108, 211,  96, 138,  10, 215,  42, 225,  40,  81,
  74.         65,  90,  25,  98, 126, 154,  64, 124, 116, 122,   5,   1, 168,
  75.         83, 190, 131, 191, 244, 240, 235, 177, 155, 228, 125,  66,  43,
  76.        201, 248, 220, 129, 188, 230,  62,  75,  71,  78,  34,  31, 216,
  77.        254, 136,  91, 114, 106,  46, 217, 196,  92, 151, 209, 133,  51,
  78.        236,  33, 252, 127, 179,  69,   7, 183, 105, 146,  97,  39,  15,
  79.        205, 112, 200, 166, 223,  45,  48, 246, 186,  41, 148, 140, 107,
  80.         76,  85,  95, 194, 142,  50,  49, 134,  23, 135, 169, 221, 210,
  81.        203,  63, 165,  82, 161, 202,  53,  14, 206, 232, 103, 102, 195,
  82.        117, 250,  99,   0,  74, 160, 241,   2, 113};
  83.        
  84.     int b1,b2,b3,b4,b5;
  85.    
  86.     b4=0;
  87.     while (b6) {
  88.    
  89.         for (; b6 && x2 < n1; b6--, x2++) {
  90.             b5 = t1[b4++];
  91.             h1[x2 + n1] = b5;
  92.             h1[x2 + (n1*2)] = b5 ^ h1[x2];
  93.  
  94.             x1 = h2[x2] ^= s4[b5 ^ x1];
  95.         }
  96.  
  97.         if (x2 == n1)
  98.         {
  99.             b2 = 0;
  100.             x2 = 0;
  101.            
  102.             for (b3 = 0; b3 < (n1+2); b3++) {
  103.                 for (b1 = 0; b1 < (n1*3); b1++)
  104.                     b2 = h1[b1] ^= s4[b2];
  105.                 b2 = (b2 + b3) % 256;
  106.             }
  107.            }
  108.           }
  109.         }
  110.  
  111. static void end(unsigned char h4[n1])
  112. {
  113.    
  114.     unsigned char h3[n1];
  115.     int i, n4;
  116.    
  117.     n4 = n1 - x2;
  118.     for (i = 0; i < n4; i++) h3[i] = n4;
  119.     hashing(h3, n4);
  120.     hashing(h2, sizeof(h2));
  121.     for (i = 0; i < n1; i++) h4[i] = h1[i];
  122. }
  123.  
  124.  
  125.  
  126. int main()
  127. {
  128.    
  129.     unsigned char h4[n1];
  130.     int i,w;
  131.  
  132.      
  133. /* Example hashing password 16 'A' */
  134. /* Note : hashing(data,len of data) */
  135.      
  136.      unsigned char data[1]={0x41};
  137.      unsigned char text[19]; /* strcpy = null terminated string */
  138.      
  139.      init();
  140.  
  141.      for (i=0;i<16;i++)
  142.      {
  143.       hashing(data, 1);
  144.      }
  145.      
  146.      end(h4);
  147.  
  148.      printf("Md2-II Hash 528 bytes 'AAAAAAAAAAAAAAAA' Tab test:\n\n");
  149.      
  150.      w=1;
  151.      
  152.      for (i=0;i<n1;i++)
  153.      {
  154.       printf("%0.2X ",h4[i]);
  155.       if (w==20) {w=0;printf("\n");}
  156.       w++;
  157.      }
  158.      
  159. /* Is the same as hashing 'AAAAAAAAAAAAAAAA' */
  160.  
  161. printf("\n\n\n");
  162.  
  163.     init();
  164.  
  165.     strcpy((char *) text,"AAAAAAAAAAAAAAAA");
  166.  
  167.     hashing(text, 16);
  168.     end(h4);
  169.  
  170.     printf("Md2-II Hash 528 bytes 'AAAAAAAAAAAAAAAA' String test:\n\n");
  171.    
  172.      w=1;
  173.      
  174.      for (i=0;i<n1;i++)
  175.      {
  176.       printf("%0.2X ",h4[i]);
  177.       if (w==20) {w=0;printf("\n");}
  178.       w++;
  179.      }
  180.      
  181.     printf("\n\n\n");
  182.  
  183. /* Hashing 'Hello World !' */
  184.  
  185.     init();
  186.  
  187.     strcpy((char *) text,"Hello World !");
  188.  
  189.     hashing(text, 13);
  190.     end(h4);
  191.  
  192.  
  193.     printf("Md2-II Hash 528 bytes 'Hello World !':\n\n");
  194.    
  195.     w=1;
  196.      
  197.      for (i=0;i<n1;i++)
  198.      {
  199.       printf("%0.2X ",h4[i]);
  200.       if (w==20) {w=0;printf("\n");}
  201.       w++;
  202.      }
  203.      
  204.    printf("\n\n\n");
  205.  
  206. /* Hashing 'My secret password' */
  207.  
  208.     init();
  209.  
  210.     strcpy((char *) text,"My secret password");
  211.  
  212.     hashing(text, 18);
  213.     end(h4);
  214.  
  215.  
  216.     printf("Md2-II Hash 528 bytes 'My secret password':\n\n");
  217.    
  218.     w=1;
  219.      
  220.      for (i=0;i<n1;i++)
  221.      {
  222.       printf("%0.2X ",h4[i]);
  223.       if (w==20) {w=0;printf("\n");}
  224.       w++;
  225.      }
  226.      
  227.     printf("\n\n\n");
  228.  
  229.     return(0);
  230. }
  231.  
  232. /*
  233. Md2-II Hash 528 bytes 'AAAAAAAAAAAAAAAA' Tab test:
  234.  
  235. 14 DF 58 58 7D 6E 4E B3 A1 D9 BD 82 F7 BF 66 0A CA 9F E9 E8
  236. 1F EF A5 7A 51 0B 55 55 44 34 6E FB 37 DA 7A 4C 10 0F BF 4A
  237. B2 AD 35 54 CF 2F 16 78 9C BC 0C 41 99 6B 15 18 96 D6 93 DF
  238. 6E EC 58 D0 77 93 CB DE 60 FD CB C8 52 12 D3 95 B1 3B C9 EF
  239. 9F 85 A3 BE B8 E1 45 6D 84 F8 FD FB 42 B8 A0 75 91 58 A7 AC
  240. B4 1E 8D 08 0C CC D9 9B 45 4E BF 67 B5 D6 86 EF F8 29 58 1B
  241. 3C CD 66 3E 97 A7 C8 FD AD 00 54 72 AC 02 6D 34 D2 99 70 E2
  242. B4 C4 01 3C 28 E0 BC 2C 8C 3B 2D 0B FF A2 2B D2 CC 9F F7 89
  243. 7C 1E EF C2 84 69 05 FE 45 58 4B C2 AE 97 15 E3 4E 45 C4 AA
  244. 94 52 22 67 B5 7C 21 E1 AC 34 13 F1 BB 32 4A 65 8E E0 C3 90
  245. 56 DD B1 87 5F 43 57 AE 8E 28 6F D9 39 1B 09 A2 67 82 4A 22
  246. B1 8B 16 97 DC 40 9C 20 8B 0D 79 6F D5 0B B4 16 28 95 BA A1
  247. 04 C1 E9 11 53 41 58 3E F7 13 90 17 1C AF 71 D6 7F 8E B4 F0
  248. 12 99 6E 09 30 3D BB A5 A3 52 EF F6 1E 76 7F 92 C2 A5 DE AF
  249. D3 A0 2B 53 16 78 6A 76 DE B0 45 B8 D5 BA 89 14 A2 65 4E E9
  250. BC D2 E9 6D CB BE C7 F2 12 A5 95 86 30 67 D6 4A 54 2E 17 6D
  251. 0A A2 4F 6D AA DC 08 A2 05 67 69 73 1A D4 45 DC 03 12 25 50
  252. D6 3B 5D C3 32 0B 25 9D 33 48 63 16 1F D4 B6 D6 00 76 0E B1
  253. C4 9E E4 BD 0E 39 8A F7 F2 C7 65 6B F1 7A 3B BC 6C 0A 80 FC
  254. C0 68 CB C2 82 60 74 00 E7 72 48 56 9A 91 5F 8D 16 26 43 76
  255. B9 39 D8 0B FD D5 A4 F2 84 51 B8 BD B4 43 2E E4 72 28 56 AE
  256. E1 61 93 92 60 2B AF 10 EF A9 AD 9C 81 48 1F D5 30 7F 22 4F
  257. 1D B9 F5 B4 B8 5D 75 76 5F 96 BF 7A 58 90 07 02 75 50 38 F1
  258. 98 9C C2 31 BE 20 39 DE A4 AB BE 4C F2 2F BE B2 4A 5A 9A D7
  259. 4C C3 8A 62 77 E7 96 C8 11 B9 85 1D 51 A5 39 13 9C D6 1E 49
  260. 0B 0E 24 91 0B 2D 19 CE C3 B0 E8 7F DE B6 F7 25 91 E8 30 2B
  261. 9A AE 0F C5 E5 5A 77 78
  262.  
  263.  
  264. Md2-II Hash 528 bytes 'AAAAAAAAAAAAAAAA' String test:
  265.  
  266. 14 DF 58 58 7D 6E 4E B3 A1 D9 BD 82 F7 BF 66 0A CA 9F E9 E8
  267. 1F EF A5 7A 51 0B 55 55 44 34 6E FB 37 DA 7A 4C 10 0F BF 4A
  268. B2 AD 35 54 CF 2F 16 78 9C BC 0C 41 99 6B 15 18 96 D6 93 DF
  269. 6E EC 58 D0 77 93 CB DE 60 FD CB C8 52 12 D3 95 B1 3B C9 EF
  270. 9F 85 A3 BE B8 E1 45 6D 84 F8 FD FB 42 B8 A0 75 91 58 A7 AC
  271. B4 1E 8D 08 0C CC D9 9B 45 4E BF 67 B5 D6 86 EF F8 29 58 1B
  272. 3C CD 66 3E 97 A7 C8 FD AD 00 54 72 AC 02 6D 34 D2 99 70 E2
  273. B4 C4 01 3C 28 E0 BC 2C 8C 3B 2D 0B FF A2 2B D2 CC 9F F7 89
  274. 7C 1E EF C2 84 69 05 FE 45 58 4B C2 AE 97 15 E3 4E 45 C4 AA
  275. 94 52 22 67 B5 7C 21 E1 AC 34 13 F1 BB 32 4A 65 8E E0 C3 90
  276. 56 DD B1 87 5F 43 57 AE 8E 28 6F D9 39 1B 09 A2 67 82 4A 22
  277. B1 8B 16 97 DC 40 9C 20 8B 0D 79 6F D5 0B B4 16 28 95 BA A1
  278. 04 C1 E9 11 53 41 58 3E F7 13 90 17 1C AF 71 D6 7F 8E B4 F0
  279. 12 99 6E 09 30 3D BB A5 A3 52 EF F6 1E 76 7F 92 C2 A5 DE AF
  280. D3 A0 2B 53 16 78 6A 76 DE B0 45 B8 D5 BA 89 14 A2 65 4E E9
  281. BC D2 E9 6D CB BE C7 F2 12 A5 95 86 30 67 D6 4A 54 2E 17 6D
  282. 0A A2 4F 6D AA DC 08 A2 05 67 69 73 1A D4 45 DC 03 12 25 50
  283. D6 3B 5D C3 32 0B 25 9D 33 48 63 16 1F D4 B6 D6 00 76 0E B1
  284. C4 9E E4 BD 0E 39 8A F7 F2 C7 65 6B F1 7A 3B BC 6C 0A 80 FC
  285. C0 68 CB C2 82 60 74 00 E7 72 48 56 9A 91 5F 8D 16 26 43 76
  286. B9 39 D8 0B FD D5 A4 F2 84 51 B8 BD B4 43 2E E4 72 28 56 AE
  287. E1 61 93 92 60 2B AF 10 EF A9 AD 9C 81 48 1F D5 30 7F 22 4F
  288. 1D B9 F5 B4 B8 5D 75 76 5F 96 BF 7A 58 90 07 02 75 50 38 F1
  289. 98 9C C2 31 BE 20 39 DE A4 AB BE 4C F2 2F BE B2 4A 5A 9A D7
  290. 4C C3 8A 62 77 E7 96 C8 11 B9 85 1D 51 A5 39 13 9C D6 1E 49
  291. 0B 0E 24 91 0B 2D 19 CE C3 B0 E8 7F DE B6 F7 25 91 E8 30 2B
  292. 9A AE 0F C5 E5 5A 77 78
  293.  
  294.  
  295. Md2-II Hash 528 bytes 'Hello World !':
  296.  
  297. 31 A9 D0 03 3C 6B 4A 0A 4F 3D C9 71 0B 30 C5 06 02 EE CE AE
  298. 6A FD 5A 3B 40 7B 80 E1 BA 44 2E 6A 6A 18 D3 40 02 71 8C 01
  299. D3 61 29 E1 F5 33 BF 30 07 6F BD 79 BC 97 A2 86 A4 49 F8 A7
  300. 1A A7 BD 21 47 0F 1D 5C 1C 59 FA 3D 68 EC 36 63 6E A2 2D 02
  301. 01 5F BF E1 90 DC A4 DD B5 92 8A 2A 3A FD DC 6E D3 4A 87 1F
  302. 83 DD BB 7D 06 66 0E 29 94 A2 4F 4A D8 71 69 FD 42 FC D0 08
  303. 0B B2 29 D5 B3 0D 71 91 03 E8 40 C1 24 57 7A 12 3D 20 05 63
  304. 58 C0 57 23 90 83 FD 6F 6E 6C 43 54 9E 29 67 9B BC 68 50 BD
  305. F3 70 01 D2 18 CB B2 F4 34 BC 12 87 18 F7 26 2A 90 8E 25 28
  306. BA 2E AA 7E BE 35 C9 18 60 33 4B A2 A4 E3 78 68 90 2D 5F 56
  307. 48 57 9E 72 A7 53 D9 A5 A8 A1 15 3E 39 15 B9 9A 42 B4 87 1C
  308. 36 7D F5 21 4E 12 71 9F 61 32 27 3C 24 2B AE CE 71 81 34 87
  309. C6 25 67 F4 9B 77 B2 CC D4 5F 64 33 33 FE 7D 8D 2A E9 8A E3
  310. 4E D5 D0 4C 68 D3 DF 81 0C 47 8F F2 46 B6 CB DB 09 58 DD 66
  311. 6D 77 47 A4 CD 75 4B CC 61 F2 98 89 4B 16 86 CB 2A 9D 89 7B
  312. D2 7C 33 FC 37 82 51 3E 0E C8 82 01 66 F6 8F A3 0E 8C 46 FD
  313. 07 80 0C FB 62 60 08 72 8A DC 82 DE 48 F1 44 A8 7D 40 85 EE
  314. FE 33 03 96 6F 28 F6 7D 12 6A 77 08 44 26 0F DD D2 68 17 E1
  315. 08 B8 2A 50 2F A5 72 27 22 33 5D 99 AF A5 9D FD D1 7A 57 29
  316. 11 B2 91 85 07 4D B6 8F B3 B1 0A 13 5A 33 F2 21 D3 91 BE E0
  317. E9 8B 8F 8F F3 EF 2E 5F A6 0A D6 FB D6 83 DC 14 92 D0 9B A6
  318. 81 9A 06 54 8A FC 08 22 F6 50 40 03 74 E1 3D AD DC DF 49 57
  319. 3E 2A C2 86 87 13 8C D8 9D 50 63 90 C1 AF EA D3 02 E9 B1 0E
  320. 03 E2 C6 EF 9D 25 C0 35 DE 93 41 E9 BC C9 BD 01 2B 4C 75 8D
  321. BD AC C0 F5 0D C7 5B 91 E5 E4 38 46 46 5F D7 8E B0 9F 69 02
  322. 05 37 B0 07 63 74 FD 20 7B 66 D2 99 6D B9 CC 2E 29 C2 04 77
  323. F2 F2 32 BE E9 D0 16 EB
  324.  
  325.  
  326. Md2-II Hash 528 bytes 'My secret password':
  327.  
  328. E0 20 C7 15 07 A2 31 E0 0B 0C 26 DF 59 6F 7F 79 D0 EE C8 3A
  329. 61 80 C3 B1 FC 21 07 49 E1 16 48 5A A0 7E 4A 73 D5 15 87 8E
  330. 27 F4 93 70 1C BF F2 9C 18 FA 61 84 47 A0 96 62 9F DA BC 25
  331. EF BD 4D 65 DB 4F 93 5A 5E 57 53 B7 33 A9 BE 2B 83 26 DD DD
  332. 4E 06 6D BA 6E 90 3E E0 5A DA 8D 9B 83 04 14 87 2B 7E 3D 70
  333. 70 49 8D 2D 90 AD 3C 56 4D CF 32 56 94 F5 1A 2C FF FD 79 E1
  334. 70 69 49 E1 33 FB 81 82 2E 42 9C 97 63 BA 33 BF 82 08 AE E3
  335. 8B 7D 78 82 C5 57 6A 8E 18 E0 29 37 D8 BC 34 82 F2 1E 4F B0
  336. CE AF 34 10 02 2B 18 1B D0 D5 97 D2 77 7D D4 85 E6 35 2D EB
  337. 52 CC 33 18 26 13 DF 8F DB E2 32 77 2D 92 83 2E F4 ED 60 D8
  338. 60 56 9F E2 EB AE 9E 71 DB 30 6E 3D 74 BA 74 8C F8 47 AD 55
  339. 14 B1 09 78 70 62 B9 25 C7 68 51 63 BE 6A 66 78 2F 8C 39 DB
  340. D5 D3 93 EE 22 7C 92 A2 6C 6D 73 7A BB AE 07 7B DC 1C FD C4
  341. 9F 95 45 95 2D AC A7 BF B9 2E 0C 1A 04 49 71 2B 29 07 EB D8
  342. 8B 39 E5 63 2C 71 E8 5B 52 8A AA A8 03 D8 44 43 76 79 BB 6B
  343. 2D D4 8E DC CE 58 0E 45 03 73 C9 5B 5C 15 B6 38 1E 24 92 52
  344. C6 1B 3A 5E 48 E7 31 0D C2 2B B7 21 B8 F7 A2 FF 20 C4 8A DD
  345. 85 34 C0 E6 BD B0 A1 AE 98 C1 9C C0 3E 39 0A 90 25 88 E0 44
  346. C9 FD 25 C6 5F 42 0A 91 D6 21 CF 39 BA E2 0A 45 12 B8 7E A7
  347. 1C 63 AB 7B B7 22 D1 29 D4 8B 6C 3F B3 BD 04 8A 9A 39 31 7B
  348. 62 BD 4D FE 48 7D F2 0B 04 2D F8 AC D2 DD 61 85 D7 33 48 57
  349. E2 34 C8 EF 68 6A 8D B8 BC 3A B2 D1 81 C0 A8 A0 C4 81 97 BC
  350. B2 1C 2C 9F 88 F6 29 07 11 0E CD BE 3A AC 87 6E 99 0C 97 A5
  351. A7 0A 35 26 A9 86 5D E7 2B 48 24 72 70 CF 79 C6 06 74 44 44
  352. D9 D3 CB 72 F9 0B 0E 09 40 A0 CF CA 1E F8 EB 96 C4 10 BF A4
  353. 82 A4 F9 52 C2 5A EF 8F F6 58 7E 93 12 A9 5C 03 8D BF ED 31
  354. 48 40 76 88 3F 8A 9F 5D
  355.  
  356. Md2-II Hash 72 bytes 'My secret password':
  357.  
  358. 53 08 72 31 BF 47 2B 6F 64 95 10 6A E6 EF 47 BF 7F 4A B3 70
  359. 32 7F 38 EE 12 26 C1 96 E4 47 13 02 06 06 C2 C6 8D 6A E6 44
  360. D3 97 7C 1E 6C 8E 9C 20 E6 E9 A9 12 4F BE 36 22 FE 65 20 D3
  361. 64 92 80 95 5C 1C BC 45 08 9B 97 D7
  362.  
  363. Md2-II Hash 56 bytes 'My secret password':
  364.  
  365. F6 23 87 44 D1 99 7E C4 92 87 BD C3 E3 5C 28 A4 E3 7A 98 D9
  366. 77 78 96 C6 E3 96 3D 9A A2 8D AB 34 79 0C BF E1 D2 D3 88 37
  367. 67 B2 A2 5A 68 21 B3 B6 21 77 E6 A3 90 0E E4 FD
  368.  
  369.  
  370. */
  371.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement