当前位置:编程学习 > 网站相关 >>

MD5的C++实现代码

代码:
#include<bitset>
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
unsigned int A(0x67452301);
unsigned int B(0xefcdab89);
unsigned int C(0x98badcfe);
unsigned int D(0x10325476);
unsigned int index[4] ={0x67452301/*A0*/,0xefcdab89/*B1*/,0x98badcfe/*C2*/,0x10325476/*D3*/};
bitset<32> M[16];
string Fill(string data);//填充
unsigned int F(unsigned int x,unsigned int y,unsigned int z);//函数F
unsigned int G(unsigned int x,unsigned int y,unsigned int z);//函数G
unsigned int H(unsigned int x,unsigned int y,unsigned int z);//函数H
unsigned int I(unsigned int x,unsigned int y,unsigned int z);//函数I
void FF(unsigned int &A,unsigned int B,unsigned int C,unsigned int D,bitset<32> M,unsigned int s,unsigned int t);//FF函数
void GG(unsigned int &A,unsigned int B,unsigned int C,unsigned int D,bitset<32> M,unsigned int s,unsigned int t);//GG函数
void HH(unsigned int &A,unsigned int B,unsigned int C,unsigned int D,bitset<32> M,unsigned int s,unsigned int t);//HH函数
void II(unsigned int &A,unsigned int B,unsigned int C,unsigned int D,bitset<32> M,unsigned int s,unsigned int t);//II函数
static unsigned int ft[16] = {         0xd76aa478,0xe8c7b756,0x242070db,0xc1bdceee,
                   0xf57c0faf,0x4787c62a,0xa8304613,0xfd469501,
                   0x698098d8,0x8b44f7af,0xffff5bb1,/*0xfff5bb1*/0x895cd7be,
                   0x6b901122,0xfd987193/*0xfb987193*/,0xa679438e,0x49b40821
            };
static unsigned int gt[16] = {         0xf61e2562,0xc040b340,0x265e5a51,0xe9b6c7aa,       
                   0xd62f105d,0x02441453,0xd8a1e681,0xe7d3fbc8,
                   0x21e1cde6,0xc33707d6,0xf4d50d87,0x455a14ed,
                   0xa9e3e905,0xfcefa3f8,0x676f02d9,0x8d2a4c8a
            };
static unsigned int ht[16] = {         0xfffa3942,0x8771f681,0x6d9d6122,0xfde5380c,       
                   0xa4beea44,0x4bdecfa9,0xf6bb4b60,0xbebfbc70,
                   0x289b7ec6,0xeaa127fa,0xd4ef3085,0x04881d05,
                   0xd9d4d039,0xe6db99e5,0x1fa27cf8,0xc4ac5665
            };
static unsigned int it[16] = {         0xf4292244,/*0x411aff97*/0x432aff97,0xab9423a7,0xfc93a039,       
                       0x655b59c3,0x8f0ccc92,0xffeff47d,0x85845dd1,
                   0x6fa87e4f,0xfe2ce6e0,0xa3014314,0x4e0811a1,
                   0xf7537e82,0xbd3af235,0x2ad7d2bb,0xeb86d391
            };
void Cycle();
void dvblock(string block,unsigned int,unsigned int);
 
void main()
{
  unsigned int p = 0;
  string data;
  string block;
  string temp;
  cin>>data;
  temp = Fill(data);
  unsigned int blocknum = temp.size()/512;
  for(int bn = 0 ;bn < blocknum ; bn++ )
  {
    block = temp.substr(bn*512,512);
    dvblock(block,(blocknum-1),(p++));
    Cycle();//做循环
    A=index[0] + A;//A = a + A
    B=index[1] + B;
    C=index[2] + C;
    D=index[3] + D;
    index[0] = A;//a = A
    index[1] = B;
    index[2] = C;
    index[3] = D;
 
  }
  for(unsigned int i = 0; i<4 ; i++)
    for(unsigned int j = 0; j<4; j++)
    {
      cout<<setw(2)<<setfill('0')<<hex<<((index[i]>>(j*8))&0xff);
    }
  cout<<endl;
 
}
 
string Fill(string data)
{
  unsigned int j = data.size()*8;
  string temp="";
  for(string::size_type i =0 ; i != data.size();  i++)
  {
    bitset<8> at(data[i]);
    temp += at.to_string();
  }
  temp+="1";
  if(temp.size()%512<448)
  {
    while(temp.size()%512<448)//
    {
      temp+="0";
    }
  }
  else
  {
    while((temp.size()+64)%512!=0)
    {
      temp+="0";
    }
  }
  bitset<64> bt(j);
  temp+=bt.to_string();
  return temp;
 
}
 
unsigned int F(unsigned int x,unsigned int y,unsigned int z)
{
  return (x&y)|((~x)&z);
}
 
unsigned int G(unsigned int x,unsigned int y,unsigned int z)
{
   return (x&z)|(y&(~z));
}
 
unsigned int H(unsigned int x,unsigned int y,unsigned int z)
{
  return x^y^z;
}
 
unsigned int I(unsigned int x,unsigned int y,unsigned int z)
{
  return y^(x|(~z));
}
 
void FF(unsigned int &A,unsigned int B,unsigned int C,unsigned int D,bitset<32> M,unsigned int s,unsigned int t)
{
 
  unsigned int Ftemp = F(B,C,D);
  unsigned int temp  = A+(Ftemp + M.to_ulong() + t);
  temp = (temp<<s)|(temp>>(32-s));
  A = B + temp;
 
}
 
void GG(unsigned int &A,unsigned int B,unsigned int C,unsigned int D,bitset<32> M,unsigned int s,unsigned int t)
{
  unsigned int Gtemp = G(B,C,D);
  unsigned int temp  = A+(Gtemp + M.to_ulong() + t);
  temp = (temp<<s)|(temp>>(32-s));
  A = B + temp;
 
}
 
void HH(unsigned int &A,unsigned int B,unsigned int C,unsigned int D,bitset<32> M,unsigned int s,unsigned int t)
{
  unsigned int Htemp = H(B,C,D);
  unsigned int t
补充:综合编程 , 安全编程 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,