需要帮助在我的程序中实现MD5 [英] Need help in implementing MD5 in my program

查看:82
本文介绍了需要帮助在我的程序中实现MD5的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

先生,我在项目中实施MD5(消息摘要5)算法需要一些帮助。

我在维基百科文章中引用了伪代码 https://en.wikipedia.org/wiki/MD5 [ ^ ]

并实现此代码

  #define _CRT_SECURE_NO_DEPRECATE 
#define _CRT_SECURE_NO_WARNINGS
使用 命名空间标准;

/ * ********** source - wikipedia *** ***********
注意:所有变量都是无符号32位,并且在计算
* /


时包裹模2 ^ 32 < span class =code-keyword> 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;
// 这是我面临的问题1
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和C)或((不是B)和D)
F =(B&& C)|| ((!C)&& D);
g = i;
}
其他 如果 16 < = i< = 31
{
// F:=(D和B)或((不是D)和C)
F =(D&& B)|| ((!D)&& C);
g =( 5 * i + 1 )% 16 ;
}
其他 如果 32 < = i< = 47
{
// F:= B xor C xor D
F = B ^ C ^ D;
g =( 3 * i + 5 )% 16 ;
}
其他 如果 48 < = i< = 63
{
// F:= C xor(B或(非D))
F = C ^(B ||(!D));
g =( 7 * i)% 16 ;
}
// 我怀疑dTemp(在维基百科的伪代码中看到)是一个临时变量。据我所知,没有名为dTemp或temp的关键字
int temp; // 而不是dTemp
temp = D;
D = C;
C = B;
A = temp;
a0 = a0 + A;
b0 = b0 + B;
c0 = c0 + C;





我在维基百科文章的伪代码中特别面临问题:

  //  预处理:添加单个1位 
追加 1位消息
/ * 注意:输入字节被视为位字符串,
其中第一位是字节的最高位。[ 48]


//预处理:用零填充
追加0位,直到消息长度为位≡448(mod 512)
以位为单位追加原始长度mod(2 pow 64)消息


//以连续的512位块处理消息:每个512位消息块

break chunk分为16个32位字M [j],0≤j≤15





和这里

 end  for  

var char 摘要[ 16 ]:= a0追加b0追加c0追加d0 // (输出在little-endian)

// leftrotate函数定义
leftrotate(x,c)
return (x<< c)binary (x>>( 32 -c));

o代码的一部分,我想我已经正确完成了。

请帮助我。

解决方案

实际上,你还没有显示这个类的实现。以下两个片段只是算法的伪代码。您怎么看?是否实施了它?代码是否运作良好?



从代码中可以清楚地看到 i 为零,所以只有第一个块会执行而且其他一些事情也很少。我建议你自己尝试一下,然后检查它是否有效。提供了许多在线工具来测试MD5加密结果,与您一起测试并查看是否有效。



建议:MD5是一种非常古老的加密方法,请改用SHA256或SHA512。它们更安全,更好。



但是,您也可以在C ++中安全地实现算法。请考虑查看以下加密方法, https://www.cryptopp.com/ [ ^ ]。即使在这个网站上你会发现以下文字,

引用:

保留了不安全或过时的算法以实现向后兼容性历史值因此,考虑忽略MD5并切换到SHA256(或SHA512,甚至更好,但需要大尺寸)。在此处阅读有关SHA-2系列的更多信息, https://en.wikipedia.org/wiki/SHA-2 [ ^ ]


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

#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:

//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

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.

解决方案

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[^]


这篇关于需要帮助在我的程序中实现MD5的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆