• <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 厚積薄發 閱讀(1430) 評論(0)  編輯 收藏 引用 所屬分類: Windows編程

            導航

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            yellow中文字幕久久网| 久久久久久a亚洲欧洲aⅴ| 久久天天躁狠狠躁夜夜躁2014| 7777精品伊人久久久大香线蕉| 亚洲午夜久久久影院| 久久99热这里只有精品国产| 免费一级欧美大片久久网| AV狠狠色丁香婷婷综合久久| 亚洲精品综合久久| 久久国产精品成人影院| 无码国内精品久久人妻麻豆按摩 | 日韩一区二区久久久久久 | 亚洲国产精品无码久久久不卡 | 亚洲精品tv久久久久久久久 | 精品久久久久香蕉网| 久久久久无码中| 国产日产久久高清欧美一区| 国产精品成人久久久| 久久福利片| 99久久婷婷国产一区二区| 91久久婷婷国产综合精品青草| 囯产精品久久久久久久久蜜桃| 久久涩综合| 免费一级做a爰片久久毛片潮| 99热成人精品免费久久| 成人国内精品久久久久一区| 日韩人妻无码一区二区三区久久 | 亚洲精品乱码久久久久久中文字幕 | 久久综合给合综合久久| 国产成人香蕉久久久久| 国产欧美一区二区久久| 国内精品久久久久久野外| 国产亚洲精品美女久久久| 久久夜色精品国产噜噜亚洲AV| 久久久久se色偷偷亚洲精品av | 国产精品欧美久久久久无广告| 久久免费小视频| 欧美色综合久久久久久 | 久久精品国产第一区二区三区| 久久精品水蜜桃av综合天堂 | 亚洲成色www久久网站夜月|