• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            yehao's Blog

            VC使用Windows系統DLL實現MD5加密

            http://www.vcsos.com/article/pageSource/120212/20120212070304.shtml 
            使用.NET或者Java編程,系統提供了方便的API可以實現字符串和文件的加密/解密工作,以保證數據的安全,但是在VC編程時,沒有現成的API實現這些功能,網上很多方法都是自己編寫代碼實現DES、MD5等加密算法,種類繁多,良莠不齊,給實際使用帶來了諸多不便。
            本文試圖采用最簡單的方法實現高可靠性、正確性的VC加密實現,著重討論了MD5算法對字符串進行加密,該方法使用了Window系統的動態鏈接庫advapi32.dll,使用簡單,正確性、可靠性和Window系統密碼一致。

            advapi32.dll提供以下MD5函數:
                    MD5Init(&ctx);
                   MD5Update(&ctx, buf, len);
                   MD5Final(&ctx);

            下面分三步討論該方法實現MD5加密的具體方法: 
            第一步:定義MD5加密使用的數據結構和函數指針 
             1 /* Data structure for
             2 * MD5 (Message-Digest) computation
             3 */
             4 typedef struct {
             5     /* number of _bits_ handled mod 2^64 */
             6     ULONG i[2];
             7     /* scratch buffer */                       
             8     ULONG buf[4];    
             9     /* input buffer */                 
            10     unsigned char in[64]; 
            11     /* actual digest after MD5Final call */            
            12     unsigned char digest[16];           
            13 } MD5_CTX;
            14   
            15 #define MD5DIGESTLEN 16
            16 #define PROTO_LIST(list)    list
            17 /*
            18 * MTS: Each of these assumes MD5_CTX
            19 * is locked against simultaneous use.
            20 */
            21 typedef void (WINAPI* PMD5Init) PROTO_LIST ((MD5_CTX *));
            22 typedef void (WINAPI* PMD5Update) PROTO_LIST ((MD5_CTX *
            23                                               , const unsigned char *
            24                                               , unsigned int));
            25 typedef void (WINAPI* PMD5Final )PROTO_LIST ((MD5_CTX *));

            第二步:定義MD5加密的類
            1.h文件: 

             1 class CMD5Encrypt
             2 {
             3 public:
             4     CMD5Encrypt();
             5     virtual ~CMD5Encrypt();
             6     const char * md5(const char * str);
             7     const char * Hex2ASC(const BYTE *Hex, int Len);
             8     PMD5Init MD5Init;
             9     PMD5Update MD5Update;
            10     PMD5Final MD5Final;
            11 };
            2.cpp文件: 
             1 CMD5Encrypt::CMD5Encrypt()
             2 {
             3   
             4 }
             5   
             6 CMD5Encrypt::~CMD5Encrypt()
             7 {
             8   
             9 }
            10 //將BYTE數組轉換成字符串
            11 const char * CMD5Encrypt::Hex2ASC(const BYTE *Hex, int Len)
            12 {
            13     static char ASC[4096 * 2];
            14     int i;
            15   
            16     for (i = 0; i < Len; i++)
            17     {
            18         ASC[i*2] = "0123456789ABCDEF"[Hex[i] >> 4];
            19         ASC[i*2 + 1] = "0123456789ABCDEF"[Hex[i] & 0x0F];
            20     }
            21     ASC[i*2] = '\0';
            22     return ASC;
            23 }
            24 //32位進行MD5加密
            25 const char * CMD5Encrypt::md5(const char * str)
            26 {
            27     MD5_CTX ctx;//MD5運算使用的數據結構
            28     const unsigned char * buf
            29         = reinterpret_cast<const unsigned char *>(str);
            30     //判斷加密字符串的長度
            31     int len = strlen(str);
            32     HINSTANCE hDLL;
            33     if ((hDLL = LoadLibrary(_T("advapi32.dll"))) > 0)
            34     {
            35         MD5Init = (PMD5Init)GetProcAddress(hDLL,"MD5Init");
            36         MD5Update = (PMD5Update)GetProcAddress(hDLL,"MD5Update");
            37         MD5Final = (PMD5Final)GetProcAddress(hDLL,"MD5Final");
            38   
            39         MD5Init(&ctx);
            40         MD5Update(&ctx, buf, len);
            41         MD5Final(&ctx);
            42     }
            43     return Hex2ASC(ctx.digest, 16);
            44 }

            備注:記得在.h文件增加第一步定義的數據結構的引用。

            第三步:調用第二步定義的MD5加密類實現數據加密 
             1 void CMD5Dlg::OnBnClickedMd5()
             2 {  
             3     //獲取待加密的字符串
             4     CString str;
             5     GetDlgItem(IDC_EDIT3)->GetWindowTextW(str);
             6     //MD5加密
             7     CMD5Encrypt md5;
             8     USES_CONVERSION;
             9     const char* res=md5.md5(T2A(str));
            10     //顯示結果
            11     GetDlgItem(IDC_EDIT4)->SetWindowTextW(A2T(res));
            12 }

            至此,VC對字符串進行MD5加密遍完成了,實現效果如下:
            VC對字符串進行MD5加密

            posted on 2012-09-10 22:24 厚積薄發 閱讀(1412) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

            導航

            <2025年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            統計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            影音先锋女人AV鲁色资源网久久| 久久久精品国产亚洲成人满18免费网站 | 色综合久久精品中文字幕首页| 成人久久精品一区二区三区 | 日韩精品国产自在久久现线拍| 久久香蕉国产线看观看99| 久久国产成人精品国产成人亚洲| 亚洲中文字幕久久精品无码喷水| 久久夜色精品国产噜噜亚洲AV | 色综合久久久久| 久久这里只精品99re66| 久久99国产精品久久99| 日韩精品久久无码人妻中文字幕 | 中文字幕久久精品| 精品久久久久国产免费 | 亚洲国产成人乱码精品女人久久久不卡| 日韩人妻无码一区二区三区久久99 | 亚洲αv久久久噜噜噜噜噜| 久久综合狠狠综合久久97色| 69久久夜色精品国产69| 一本色道久久88综合日韩精品| 国产精品久久久久影视不卡| 亚洲AV无码久久精品蜜桃| 亚洲а∨天堂久久精品| 久久精品女人天堂AV麻| 久久91精品久久91综合| 久久久久久国产精品免费无码| 熟妇人妻久久中文字幕| 亚洲日韩欧美一区久久久久我| 青青热久久综合网伊人| 97久久超碰成人精品网站| 日韩人妻无码精品久久免费一 | 亚洲精品国精品久久99热一| 久久婷婷是五月综合色狠狠| 欧美激情精品久久久久久| 国产成人精品久久亚洲| A级毛片无码久久精品免费| 久久香蕉国产线看观看乱码| 久久99热国产这有精品| 日本一区精品久久久久影院| 精品久久久久久无码国产|