欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于MD5消息摘要算法加密校验及相关问题

程序员文章站 2022-05-12 20:31:57
...

MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。

目前接触到MD5主要是涉及到网络数据传输的安全性(检测数据是否被篡改),关于传递的数据有如下想法:

将原数据通过MD5生成校验码,

将原数据加密,

将校验码与加密后的数据传送给目标,

目标接收后,取出校验码,将加密的数据通过秘钥解密,

将解密后的数据通过MD5生成校验码,

比较两次校验码是否一致以此判断数据是否被篡改。

下面演示一下MD5生成校验码

#include "E:\\截图、文档、工具\\文档\\MD5\\MD5.h"
#include "E:\\截图、文档、工具\\文档\\MD5\\MD5.cpp"

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{

	MD5_CTX md5;
	MD5Init(&md5);                          //初始化用于md5加密的结构


	unsigned char decrypt[16];       //存放加密后的结果

	unsigned char encrypt[200]="Baidu";     //存放于加密的信息
	MD5Update(&md5,encrypt,strlen((char *)encrypt));   //对欲加密的字符进行加密
	MD5Final(decrypt,&md5);                            //获得最终结果

	printf("加密前:%s\n加密后:",encrypt);
	for(int i=0;i<16;i++)
		printf("%x ",decrypt[i]);

	printf("\n");

	MD5Init(&md5);                        //每次使用前必须初始化md5
	unsigned char encrypt1[200]="Baidu";
	/*printf("请输入待加密的字符串\n");
	gets((char *)encrypt1);*/
	MD5Update(&md5,encrypt1,strlen((char *)encrypt1));   //对欲加密的字符进行加密
	MD5Final(decrypt,&md5);                            //获得最终结果
	printf("加密前:%s\n加密后:",encrypt1);
	for(int i=0;i<16;i++)
		printf("%x ",decrypt[i]);

	printf("\n");

	MD5Init(&md5);
	unsigned char encrypt2[200]={0};
	printf("请输入待加密的字符串\n");
	gets((char *)encrypt2);
	MD5Update(&md5,encrypt2,strlen((char *)encrypt2));   //对欲加密的字符进行加密
	MD5Final(decrypt,&md5);                            //获得最终结果

	for(int i=0;i<16;i++)
		printf("%x ",decrypt[i]);

	printf("\n");
	return 0;
}

这时运行结果

关于MD5消息摘要算法加密校验及相关问题

通过代码会发现对"Baidu"这个字符串的三次操作都生成的是同样的校验码.这说明MD5确实是值得信赖的!下面附带MD5下载链接

这是MD5下载链接

注意:

    MD5_CTX md5;
    MD5Init(&md5);                          //初始化用于md5加密的结构
    MD5Update(&md5,encrypt,strlen((char *)encrypt));   //对欲加密的字符进行加密
    MD5Final(decrypt,&md5);                            //获得最终结果

这三步一定要成组合出现,若是哪次生成校验码的过程中少了任意一步,都会导致错误(尤其MD5Init(&md5);这句是将md5初始化,如果不初始化,生成的校验码将会不同!!!)

相关标签: MD5