• <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系統(tǒng)DLL實現(xiàn)MD5加密

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

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

            下面分三步討論該方法實現(xiàn)MD5加密的具體方法: 
            第一步:定義MD5加密使用的數(shù)據(jù)結(jié)構(gòu)和函數(shù)指針 
             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數(shù)組轉(zhuǎn)換成字符串
            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運算使用的數(shù)據(jù)結(jié)構(gòu)
            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文件增加第一步定義的數(shù)據(jù)結(jié)構(gòu)的引用。

            第三步:調(diào)用第二步定義的MD5加密類實現(xiàn)數(shù)據(jù)加密 
             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     //顯示結(jié)果
            11     GetDlgItem(IDC_EDIT4)->SetWindowTextW(A2T(res));
            12 }

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

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

            導航

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

            統(tǒng)計

            常用鏈接

            留言簿

            隨筆分類

            文章分類

            文章檔案

            搜索

            最新評論

            亚洲午夜精品久久久久久人妖| 久久久久国产精品嫩草影院| 久久99热这里只有精品66| 久久青青草原精品国产软件| 思思久久99热只有频精品66| 久久亚洲AV成人无码国产| 免费国产99久久久香蕉| 久久久久国产| 久久久亚洲欧洲日产国码aⅴ| 久久最近最新中文字幕大全| 无码人妻久久一区二区三区蜜桃| 亚洲AV无码久久精品蜜桃| 日韩一区二区久久久久久| 久久婷婷色香五月综合激情| 久久er国产精品免费观看2| 一本一本久久A久久综合精品| 94久久国产乱子伦精品免费| 欧洲人妻丰满av无码久久不卡| 激情综合色综合久久综合| 91精品国产乱码久久久久久| 国产香蕉久久精品综合网| 国产成人AV综合久久| 97久久国产亚洲精品超碰热| 久久久久久精品无码人妻| 久久激情五月丁香伊人| 久久91精品国产91久久小草| 亚洲中文字幕久久精品无码喷水 | 亚洲国产天堂久久久久久| 欧美久久综合性欧美| 亚洲国产精品成人久久| 精品国产乱码久久久久久呢| 久久久久亚洲爆乳少妇无 | 人妻无码久久一区二区三区免费 | 国产精品美女久久久久久2018| 麻豆精品久久久久久久99蜜桃| 久久亚洲AV永久无码精品| 久久性精品| 久久亚洲国产成人影院| 久久久精品国产免大香伊| 狠狠色婷婷久久一区二区| 国产aⅴ激情无码久久|