Click here to Skip to main content
15,887,376 members
Please Sign up or sign in to vote.
1.50/5 (2 votes)
See more:
Sir, I need some help in implementing MD5(Message Digest 5) algorithm in my project.
I have referred the pseudo code in the Wikipedia article https://en.wikipedia.org/wiki/MD5[^]
and implemented this code
C++
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_WARNINGS 
using namespace std;

/*              **********source - wikipedia**************
                Note: All variables are unsigned 32 bit and wrap modulo 2^32 when calculating
*/

class md5
{
public:
	void messageDigest() 
{
		 unsigned long int s[64] = { 7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21 };
		 unsigned long int k[64] = { 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 };
		 unsigned long int a0, b0, c0, d0;
		 a0 = 0x67452301;
		 b0= 0xefcdab89;
		 c0= 0x98badcfe;
		 d0= 0x10325476;
//here is the problem 1 which I face
		 unsigned long int F, G, H, I;
		 unsigned long int A, B, C, D;
		 A = a0;
		 B = b0;
		 C = c0;
		 D = d0;
		 int i = 0;
		 int g;
		 if(0<=i<=15)
		 {
			//F := (B and C) or ((not B) and D)
			 F = (B&&C) || ((!C) && D);
			 g = i;
		 }
		 else if (16 <= i <= 31)
		 {
			 //F := (D and B) or ((not D) and C)
			 F = (D&&B) || ((!D) && C);
			 g = (5 * i + 1) % 16;
		 }
		 else if (32 <= i <= 47)
		 {
			 //F := B xor C xor D
			 F = B^C^D;
			 g = (3 * i + 5) % 16;
		 }
		 else if (48 <= i <= 63)
		 {
			 // F := C xor (B or (not D))
			 F = C ^ (B || (!D));
			 g = (7 * i) % 16;
		 }
		 //I suspect "dTemp"(seen in the pseudocode of wikipedia) is a temporary variable.To my knowledge there is no keyword called"dTemp" or"temp"
		 int temp;//used instead of dTemp
		 temp = D;
		 D = C;
		 C = B;
		 A = temp;
		 a0 = a0 + A;
		 b0 = b0 + B;
		 c0 = c0 + C;


I specifically face problem here in the pseudo code of the Wikipedia article:
C++
//Pre-processing: adding a single 1 bit
append "1" bit to message    
/* Notice: the input bytes are considered as bits strings,
  where the first bit is the most significant bit of the byte.[48]
  

//Pre-processing: padding with zeros
append "0" bit until message length in bits ≡ 448 (mod 512)
append original length in bits mod (2 pow 64) to message


//Process the message in successive 512-bit chunks:
for each 512-bit chunk of message
    break chunk into sixteen 32-bit words M[j], 0 ≤ j ≤ 15


and here
C++
end for

var char digest[16] := a0 append b0 append c0 append d0 //(Output is in little-endian)

//leftrotate function definition
leftrotate (x, c)
    return (x << c) binary or (x >> (32-c));
other parts of codes,I think I have done it correctly.
Kindly help me with this.
Posted
Updated 8-Dec-15 8:08am
v3
Comments
Afzaal Ahmad Zeeshan 8-Dec-15 10:20am    
Why not ask "others", why do they claim it to be correct? :-)
Sergey Alexandrovich Kryukov 8-Dec-15 10:43am    
:-)
[no name] 8-Dec-15 11:16am    
To Sir Sergey Alexandrovich Kryukov
Sir,have I not explained my program well kindly inform me so that I can improve my question.Thank you.
[no name] 8-Dec-15 11:18am    
To Sir Afzaal Ahmad Zeeshan
Sir kindly excuse my English.I did not mean others as someone. I mean others as other part of my codes. Thank you.
Afzaal Ahmad Zeeshan 8-Dec-15 12:22pm    
English is not a problem, English is not everyone's native language.

Anyways, please read my solution below. I would still recommend not using MD5 in your application. Use SHA-2 based algorithm sets as they are more secure.

1 solution

Actually, you have not shown the implementation of this class. The following two snippets are just the "pseudo-code" for the algorithm. What do you think, did you implement it? Does the code work well?

From the code, it is clear that i is zero, so only the first block would execute and a few other things too. I would recommend that you try it out yourself and then check if it works. There are many online tools provided to test the MD5 encryption result, test it with yours and see if that works.

Recommendation: MD5 is a very old encryption method, use SHA256 or SHA512 instead. They are more secure and are better.

However, you can also get the algorithms implemented safely in C++ too. Consider having a look at the following encryption methods, https://www.cryptopp.com/[^]. Even on this website you will find the following text,
Quote:
insecure or obsolescent algorithms retained for backwards compatibility and historical value
Thus, consider ignoring MD5 and shift over to SHA256 (or SHA512, even better, but requires a big size). Read more about SHA-2 family here, https://en.wikipedia.org/wiki/SHA-2[^]
 
Share this answer
 
Comments
[no name] 8-Dec-15 13:14pm    
Sir, It is copyrighted and licensed under Boost software so I cannot use it.The first snippet is what I have done and the latter two snippets are the ones which I have confusion.

But SHA-512 is a good suggestion.I'll better try that.Thank you for your kind help sir.
Afzaal Ahmad Zeeshan 8-Dec-15 13:33pm    
License says, "Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software
". I think, you can use it. :-)

Anyways, you can use SHA-256, which is much better algorithm.
[no name] 8-Dec-15 14:15pm    
Thank you sir for your kind help.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900