科技改變生活 · 科技引領(lǐng)未來

      • 首頁
      • 資訊
      • 技術(shù)
      • 百科
      • 問答
      • 學習
      • 看看
      • 站長
      • 生活
      • 快訊

      首頁 > 看看 > 創(chuàng)業(yè)經(jīng)驗

      md5在線加密 md5在線加密hex

      時間:2022-08-25 11:11 作者:丁楠明

      本文詳細講解視頻如下:

      《C語言實現(xiàn)MD5算法》

      一、摘要算法

      摘要算法又稱哈希算法。

      它表示輸入任意長度的數(shù)據(jù),輸出固定長度的數(shù)據(jù),它的主要特征是加密過程不需要密鑰,并且經(jīng)過加密的數(shù)據(jù)無法被解密。

      目前可以被解密逆向的只有CRC32算法,只有輸入相同的明文數(shù)據(jù)經(jīng)過相同的消息摘要算法才能得到相同的密文。

      消息摘要算法不存在密鑰的管理與分發(fā)問題,適合于分布式網(wǎng)絡(luò)上使用。由于其加密計算的工作量相當巨大,所以以前的這種算法通常只用于數(shù)據(jù)量有限的情況下的加密。

      消息摘要算法分為三類:

      • MD(Message Digest):消息摘要
      • SHA(Secure Hash Algorithm):安全散列
      • MAC(Message Authentication Code):消息認證碼

      這三類算法的主要作用:驗證數(shù)據(jù)的完整性

      二、MD5簡介

      MD5即Message-Digest Algorithm 5(信息-摘要算法)。

      屬于摘要算法,是一個不可逆過程,就是無論多大數(shù)據(jù),經(jīng)過算法運算后都是生成固定長度的數(shù)據(jù),結(jié)果使用16進制進行顯示的128bit的二進制串。通常表示為32個十六進制數(shù)連成的字符串。

      MD5有什么用?

      用于確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一(又譯摘要算法、哈希算法),主流編程語言普遍已有MD5實現(xiàn)。更多用在文檔校驗上,用來生成密鑰檢測文檔是否被篡改。

      三、在線MD5加密

      有很多在線進行MD5加密的網(wǎng)站,如下:

      http://www.metools.info/code/c26.html

      舉例: 給字符串 12334567 加密成。

      如圖結(jié)果為:

      32135A337F8DC8E2BB9A9B80D86BDFD0
      

      四、C語言實現(xiàn)MD5算法

      源文件如下:md5.h

      ifndef MD5_H
      define MD5_H
       
      typedef struct
      {
          unsigned int count[2];
          unsigned int state[4];
          unsigned char buffer[64];   
      }MD5_CTX;
       
                               
      define F(x,y,z) ((x & y) | (~x & z))
      define G(x,y,z) ((x & z) | (y & ~z))
      define H(x,y,z) (x^y^z)
      define I(x,y,z) (y ^ (x | ~z))
      define ROTATE_LEFt(x,n) ((x << n) | (x >> (32-n)))
      define FF(a,b,c,d,x,s,ac) 
                { 
                a += F(b,c,d) + x + ac; 
                a = ROTATE_LEFt(a,s); 
                a += b; 
                }
      define GG(a,b,c,d,x,s,ac) 
                { 
                a += G(b,c,d) + x + ac; 
                a = ROTATE_LEFt(a,s); 
                a += b; 
                }
      define HH(a,b,c,d,x,s,ac) 
                { 
                a += H(b,c,d) + x + ac; 
                a = ROTATE_LEFt(a,s); 
                a += b; 
                }
      define II(a,b,c,d,x,s,ac) 
                { 
                a += I(b,c,d) + x + ac; 
                a = ROTATE_LEFt(a,s); 
                a += b; 
                }                                            
      void MD5Init(MD5_CTX *context);
      void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen);
      void MD5Final(MD5_CTX *context,unsigned char digest[16]);
      void MD5Transform(unsigned int state[4],unsigned char block[64]);
      void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len);
      void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len);
       
      endif
      

      md5.c

      include 
      include &34;md5.h&34;
       
      unsigned char PADDING[]={0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                               0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                               0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                               0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
                               
      void MD5Init(MD5_CTX *context)
      {
           context->count[0] = 0;
           context->count[1] = 0;
           context->state[0] = 0x67452301;
           context->state[1] = 0xEFCDAB89;
           context->state[2] = 0x98BADCFE;
           context->state[3] = 0x10325476;
      }
      void MD5Update(MD5_CTX *context,unsigned char *input,unsigned int inputlen)
      {
          unsigned int i = 0,index = 0,partlen = 0;
          index = (context->count[0] >> 3) & 0x3F;
          partlen = 64 - index;
          context->count[0] += inputlen << 3;
          if(context->count[0] < (inputlen << 3))
             context->count[1]++;
          context->count[1] += inputlen >> 29;
          
          if(inputlen >= partlen)
          {
             memcpy(&context->buffer[index],input,partlen);
             MD5Transform(context->state,context->buffer);
             for(i = partlen;i+64 <= inputlen;i+=64)
                 MD5Transform(context->state,&input[i]);
             index = 0;        
          }  
          else
          {
              i = 0;
          }
          memcpy(&context->buffer[index],&input[i],inputlen-i);
      }
      void MD5Final(MD5_CTX *context,unsigned char digest[16])
      {
          unsigned int index = 0,padlen = 0;
          unsigned char bits[8];
          index = (context->count[0] >> 3) & 0x3F;
          padlen = (index < 56)?(56-index):(120-index);
          MD5Encode(bits,context->count,8);
          MD5Update(context,PADDING,padlen);
          MD5Update(context,bits,8);
          MD5Encode(digest,context->state,16);
      }
      void MD5Encode(unsigned char *output,unsigned int *input,unsigned int len)
      {
          unsigned int i = 0,j = 0;
          while(j < len)
          {
               output[j] = input[i] & 0xFF;  
               output[j+1] = (input[i] >> 8) & 0xFF;
               output[j+2] = (input[i] >> 16) & 0xFF;
               output[j+3] = (input[i] >> 24) & 0xFF;
               i++;
               j+=4;
          }
      }
      void MD5Decode(unsigned int *output,unsigned char *input,unsigned int len)
      {
           unsigned int i = 0,j = 0;
           while(j < len)
           {
                 output[i] = (input[j]) |
                             (input[j+1] << 8) |
                             (input[j+2] << 16) |
                             (input[j+3] << 24);
                 i++;
                 j+=4; 
           }
      }
      void MD5Transform(unsigned int state[4],unsigned char block[64])
      {
           unsigned int a = state[0];
           unsigned int b = state[1];
           unsigned int c = state[2];
           unsigned int d = state[3];
           unsigned int x[64];
           MD5Decode(x,block,64);
           FF(a, b, c, d, x[ 0], 7, 0xd76aa478); 
       FF(d, a, b, c, x[ 1], 12, 0xe8c7b756); 
       FF(c, d, a, b, x[ 2], 17, 0x242070db); 
       FF(b, c, d, a, x[ 3], 22, 0xc1bdceee); 
       FF(a, b, c, d, x[ 4], 7, 0xf57c0faf); 
       FF(d, a, b, c, x[ 5], 12, 0x4787c62a); 
       FF(c, d, a, b, x[ 6], 17, 0xa8304613); 
       FF(b, c, d, a, x[ 7], 22, 0xfd469501); 
       FF(a, b, c, d, x[ 8], 7, 0x698098d8); 
       FF(d, a, b, c, x[ 9], 12, 0x8b44f7af); 
       FF(c, d, a, b, x[10], 17, 0xffff5bb1); 
       FF(b, c, d, a, x[11], 22, 0x895cd7be); 
       FF(a, b, c, d, x[12], 7, 0x6b901122); 
       FF(d, a, b, c, x[13], 12, 0xfd987193); 
       FF(c, d, a, b, x[14], 17, 0xa679438e); 
       FF(b, c, d, a, x[15], 22, 0x49b40821); 
       
       
       GG(a, b, c, d, x[ 1], 5, 0xf61e2562); 
       GG(d, a, b, c, x[ 6], 9, 0xc040b340); 
       GG(c, d, a, b, x[11], 14, 0x265e5a51); 
       GG(b, c, d, a, x[ 0], 20, 0xe9b6c7aa); 
       GG(a, b, c, d, x[ 5], 5, 0xd62f105d); 
       GG(d, a, b, c, x[10], 9,  0x2441453); 
       GG(c, d, a, b, x[15], 14, 0xd8a1e681); 
       GG(b, c, d, a, x[ 4], 20, 0xe7d3fbc8); 
       GG(a, b, c, d, x[ 9], 5, 0x21e1cde6); 
       GG(d, a, b, c, x[14], 9, 0xc33707d6); 
       GG(c, d, a, b, x[ 3], 14, 0xf4d50d87); 
       GG(b, c, d, a, x[ 8], 20, 0x455a14ed); 
       GG(a, b, c, d, x[13], 5, 0xa9e3e905); 
       GG(d, a, b, c, x[ 2], 9, 0xfcefa3f8); 
       GG(c, d, a, b, x[ 7], 14, 0x676f02d9); 
       GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); 
       
       
       HH(a, b, c, d, x[ 5], 4, 0xfffa3942); 
       HH(d, a, b, c, x[ 8], 11, 0x8771f681); 
       HH(c, d, a, b, x[11], 16, 0x6d9d6122); 
       HH(b, c, d, a, x[14], 23, 0xfde5380c); 
       HH(a, b, c, d, x[ 1], 4, 0xa4beea44); 
       HH(d, a, b, c, x[ 4], 11, 0x4bdecfa9); 
       HH(c, d, a, b, x[ 7], 16, 0xf6bb4b60); 
       HH(b, c, d, a, x[10], 23, 0xbebfbc70); 
       HH(a, b, c, d, x[13], 4, 0x289b7ec6); 
       HH(d, a, b, c, x[ 0], 11, 0xeaa127fa); 
       HH(c, d, a, b, x[ 3], 16, 0xd4ef3085); 
       HH(b, c, d, a, x[ 6], 23,  0x4881d05); 
       HH(a, b, c, d, x[ 9], 4, 0xd9d4d039); 
       HH(d, a, b, c, x[12], 11, 0xe6db99e5); 
       HH(c, d, a, b, x[15], 16, 0x1fa27cf8); 
       HH(b, c, d, a, x[ 2], 23, 0xc4ac5665); 
       
       
       II(a, b, c, d, x[ 0], 6, 0xf4292244); 
       II(d, a, b, c, x[ 7], 10, 0x432aff97); 
       II(c, d, a, b, x[14], 15, 0xab9423a7); 
       II(b, c, d, a, x[ 5], 21, 0xfc93a039); 
       II(a, b, c, d, x[12], 6, 0x655b59c3); 
       II(d, a, b, c, x[ 3], 10, 0x8f0ccc92); 
       II(c, d, a, b, x[10], 15, 0xffeff47d); 
       II(b, c, d, a, x[ 1], 21, 0x85845dd1); 
       II(a, b, c, d, x[ 8], 6, 0x6fa87e4f); 
       II(d, a, b, c, x[15], 10, 0xfe2ce6e0); 
       II(c, d, a, b, x[ 6], 15, 0xa3014314); 
       II(b, c, d, a, x[13], 21, 0x4e0811a1); 
       II(a, b, c, d, x[ 4], 6, 0xf7537e82); 
       II(d, a, b, c, x[11], 10, 0xbd3af235); 
       II(c, d, a, b, x[ 2], 15, 0x2ad7d2bb); 
       II(b, c, d, a, x[ 9], 21, 0xeb86d391); 
           state[0] += a;
           state[1] += b;
           state[2] += c;
           state[3] += d;
      }
      

      五、MD5加密實例

      MD5加密步驟如下:

      1. 定義
      MD5_CTX md5c; 
      
      1. 初始化
      
      MD5Init(MD5_CTX *context);
      
      1. MD5值計算

      實現(xiàn)MD5值的計算及結(jié)構(gòu)體的更新:

      
      
      MD5Update(MD5_CTX *context,(unsigned char *)input,inputLen); 
      
      1. 輸出轉(zhuǎn)換
      
      MD5Final(MD5_CTX *context,unsigned char digest[16]);
      
      1. 格式整理

      轉(zhuǎn)換成32位的16進制字符串。

      實例1 字符串加密

      對字符串進行加密:

        1 include 
        2 include 
        3 include &34;md5.h&34;
        4 include 
        5 include 
        6 include 
        7 include 
        8 
        9 void main( void ) 
       10 { 
       11     int read_len;
       12     int i ;
       13     char temp[8]={0};
       14     unsigned char digest[16]; //存放結(jié)果 
       15     char hexbuf[128]=&34;12334567&34;;
       16     unsigned char decrypt[16]={0};  
       17     unsigned char decrypt32[64]={0};    
       18 
       19     MD5_CTX md5c; 
       20 
       21     MD5Init(&md5c); //初始化
       22     read_len = strlen(hexbuf);
       23     MD5Update(&md5c,(unsigned char *)hexbuf,read_len);  
       24 
       25     MD5Final(&md5c,decrypt); 
       26     strcpy((char *)decrypt32,&34;&34;);
       27 
       28     for(i=0;i<16;i++)
       29     {
       30         sprintf(temp,&34;%02x&34;,decrypt[i]);
       31         strcat((char *)decrypt32,temp);
       32     }
       33     printf(&34;md5:%sn&34;,decrypt32);
       34     
       35     return;
       36 }
      

      執(zhí)行結(jié)果如下:

      本例對字符串12334567進行加密,結(jié)果和在線加密結(jié)果一致。

      實例2 文件加密

      對文件進行加密

      include 
      include 
      include &34;md5.h&34;
      include 
      include 
      include 
      include 
      
      define FORWORD_FW &34;123.c&34;
      
      int calc_md5(char*filename,char*dest)
      {
       int i;
       int filelen = 0;
       int read_len;
       char temp[8]={0}; 
       char hexbuf[128]={0};
       unsigned char decrypt[16]={0};  
       unsigned char decrypt32[64]={0};
       MD5_CTX md5;
       char fw_path[128];
      
       int fdf;
       
       fdf = open(filename,O_RDWR);
       if(fdf<0)
       {
        printf(&34;%s not existn&34;,FORWORD_FW);
        return -1;
       }
       
       MD5Init(&md5);  
       while(1)
       {
        read_len = read(fdf, hexbuf,sizeof(hexbuf)); 
        if (read_len <0) {  
         close(fdf);   
         return -1;
        }
        if(read_len==0)
        {
         break;
        }
        filelen += read_len;
        MD5Update(&md5,(unsigned char *)hexbuf,read_len); 
       }
      
       
       MD5Final(&md5,decrypt); 
       strcpy((char *)decrypt32,&34;&34;);
       
       for(i=0;i<16;i++)
       {
        sprintf(temp,&34;%02x&34;,decrypt[i]);
        strcat((char *)decrypt32,temp);
       }
       strcpy(dest,decrypt32);
      
       printf(&34;md5:%s len=%dn&34;,dest,filelen);
       close(fdf);
      
       return filelen;
      }
      int main(int argc, char *argv[])
      {
       int ret;
       int filelen;
       char md5_str[64]={0};
       char cmd[256]={0};
       
       filelen = calc_md5(FORWORD_FW,md5_str);
       if(filelen<0)
       {
        printf(&34;calc_md5 failn&34;);
        return -1;
       }
      
       return 0;
      }
      

      運行結(jié)果:

      在線驗證結(jié)果對比:

      http://www.metools.info/other/o21.html

      結(jié)果

      相關(guān)話題

      • 小鴨子簡筆畫(兒童簡筆畫小鴨子)
      • 鮑魚怎么處理干凈? 鮑魚的三大忌做法
      • 紅豆湯的功效與作用(為什么不建議男性吃紅豆)
      • 羽毛球世界排名(羽毛球冠軍十大排名)
      • 拔牙后多久可以刷牙(拔牙一側(cè)多久可以咀嚼)
      • 曹劌論戰(zhàn)原文及翻譯(曹劌論戰(zhàn)原文及單字翻譯)
      • 遺精是什么意思(光緒為什么長期遺精)
      • 避暑農(nóng)家樂哪里好(避暑農(nóng)家樂推薦)
      • 關(guān)于紅色中國的電影有哪些(紅色主題的電影)
      • 電腦自動重啟是什么原因(電腦老是反復自動重啟)
      • 世界上真的有龍嗎(有人拍到九尾狐)
      • 好看的韓國電視劇 《借妻》完整版觀看
      • 依山傍水的意思(依山傍水的成語解釋及意思)
      • 電信怎么查流量(微信怎么看電信流量)
      • 馮紹峰趙麗穎婚變原因 劉愷威王鷗公布婚訊
      • 干花制作方法 做干花的步驟與方法
      • 蠶寶寶的生長過程(蠶的生長過程及圖片)
      • 蘋果怎么錄NFC門禁卡 快捷指令自動化nfc門禁卡
      • 嬋娟是什么意思(嬋娟是什么含義)
      • 哈利波特死了8個演員(哈利為什么和秋張分手了)

      熱門推薦

      • 古鐘二鍋頭46度多少錢(全國喝啥酒)
      • 順豐寄50斤冰箱多少錢(評測五大快遞平臺)
      • 做飯保姆一個月多少錢(52歲阿姨哭訴)
      • 鹿茸補腎丸多少錢一盒(參茸鞭丸腎陰虛者能吃嗎)
      • 北京換烤瓷牙多少錢(明星為整牙有多拼)
      • 樂高培訓加盟費多少錢(樂高教育取消授權(quán)波及上百門店)
      • 西鳳酒15年多少錢一瓶(價不高待客又不失面子的純糧酒)
      • 聚酰亞胺多少錢一公斤(酶中戰(zhàn)斗機)
      • 公司入職體檢一般多少錢(通過聘多多找到工作)
      • 插座維修上門多少錢(換個插座還用找電工)
      • 二元店一年掙多少錢(揭秘)
      • ctfau750鉆戒多少錢(黑客游戲和解謎游戲的關(guān)聯(lián)之處)
      • 23年工齡退休拿多少錢(繳費23年)
      • 平衡霜多少錢一瓶(日本POLA旗下這個小眾牌子THREE)
      • 歐米茄手表電池多少錢一塊(福布斯公布運動員收入榜單)
      • 正規(guī)醫(yī)院種植牙多少錢一顆(成本百元卻賣上萬)
      • 微信能賣多少錢(微信賬號被公開買賣)
      • 奔富707多少錢一瓶(宴請時的)
      • 超聲波焊接機多少錢一臺(關(guān)于超聲波焊接)
      • 一鳴加盟費要多少錢(一鳴真鮮奶吧多少錢)

      丁楠明

      關(guān)注
      免責聲明:本文章由會員“丁楠明”發(fā)布,如果文章侵權(quán),請聯(lián)系我們處理,本站僅提供信息存儲空間服務(wù) 如因作品內(nèi)容、版權(quán)和其他問題請于本站聯(lián)系

      關(guān)注排行榜

      1. 1新百倫多少錢(都有一個)
      2. 2活牛多少錢一斤(牛價丨2月11日)
      3. 3鋁單板多少錢一平方(鋁單板廠家報價大揭秘)
      4. 4一箱牛奶多少錢(實體店一箱牛奶賣50元)
      5. 5普洱茶一般多少錢(有的普洱茶只要幾十有的上萬)
      6. 6換手機外屏多少錢(盤點各個旗艦手機換屏價格)
      7. 7一輛電動車多少錢(最低不到8000元)
      8. 8巴寶莉圍巾多少錢(花2580元網(wǎng)購的博柏利圍巾竟系假貨)
      9. 9養(yǎng)老保險每年多少錢(2021年養(yǎng)老保險繳費15年)
      10. 10每升油多少錢(?定了)

      編輯精選

      Copyright ?2009-2022 KeJiTian.Com, All Rights Reserved

      版權(quán)所有 未經(jīng)許可不得轉(zhuǎn)載

      增值電信業(yè)務(wù)經(jīng)營許可證備案號:遼ICP備14006349號

      網(wǎng)站介紹 商務(wù)合作 免責聲明 - html - txt - xml

      感谢您访问我们的网站,您可能还对以下资源感兴趣:

      经典香港**毛片免费看_91精品一区二区综合在线_欧美人与性动交a欧美精品_国产小视频在线看