Guest User

MD2II Hash function for creating encryption keys (Visual C++ 6.0)

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