⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ffff.cpp

📁 该实例演示了 MD5的 加密,解密全过程,代码精简,有实用价值
💻 CPP
字号:
#include<iostream.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#include"md5.h"
#include"G__md5.h"

//将字符转换成16进制输出
void convert(int m,unsigned char string[]);
//雪崩效应中的统计函数
int snowslips(unsigned char string1[],unsigned char string2[]);
//计算MD5值
void md5_calculate(void);
//雪崩效应检验
void snowslip();


void main()
{
	 char choose;
     cout<<"选择H,计算HASH值;选择S,雪崩效应的检验:"<<endl;
     cin>>choose;
     if(choose=='H')
        md5_calculate();
      else
         if(choose=='S')
           snowslip();
}



void convert(int m,unsigned char string[])
{
	int lenth=m;
	int mid;
	char ch;
	char str[30][2];
	for(int i=0;i<lenth;i++)
	{
		mid=string[i]/16;
		if(mid>=10)
			ch=mid-10+'A';
		else
			ch=mid+'0';
		str[i][0]=ch;
		mid=string[i]%16;
		if(mid>=10)
			ch=mid-10+'A';
		else
			ch=mid+'0';
		str[i][1]=ch;
	}
	for(i=0;i<lenth;i++)
		cout<<str[i][0]<<str[i][1];
}


int snowslips(unsigned char string1[],unsigned char string2[])
{
    int count=0;
	int num[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};
    unsigned int mid;
    int i,j;
	for(i=0;i<16;i++)
	{
	   mid=string1[i]^string2[i];
	  
	   for(j=0;j<8;j++)
	   {
	      if(mid&num[j])
			  count++;
		}
	}
	return count;
}


void md5_calculate(void)
{
  cout<<"请输入长度:";
  int lenth;
  cin>>lenth;
  cout<<endl;
  cout<<"请输入消息:"<<endl;
  char *message;
  message=new char[lenth];
  cin>>*message;
  unsigned char *hash;
  hash=new unsigned char[lenth];
  md5_state md1;
  md5_init(&md1);
  md5_process(&md1, (unsigned char *)message, lenth);
  md5_done(&md1, hash);
  cout<<"HASH值:"<<endl;
  convert(lenth,hash);
  cout<<endl; 
  getch();
}


void snowslip()
{
  cout<<"请输入长度:";
  int lenth;
  cin>>lenth;
  cout<<"请输入消息:"<<endl;
  char *message;
  message=new char[lenth];
  cin>>*message;
  cout<<endl;
  unsigned char *hash;
  hash=new unsigned char[lenth];
  md5_state md1;
  md5_init(&md1);
  md5_process(&md1, (unsigned char *)message, lenth);
  md5_done(&md1, hash);
  unsigned char *mid; 
  mid=new unsigned char[lenth];
  for(int i=0;i<lenth;i++)
	  mid[i]=hash[i];
  int sum=0;
  cout<<"原HASH值:"<<endl;
  convert(lenth,mid);
  cout<<endl;  
  cout<<endl<<"雪崩效应改变后的HASH值:"<<endl;
  int num;		
  for(int j=0;j<8;j++)
  {
      message[5]=' '+j;
      md5_state md1;
      md5_init(&md1);
      md5_process(&md1, (unsigned char*)message, lenth);
      md5_done(&md1, hash);
      num=snowslips(hash,mid);
      sum+=num;
      convert(lenth,hash);
      cout<<"     HASH值改变了"<<num<<"位"<<endl;
     }
  cout<<endl<<"改变一个字符会平均改变HASH有"<<sum/8<<"位"<<endl; 
  cout<<endl;
  getch();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -