﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Prayer-随笔分类-算法</title><link>http://www.cppblog.com/prayer/category/12045.html</link><description>在一般中寻求卓越</description><language>zh-cn</language><lastBuildDate>Sat, 09 Oct 2010 19:47:45 GMT</lastBuildDate><pubDate>Sat, 09 Oct 2010 19:47:45 GMT</pubDate><ttl>60</ttl><item><title>md5的实现</title><link>http://www.cppblog.com/prayer/archive/2010/10/09/129210.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Sat, 09 Oct 2010 08:44:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/10/09/129210.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/129210.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/10/09/129210.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/129210.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/129210.html</trackback:ping><description><![CDATA[　具体的一个MD5实现<br>　　/*<br>　　* md5 -- compute and check MD5 message digest.<br>　　* this version only can calculate the char string.<br>　　*<br>　　* MD5 (Message-Digest algorithm 5) is a widely used, partially<br>　　* insecure cryptographic hash function with a 128-bit hash value.<br>　　*<br>　　* Author: redraiment<br>　　* Date: Aug 27, 2008<br>　　* Version: 0.1.6<br>　　*/<br>　　#include &lt;stdlib.h&gt;<br>　　#include &lt;string.h&gt;<br>　　#include &lt;stdio.h&gt;<br>　　#include &lt;math.h&gt;<br>　　#define SINGLE_ONE_BIT 0x80<br>　　#define BLOCK_SIZE 512<br>　　#define MOD_SIZE 448<br>　　#define APP_SIZE 64<br>　　#define BITS 8<br>　　// MD5 Chaining Variable<br>　　#define A 0x67452301UL<br>　　#define B 0xEFCDAB89UL<br>　　#define C 0x98BADCFEUL<br>　　#define D 0x10325476UL<br>　　// Creating own types<br>　　#ifdef UINT64<br>　　# undef UINT64<br>　　#endif<br>　　#ifdef UINT32<br>　　# undef UINT32<br>　　#endif<br>　　typedef unsigned long long UINT64;<br>　　typedef unsigned long UINT32;<br>　　typedef unsigned char UINT8;<br>　　typedef struct<br>　　{<br>　　char * message;<br>　　UINT64 length;<br>　　}STRING;<br>　　const UINT32 X[4][2] = {{0, 1}, {1, 5}, {5, 3}, {0, 7}};<br>　　// Constants for MD5 transform routine.<br>　　const UINT32 S[4][4] = {<br>　　{ 7, 12, 17, 22 },<br>　　{ 5, 9, 14, 20 },<br>　　{ 4, 11, 16, 23 },<br>　　{ 6, 10, 15, 21 }<br>　　};<br>　　// F, G, H and I are basic MD5 functions.<br>　　UINT32 F( UINT32 X, UINT32 Y, UINT32 Z )<br>　　{<br>　　return ( X &amp; Y ) | ( ~X &amp; Z );<br>　　}<br>　　UINT32 G( UINT32 X, UINT32 Y, UINT32 Z )<br>　　{<br>　　return ( X &amp; Z ) | ( Y &amp; ~Z );<br>　　}<br>　　UINT32 H( UINT32 X, UINT32 Y, UINT32 Z )<br>　　{<br>　　return X ^ Y ^ Z;<br>　　}<br>　　UINT32 I( UINT32 X, UINT32 Y, UINT32 Z )<br>　　{<br>　　return Y ^ ( X | ~Z );<br>　　}<br>　　// rotates x left s bits.<br>　　UINT32 rotate_left( UINT32 x, UINT32 s )<br>　　{<br>　　return ( x &lt;&lt; s ) | ( x &gt;&gt; ( 32 - s ) );<br>　　}<br>　　// Pre-processin<br>　　UINT32 count_padding_bits ( UINT32 length )<br>　　{<br>　　UINT32 div = length * BITS / BLOCK_SIZE;<br>　　UINT32 mod = length * BITS % BLOCK_SIZE;<br>　　UINT32 c_bits;<br>　　if ( mod == 0 )<br>　　c_bits = MOD_SIZE;<br>　　else<br>　　c_bits = ( MOD_SIZE + BLOCK_SIZE - mod ) % BLOCK_SIZE;<br>　　return c_bits / BITS;<br>　　}<br>　　STRING append_padding_bits ( char * argv )<br>　　{<br>　　UINT32 msg_length = strlen ( argv );<br>　　UINT32 bit_length = count_padding_bits ( msg_length );<br>　　UINT64 app_length = msg_length * BITS;<br>　　STRING string;<br>　　string.message = (char *)malloc(msg_length + bit_length + APP_SIZE / BITS);<br>　　// Save message<br>　　strncpy ( string.message, argv, msg_length );<br>　　// Pad out to mod 64.<br>　　memset ( string.message + msg_length, 0, bit_length );<br>　　string.message [ msg_length ] = SINGLE_ONE_BIT;<br>　　// Append length (before padding).<br>　　memmove ( string.message + msg_length + bit_length, (char *)&amp;app_length, sizeof( UINT64 ) );<br>　　string.length = msg_length + bit_length + sizeof( UINT64 );<br>　　return string;<br>　　}<br>　　int main ( int argc, char *argv[] )<br>　　{<br>　　STRING string;<br>　　UINT32 w[16];<br>　　UINT32 chain[4];<br>　　UINT32 state[4];<br>　　UINT8 r[16];<br>　　UINT32 ( *auxi[ 4 ])( UINT32, UINT32, UINT32 ) = { F, G, H, I };<br>　　int roundIdx;<br>　　int argIdx;<br>　　int sIdx;<br>　　int wIdx;<br>　　int i;<br>　　int j;<br>　　if ( argc &lt; 2 )<br>　　{<br>　　fprintf ( stderr, "usage: %s string ...\n", argv[ 0 ] );<br>　　return EXIT_FAILURE;<br>　　}<br>　　for ( argIdx = 1; argIdx &lt; argc; argIdx++ )<br>　　{<br>　　string = append_padding_bits ( argv[ argIdx ] );<br>　　// MD5 initialization.<br>　　chain[0] = A;<br>　　chain[1] = B;<br>　　chain[2] = C;<br>　　chain[3] = D;<br>　　for ( j = 0; j &lt; string.length; j += BLOCK_SIZE / BITS)<br>　　{<br>　　memmove ( (char *)w, string.message + j, BLOCK_SIZE / BITS );<br>　　memmove ( state, chain, sizeof(chain) );<br>　　for ( roundIdx = 0; roundIdx &lt; 4; roundIdx++ )<br>　　{<br>　　wIdx = X[ roundIdx ][ 0 ];<br>　　sIdx = 0;<br>　　for ( i = 0; i &lt; 16; i++ )<br>　　{<br>　　// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.<br>　　// Rotation is separate from addition to prevent recomputation.<br>　　state[sIdx] = state [ (sIdx + 1) % 4 ] + <br>　　rotate_left ( state[sIdx] +<br>　　( *auxi[ roundIdx ] )<br>　　( state[(sIdx+1) % 4], state[(sIdx+2) % 4], state[(sIdx+3) % 4]) +<br>　　w[ wIdx ] +<br>　　(UINT32)floor( (1ULL &lt;&lt; 32) * fabs(sin( roundIdx * 16 + i + 1 )) ),<br>　　S[ roundIdx ][ i % 4 ]);<br>　　sIdx = ( sIdx + 3 ) % 4;<br>　　wIdx = ( wIdx + X[ roundIdx ][ 1 ] ) &amp; 0xF;<br>　　}<br>　　}<br>　　chain[ 0 ] += state[ 0 ];<br>　　chain[ 1 ] += state[ 1 ];<br>　　chain[ 2 ] += state[ 2 ];<br>　　chain[ 3 ] += state[ 3 ];<br>　　}<br>　　memmove ( r + 0, (char *)&amp;chain[0], sizeof(UINT32) );<br>　　memmove ( r + 4, (char *)&amp;chain[1], sizeof(UINT32) );<br>　　memmove ( r + 8, (char *)&amp;chain[2], sizeof(UINT32) );<br>　　memmove ( r + 12, (char *)&amp;chain[3], sizeof(UINT32) );<br>　　for ( i = 0; i &lt; 16; i++ )<br>　　printf ( "%02x", r[i] );<br>　　putchar ( '\n' );<br>　　}<br>　　return EXIT_SUCCESS;<br>　　}<br>　　/* 以上程序可以在任意一款支持ANSI C的编译器上编译通过 */
<img src ="http://www.cppblog.com/prayer/aggbug/129210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-10-09 16:44 <a href="http://www.cppblog.com/prayer/archive/2010/10/09/129210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>具体的一个MD5实现</title><link>http://www.cppblog.com/prayer/archive/2010/10/09/129209.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Sat, 09 Oct 2010 08:43:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/10/09/129209.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/129209.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/10/09/129209.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/129209.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/129209.html</trackback:ping><description><![CDATA[<div class=titord style="TEXT-INDENT: 2em"><span class=arr><a id=STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN_2 title=返回页首 href="http://baike.baidu.com/view/7636.htm#" name=STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN></a></span><span class=t1><a name=4></a><strong>具体的一个MD5实现</strong></span></div>
<p style="TEXT-INDENT: 2em">=============================头文件Security.h===============================================<br><br><br><br>// 下列 ifdef 块是创建使从 DLL 导出更简单的<br>// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 SECURITY_EXPORTS<br>// 符号编译的。在使用此 DLL 的<br>// 任何其他项目上不应定义此符号。这样，源文件中包含此文件的任何其他项目都会将<br>// SECURITY_API 函数视为是从此 DLL 导入的，而此 DLL 则将用此宏定义的<br>// 符号视为是被导出的。<br><br>//在使用该类的地方包含本文件即可<br>#ifdef SECURITY_EXPORTS<br>#define SECURITY_API __declspec(dllexport)<br>#else<br>#define SECURITY_API __declspec(dllimport)<br>#endif<br><br><br>typedef unsigned char *POINTER;<br><br><br>typedef unsigned short int UINT2;<br><br><br>typedef unsigned long int UINT4;<br><br>#define PROTO_LIST(list) list<br><br><br>typedef struct _MD5_CTX<br>{<br>UINT4 state[4];<br>UINT4 count[2];<br>unsigned char buffer[64];<br>} MD5_CTX;<br><br>static unsigned char PADDING[64]= {<br>0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,<br>&nbsp;<wbr>&nbsp;<wbr>0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,<br>&nbsp;<wbr>&nbsp;<wbr>0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0<br>};<br><br>#define S11 7<br>#define S12 12<br>#define S13 17<br>#define S14 22<br>#define S21 5<br>#define S22 9<br>#define S23 14<br>#define S24 20<br>#define S31 4<br>#define S32 11<br>#define S33 16<br>#define S34 23<br>#define S41 6<br>#define S42 10<br>#define S43 15<br>#define S44 21<br><br><br>#define F(x, y, z) (((x) &amp; (y)) | ((~x) &amp; (z)))<br>#define G(x, y, z) (((x) &amp; (z)) | ((y) &amp; (~z)))<br>#define H(x, y, z) ((x) ^ (y) ^ (z))<br>#define I(x, y, z) ((y) ^ ((x) | (~z)))<br><br><br>#define ROTATE_LEFT(x, n) (((x) &lt;&lt; (n)) | ((x) &gt;&gt; (32-(n))))<br><br><br>#define FF(a, b, c, d, x, s, ac) { (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac);(a) = ROTATE_LEFT ((a), (s)); (a) += (b); }<br>#define GG(a, b, c, d, x, s, ac) { (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }<br>#define HH(a, b, c, d, x, s, ac) {&nbsp;<wbr>&nbsp;<wbr>(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }<br>#define II(a, b, c, d, x, s, ac) { (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s)); (a) += (b); }<br><br>#define TEST_BLOCK_LEN 1000<br>#define TEST_BLOCK_COUNT 1000<br><br>// 此类是从 Security.dll 导出的<br>class SECURITY_API CSecurity<br>{<br>public:<br>CSecurity(void);<br>void CSecurity::MD5( const char *string ,char *lpMD5StringBuffer ) ;<br>private:<br>&nbsp;<wbr>&nbsp;<wbr>void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));<br>&nbsp;<wbr>&nbsp;<wbr>void MD5_memcpy PROTO_LIST ((POINTER, POINTER, size_t));<br>&nbsp;<wbr>&nbsp;<wbr>void MD5_memset PROTO_LIST ((POINTER, int, size_t));<br>&nbsp;<wbr>&nbsp;<wbr>void MD5Init PROTO_LIST ((MD5_CTX *));<br>&nbsp;<wbr>&nbsp;<wbr>void MD5Update PROTO_LIST ((MD5_CTX *, unsigned char *, size_t));<br>&nbsp;<wbr>&nbsp;<wbr>void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));<br>&nbsp;<wbr>&nbsp;<wbr>void MDTimeTrial PROTO_LIST ((void));<br>&nbsp;<wbr>&nbsp;<wbr>void StringAddOne PROTO_LIST ((char *));<br>&nbsp;<wbr>&nbsp;<wbr>void Encode PROTO_LIST ((unsigned char *, UINT4 *, size_t));<br>&nbsp;<wbr>&nbsp;<wbr>void Decode PROTO_LIST ((UINT4 *, unsigned char *, size_t));<br>};<br>===============================Security.cpp====================================================<br><br>// Security.cpp : 定义 DLL 应用程序的入口点。<br>//<br><br>#include "stdafx.h"<br><br>#include<br>#include<br>#include<br>#include<br>#include<br><br>#include "Security.h"<br><br>BOOL APIENTRY DllMain( HANDLE hModule,<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> DWORD&nbsp;<wbr>&nbsp;<wbr>ul_reason_for_call,<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> LPVOID lpReserved<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> )<br>{<br>switch (ul_reason_for_call)<br>{<br>case DLL_PROCESS_ATTACH:<br>case DLL_THREAD_ATTACH:<br>case DLL_THREAD_DETACH:<br>case DLL_PROCESS_DETACH:<br>&nbsp;<wbr>&nbsp;<wbr>break;<br>}<br>&nbsp;<wbr> &nbsp;<wbr> return TRUE;<br>}<br><br><br>// 这是已导出类的构造函数。<br>// 有关类定义的信息，请参阅 Security.h<br>CSecurity::CSecurity()<br>{<br>return;<br>}<br><br><br><br>void CSecurity::MD5Init( MD5_CTX *context )<br>{<br>context-&gt;count[0] = context-&gt;count[1] = 0;<br><br>context-&gt;state[0] = 0x67452301;<br>context-&gt;state[1] = 0xefcdab89;<br>context-&gt;state[2] = 0x98badcfe;<br>context-&gt;state[3] = 0x10325476;<br>}<br><br><br>void CSecurity::MD5Update(<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> MD5_CTX *context,<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> unsigned char *input,<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> size_t inputLen<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> )<br>{<br>size_t i, index, partLen;<br><br><br>index = (size_t)((context-&gt;count[0] &gt;&gt; 3) &amp; 0x3F);<br><br><br>if ((context-&gt;count[0] += ((UINT4)inputLen &lt;&lt; 3))<br>&nbsp;<wbr>&nbsp;<wbr>&lt; ((UINT4)inputLen &lt;&lt; 3))<br>&nbsp;<wbr>&nbsp;<wbr>context-&gt;count[1]++;<br>context-&gt;count[1] += ((UINT4)inputLen &gt;&gt; 29);<br><br>partLen = 64 - index;<br><br><br>if (inputLen &gt;= partLen) {<br>&nbsp;<wbr>&nbsp;<wbr>MD5_memcpy<br>&nbsp;<wbr> &nbsp;<wbr>((POINTER)&amp;context-&gt;buffer[index], (POINTER)input, partLen);<br>&nbsp;<wbr>&nbsp;<wbr>MD5Transform (context-&gt;state, context-&gt;buffer);<br>&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;<wbr>for (i = partLen; i + 63 &lt; inputLen; i += 64)<br>&nbsp;<wbr> &nbsp;<wbr>MD5Transform (context-&gt;state, &amp;input);<br>&nbsp;<wbr>&nbsp;<wbr><br>&nbsp;<wbr>&nbsp;<wbr>index = 0;<br>}<br>else<br>&nbsp;<wbr>&nbsp;<wbr>i = 0;<br><br><br>MD5_memcpy<br>&nbsp;<wbr>&nbsp;<wbr>((POINTER)&amp;context-&gt;buffer[index], (POINTER)&amp;input,<br>&nbsp;<wbr>&nbsp;<wbr>inputLen-i);<br>}<br><br><br>void CSecurity::MD5Final(<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>unsigned char digest[16],<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>MD5_CTX *context<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>)<br>{<br>unsigned char bits[8];<br>size_t index, padLen;<br><br><br>Encode (bits, context-&gt;count, 8);<br><br><br>index = (size_t)((context-&gt;count[0] &gt;&gt; 3) &amp; 0x3f);<br>padLen = (index &lt; 56) ? (56 - index) : (120 - index);<br>MD5Update (context, PADDING, padLen);<br><br><br>MD5Update (context, bits, 8);<br><br><br>Encode (digest, context-&gt;state, 16);<br><br><br>MD5_memset ((POINTER)context, 0, sizeof (*context));<br>}<br><br><br>void CSecurity::MD5Transform(<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> UINT4 state[4],<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> unsigned char block[64]<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> )<br>{<br>UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];<br><br>Decode (x, block, 64);<br><br><br>FF (a, b, c, d, x[ 0], S11, 0xd76aa478);<br>FF (d, a, b, c, x[ 1], S12, 0xe8c7b756);<br>FF (c, d, a, b, x[ 2], S13, 0x242070db);<br>FF (b, c, d, a, x[ 3], S14, 0xc1bdceee);<br>FF (a, b, c, d, x[ 4], S11, 0xf57c0faf);<br>FF (d, a, b, c, x[ 5], S12, 0x4787c62a);<br>FF (c, d, a, b, x[ 6], S13, 0xa8304613);<br>FF (b, c, d, a, x[ 7], S14, 0xfd469501);<br>FF (a, b, c, d, x[ 8], S11, 0x698098d8);<br>FF (d, a, b, c, x[ 9], S12, 0x8b44f7af);<br>FF (c, d, a, b, x[10], S13, 0xffff5bb1);<br>FF (b, c, d, a, x[11], S14, 0x895cd7be);<br>FF (a, b, c, d, x[12], S11, 0x6b901122);<br>FF (d, a, b, c, x[13], S12, 0xfd987193);<br>FF (c, d, a, b, x[14], S13, 0xa679438e);<br>FF (b, c, d, a, x[15], S14, 0x49b40821);<br><br><br>GG (a, b, c, d, x[ 1], S21, 0xf61e2562);<br>GG (d, a, b, c, x[ 6], S22, 0xc040b340);<br>GG (c, d, a, b, x[11], S23, 0x265e5a51);<br>GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa);<br>GG (a, b, c, d, x[ 5], S21, 0xd62f105d);<br>GG (d, a, b, c, x[10], S22, 0x2441453);<br>GG (c, d, a, b, x[15], S23, 0xd8a1e681);<br>GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8);<br>GG (a, b, c, d, x[ 9], S21, 0x21e1cde6);<br>GG (d, a, b, c, x[14], S22, 0xc33707d6);<br>GG (c, d, a, b, x[ 3], S23, 0xf4d50d87);<br>GG (b, c, d, a, x[ 8], S24, 0x455a14ed);<br>GG (a, b, c, d, x[13], S21, 0xa9e3e905);<br>GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8);<br>GG (c, d, a, b, x[ 7], S23, 0x676f02d9);<br>GG (b, c, d, a, x[12], S24, 0x8d2a4c8a);<br><br><br>HH (a, b, c, d, x[ 5], S31, 0xfffa3942);<br>HH (d, a, b, c, x[ 8], S32, 0x8771f681);<br>HH (c, d, a, b, x[11], S33, 0x6d9d6122);<br>HH (b, c, d, a, x[14], S34, 0xfde5380c);<br>HH (a, b, c, d, x[ 1], S31, 0xa4beea44);<br>HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9);<br>HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60);<br>HH (b, c, d, a, x[10], S34, 0xbebfbc70);<br>HH (a, b, c, d, x[13], S31, 0x289b7ec6);<br>HH (d, a, b, c, x[ 0], S32, 0xeaa127fa);<br>HH (c, d, a, b, x[ 3], S33, 0xd4ef3085);<br>HH (b, c, d, a, x[ 6], S34, 0x4881d05);<br>HH (a, b, c, d, x[ 9], S31, 0xd9d4d039);<br>HH (d, a, b, c, x[12], S32, 0xe6db99e5);<br>HH (c, d, a, b, x[15], S33, 0x1fa27cf8);<br>HH (b, c, d, a, x[ 2], S34, 0xc4ac5665);<br><br><br>II (a, b, c, d, x[ 0], S41, 0xf4292244);<br>II (d, a, b, c, x[ 7], S42, 0x432aff97);<br>II (c, d, a, b, x[14], S43, 0xab9423a7);<br>II (b, c, d, a, x[ 5], S44, 0xfc93a039);<br>II (a, b, c, d, x[12], S41, 0x655b59c3);<br>II (d, a, b, c, x[ 3], S42, 0x8f0ccc92);<br>II (c, d, a, b, x[10], S43, 0xffeff47d);<br>II (b, c, d, a, x[ 1], S44, 0x85845dd1);<br>II (a, b, c, d, x[ 8], S41, 0x6fa87e4f);<br>II (d, a, b, c, x[15], S42, 0xfe2ce6e0);<br>II (c, d, a, b, x[ 6], S43, 0xa3014314);<br>II (b, c, d, a, x[13], S44, 0x4e0811a1);<br>II (a, b, c, d, x[ 4], S41, 0xf7537e82);<br>II (d, a, b, c, x[11], S42, 0xbd3af235);<br>II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb);<br>II (b, c, d, a, x[ 9], S44, 0xeb86d391);<br><br>state[0] += a;<br>state[1] += b;<br>state[2] += c;<br>state[3] += d;<br><br><br>MD5_memset ((POINTER)x, 0, sizeof (x));<br>}<br><br><br>void CSecurity::Encode(<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> unsigned char *output,<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> UINT4 *input,<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> size_t len<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> )<br>{<br>size_t i, j;<br><br>for (i = 0, j = 0; j &lt; len; i++, j += 4) {<br>&nbsp;<wbr>&nbsp;<wbr>output[j] = (unsigned char)(input &amp; 0xff);<br>&nbsp;<wbr>&nbsp;<wbr>output[j+1] = (unsigned char)((input &gt;&gt; 8) &amp; 0xff);<br>&nbsp;<wbr>&nbsp;<wbr>output[j+2] = (unsigned char)((input &gt;&gt; 16) &amp; 0xff);<br>&nbsp;<wbr>&nbsp;<wbr>output[j+3] = (unsigned char)((input &gt;&gt; 24) &amp; 0xff);<br>}<br>}<br><br><br>void CSecurity::Decode(<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> UINT4 *output,<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> unsigned char *input,<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> size_t len<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> )<br>{<br>size_t i, j;<br><br>for (i = 0, j = 0; j &lt; len; i++, j += 4)<br>&nbsp;<wbr>&nbsp;<wbr>output = ((UINT4)input[j]) | (((UINT4)input[j+1]) &lt;&lt; 8) |<br>&nbsp;<wbr>&nbsp;<wbr>(((UINT4)input[j+2]) &lt;&lt; 16) | (((UINT4)input[j+3]) &lt;&lt; 24);<br>}<br><br><br>void CSecurity::MD5_memcpy(<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>POINTER output,<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>POINTER input,<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>size_t len<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>)<br>{<br>size_t i;<br><br>for (i = 0; i &lt; len; i++)<br>&nbsp;<wbr>&nbsp;<wbr>output = input;<br>}<br><br><br>void CSecurity::MD5_memset(<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>POINTER output,<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>int value,<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>size_t len<br>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>)<br>{<br>size_t i;<br><br>for (i = 0; i &lt; len; i++)<br>&nbsp;<wbr>&nbsp;<wbr>((char *)output) = (char)value;<br>}<br><br><br>void CSecurity::MD5( const char *string ,char *lpMD5StringBuffer )<br>{<br>MD5_CTX context;<br>unsigned char digest[16];<br><br>static char output[33]={""};<br>size_t len = strlen (string);<br>int i;<br><br>MD5Init( &amp;context);<br>MD5Update( &amp;context, (unsigned char*)string, len );<br>MD5Final( digest, &amp;context );<br><br>for (i = 0; i &lt; 16; i++)<br>{<br>&nbsp;<wbr>&nbsp;<wbr>sprintf(&amp;(lpMD5StringBuffer[2*i]),"%02x",(unsigned char)digest);<br>&nbsp;<wbr>&nbsp;<wbr>sprintf(&amp;(lpMD5StringBuffer[2*i+1]),"%02x",(unsigned char)(digest&lt;&lt;4));<br>}<br>for(i=0;i&lt;32;i++)<br>{<br>&nbsp;<wbr>&nbsp;<wbr>output=lpMD5StringBuffer;<br>}<br>}<br><br><br>void CSecurity::StringAddOne( char * orstring )<br>{<br>size_t len;<br>size_t i,n;<br><br>len = strlen(orstring);<br>n = len - 1;<br>for(i = n; i &gt;= 0; i--)<br>{<br>&nbsp;<wbr>&nbsp;<wbr>if(orstring=='9')<br>&nbsp;<wbr>&nbsp;<wbr>{<br>&nbsp;<wbr> &nbsp;<wbr>orstring = 'A';<br>&nbsp;<wbr> &nbsp;<wbr>break;<br>&nbsp;<wbr>&nbsp;<wbr>}<br>&nbsp;<wbr>&nbsp;<wbr>else if(orstring=='Z')<br>&nbsp;<wbr>&nbsp;<wbr>{<br>&nbsp;<wbr> &nbsp;<wbr>orstring='a';<br>&nbsp;<wbr> &nbsp;<wbr>break;<br>&nbsp;<wbr>&nbsp;<wbr>}<br>&nbsp;<wbr>&nbsp;<wbr>else if(orstring=='z')<br>&nbsp;<wbr>&nbsp;<wbr>{<br>&nbsp;<wbr> &nbsp;<wbr>orstring='0';<br>&nbsp;<wbr> &nbsp;<wbr>continue;<br>&nbsp;<wbr>&nbsp;<wbr>}<br>&nbsp;<wbr>&nbsp;<wbr>else<br>&nbsp;<wbr> &nbsp;<wbr>orstring += 1;<br>&nbsp;<wbr>&nbsp;<wbr>break;<br>}<br>}<br>=============================stdafx.h=====================================<br>// stdafx.h : 标准系统包含文件的包含文件，<br>// 或是常用但不常更改的项目特定的包含文件<br>//<br><br>#pragma once<br><br>//导出<br>#define SECURITY_EXPORTS<br><br>#define WIN32_LEAN_AND_MEAN&nbsp;<wbr>&nbsp;<wbr>// 从 Windows 头中排除极少使用的资料<br>// Windows 头文件:<br>#include<br><br>// TODO: 在此处引用程序要求的附加头文件<br>============================stdafx.cpp========================================<br><br>// stdafx.cpp : 只包括标准包含文件的源文件<br>// Security.pch 将成为预编译头<br>// stdafx.obj 将包含预编译类型信息<br><br>#include "stdafx.h"<br><br>// TODO: 在 STDAFX.H 中<br>//引用任何所需的附加头文件，而不是在此文件中引用<br>=====================================================================<br><br>以上程序使用命令：@cl /GD /LD Security.cpp stdafx.cpp 编译即可<br><br><br></p>
<img src ="http://www.cppblog.com/prayer/aggbug/129209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-10-09 16:43 <a href="http://www.cppblog.com/prayer/archive/2010/10/09/129209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>winmd5</title><link>http://www.cppblog.com/prayer/archive/2010/10/09/129206.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Sat, 09 Oct 2010 08:34:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/10/09/129206.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/129206.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/10/09/129206.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/129206.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/129206.html</trackback:ping><description><![CDATA[<p>MD5的全称是Message-Digest Algorithm 5，在90年代初由MIT的计算机科学实验室和RSA Data Security Inc发明，经MD2、MD3和MD4发展而来。 MD5将任意长度的&#8220;字节串&#8221;变换成一个128bit的大整数，并且它是一个不可逆的字符串变换算法，换句话说就是，即使你看到源程序和算法描述，也无法将一个MD5的值变换回原始的字符串，从数学原理上说，是因为原始的字符串有无穷多个，这有点象不存在反函数的数学函数。</p>
<br>简介　　WinMD5 MD5简介
<div class=spctrl></div>
　　Message-Digest泛指字节串(Message)的Hash变换，就是把一个任意长度的字节串变换成一定长的大整数。请注意我使用了&#8220;字节串&#8221;而不是&#8220;字符串&#8221;这个词，是因为这种变换只与字节的值有关，与字符集或编码方式无关。
<div class=bpctrl></div>
<h2 class="">
<div class="text_edit editable-title" data-edit-id="1058848:2"><a class=nslog:1019 onclick='bk.view.editLemma("/edit/",1058848,2);return false' href="http://baike.baidu.com/view/1058848.htm#">编辑本段</a></div>
<a name=2></a>具体步骤</h2>
<h3><a name=2_1></a>补位</h3>
　　MD5算法先对输入的数据进行补位，使得数据位长度LEN对512求余的结果是448。即数据扩展至K*512+448位。即K*64+56个字节，K为整数。
<div class=spctrl></div>
　　具体补位操作：补一个1，然后补0至满足上述要求。
<h3><a name=2_2></a>补数据长度</h3>
　　用一个64位的数字表示数据的原始长度B，把B用两个32位数表示。这时，数据就被填补成长度为512位的倍数。
<h3><a name=2_3></a>初始化MD5参数</h3>
　　四个32位整数 (A,B,C,D) 用来计算信息摘要，初始化使用的是十六进制表示的数字
<div class=spctrl></div>
　　A=0X01234567
<div class=spctrl></div>
　　B=0X89abcdef
<div class=spctrl></div>
　　C=0Xfedcba98
<div class=spctrl></div>
　　D=0X76543210
<h3><a name=2_4></a>处理位操作函数</h3>
　　X，Y，Z为32位整数。
<div class=spctrl></div>
　　F(X,Y,Z) = X&amp;Y|NOT(X)&amp;Z
<div class=spctrl></div>
　　G(X,Y,Z) = X&amp;Z|Y?(Z)
<div class=spctrl></div>
　　H(X,Y,Z) = X xor Y xor Z
<div class=spctrl></div>
　　I(X,Y,Z) = Y xor (X|not(Z))
<h3><a name=2_5></a>主要变换过程</h3>
　　使用常数组T[1 ... 64]， T为32位整数用16进制表示，数据用16个32位的整数数组M[]表示。
<div class=spctrl></div>
　　具体过程如下：
<div class=spctrl></div>
　　/* 处理数据原文 */
<div class=spctrl></div>
　　For i = 0 to N/16-1 do
<div class=spctrl></div>
　　/*每一次，把数据原文存放在16个元素的数组X中. */
<div class=spctrl></div>
　　For j = 0 to 15 do
<div class=spctrl></div>
　　Set X[j] to M[i*16+j].
<div class=spctrl></div>
　　end /结束对J的循环
<div class=spctrl></div>
　　/* Save A as AA, B as BB, C as CC, and D as DD.*/
<div class=spctrl></div>
　　AA = A
<div class=spctrl></div>
　　BB = B
<div class=spctrl></div>
　　CC = C
<div class=spctrl></div>
　　DD = D
<div class=spctrl></div>
　　/* 第1轮*/
<div class=spctrl></div>
　　/* 以 [abcd k s i]表示如下操作 a = b + ((a + F(b,c,d) + X[k] + T) &lt;&lt;&lt; s). */
<div class=spctrl></div>
　　/* Do the following 16 operations. */
<div class=spctrl></div>
　　[ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 322 4]
<div class=spctrl></div>
　　[ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 722 8]
<div class=spctrl></div>
　　[ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA11 22 12]
<div class=spctrl></div>
　　[ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
<div class=spctrl></div>
　　/* 第2轮* */
<div class=spctrl></div>
　　/* 以 [abcd k s i]表示如下操作 a = b + ((a + G(b,c,d) + X[k] + T) &lt;&lt;&lt; s). */
<div class=spctrl></div>
　　/* Do the following 16 operations. */
<div class=spctrl></div>
　　[ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA0 20 20]
<div class=spctrl></div>
　　[ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
<div class=spctrl></div>
　　[ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA8 20 28]
<div class=spctrl></div>
　　[ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA12 20 32]
<div class=spctrl></div>
　　/* 第3轮*/
<div class=spctrl></div>
　　/* 以 [abcd k s i]表示如下操作 a = b + ((a + H(b,c,d) + X[k] + T) &lt;&lt;&lt; s). */
<div class=spctrl></div>
　　/* Do the following 16 operations. */
<div class=spctrl></div>
　　[ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
<div class=spctrl></div>
　　[ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA10 23 40]
<div class=spctrl></div>
　　[ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
<div class=spctrl></div>
　　[ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]
<div class=spctrl></div>
　　/* 第4轮*/
<div class=spctrl></div>
　　/* 以 [abcd k s i]表示如下操作 a = b + ((a + I(b,c,d) + X[k] + T) &lt;&lt;&lt; s). */
<div class=spctrl></div>
　　/* Do the following 16 operations. */
<div class=spctrl></div>
　　[ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
<div class=spctrl></div>
　　[ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
<div class=spctrl></div>
　　[ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
<div class=spctrl></div>
　　[ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]
<h3><a name=2_6></a>输出结果</h3>
　　/* 然后进行如下操作，输出结果 */
<div class=spctrl></div>
　　A = A + AA
<div class=spctrl></div>
　　B = B + BB
<div class=spctrl></div>
　　C = C + CC
<div class=spctrl></div>
　　D = D + DD
<div class=spctrl></div>
　　end /* 结束对I的循环*/
<div class=spctrl></div>
　　输出结果
<div class=bpctrl></div>
<h2 class="">
<div class="text_edit editable-title" data-edit-id="1058848:3"><a class=nslog:1019 onclick='bk.view.editLemma("/edit/",1058848,3);return false' href="http://baike.baidu.com/view/1058848.htm#">编辑本段</a></div>
<a name=3></a>应用</h2>
<h3><a name=3_1></a>数字签名</h3>
　　MD5的典型应用是对一段Message(字节串)产生fingerprint(指纹)，以防止被&#8220;篡改&#8221;。举个例子，你将一段话写在一个叫 readme.txt文件中，并对这个readme.txt产生一个MD5的值并记录在案，然后你可以传播这个文件给别人，别人如果修改了文件中的任何内容，你对这个文件重新计算MD5时就会发现。如果再有一个第三方的认证机构，用MD5还可以防止文件作者的&#8220;抵赖&#8221;，这就是所谓的数字签名应用。
<h3><a name=3_2></a>加密和解密</h3>
　　MD5还广泛用于加密和解密技术上，在很多操作系统中，用户的密码是以MD5值（或类似的其它算法）的方式保存的， 用户Login的时候，系统是把用户输入的密码计算成MD5值，然后再去和系统中保存的MD5值进行比较，而系统并不&#8220;知道&#8221;用户的密码是什么。
<div class=spctrl></div>
　　一些黑客破获这种密码的方法是一种被称为&#8220;跑字典&#8221;的方法。有两种方法得到字典，一种是日常搜集的用做密码的字符串表，另一种是用排列组合方法生成的，先用MD5程序计算出这些字典项的MD5值，然后再用目标的MD5值在这个字典中检索。
<div class=spctrl></div>
　　即使假设密码的最大长度为8，同时密码只能是字母和数字，共26+26+10=62个字符，排列组合出的字典的项数则是P(62,1)+P (62,2)&#8230;.+P(62,8)，那也已经是一个很天文的数字了，存储这个字典就需要TB级的磁盘组，而且这种方法还有一个前提，就是能获得目标账户的密码MD5值的情况下才可以。
<div class=spctrl></div>
　　在很多电子商务和社区应用中，管理用户的Account是一种最常用的基本功能，尽管很多 Application Server提供了这些基本组件，但很多应用开发者为了管理的更大的灵活性还是喜欢采用关系数据库来管理用户，懒惰的做法是用户的密码往往使用明文或简单的变换后直接保存在数据库中，因此这些用户的密码对软件开发者或系统管理员来说可以说毫无保密可言。
<img src ="http://www.cppblog.com/prayer/aggbug/129206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-10-09 16:34 <a href="http://www.cppblog.com/prayer/archive/2010/10/09/129206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>说说异或运算^和他的一个常用作用</title><link>http://www.cppblog.com/prayer/archive/2009/12/23/103789.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 23 Dec 2009 06:40:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/23/103789.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/103789.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/23/103789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/103789.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/103789.html</trackback:ping><description><![CDATA[<p>举例</p>
<p>假如有两个值A和B,将A和B异或运算的步骤如下:<br>1.先将B取反,再和A进行"与"运算,得到B'<br>2.再将A取反,后和B进行"与"运算,得到A'<br>3.最后将B' 和 A' 进行"或"运算,就是最终的结果了.</p>
<p>四字:同假异真</p>
<p>真^假=真<br>假^真=真<br>假^假=假<br>真^真=假</p>
<p>异或的运算方法是一个二进制运算：<br>1^1=0<br>0^0=0<br>1^0=1<br>0^1=1<br><br>两者相等为0,不等为1.<br><br><strong>这样我们发现交换两个整数的值时可以不用第三个参数。<br>如a=11,b=9.以下是二进制<br>a=a^b=1011^1001=0010;<br>b=b^a=1001^0010=1011;<br>a=a^b=0010^1011=1001;<br>这样一来a=9,b=13了。</strong><br><br><br>举一个运用， 按一个按钮交换两个mc的位置可以这样。<br><br>mybt.onPress=function()<br>{<br>&nbsp;&nbsp; mc1._x=mc1._x^mc2._x;<br>&nbsp;&nbsp; mc2._x=mc2._x^mc1._x;<br>&nbsp;&nbsp; mc1._x=mc1._x^mc2._x;<br>//<br>&nbsp;&nbsp; mc1._y=mc1._y^mc2._y; <br>&nbsp;&nbsp; mc2._y=mc2._y^mc1._y;<br>&nbsp;&nbsp; mc1._y=mc1._y^mc2._y;<br>}<br><br>这样就可以不通过监时变量来传递了。<br><br><strong>最后要声明：只能用于整数。</strong></p>
<img src ="http://www.cppblog.com/prayer/aggbug/103789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-23 14:40 <a href="http://www.cppblog.com/prayer/archive/2009/12/23/103789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MD5校验码是干吗用的</title><link>http://www.cppblog.com/prayer/archive/2009/12/07/102716.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 07 Dec 2009 06:13:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/12/07/102716.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/102716.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/12/07/102716.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/102716.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/102716.html</trackback:ping><description><![CDATA[MD5究竟是什么 <br><br><br><br>MD5是message-digest algorithm 5（信息-摘要算法）的缩写，被广泛用于加密和解密技术上，它可以说是文件的&#8220;数字指纹&#8221;。任何一个文件，无论是可执行程序、图像文件、临时文件或者其他任何类型的文件，也不管它体积多大，都有且只有一个独一无二的MD5信息值，并且如果这个文件被修改过，它的MD5值也将随之改变。因此，我们可以通过对比同一文件的MD5值，来校验这个文件是否被&#8220;篡改&#8221;过。 <br><br>MD5到底有什么用 <br><br>当我们下载了如图1所示之类的文件后，如果想知道下载的这个文件和网站的原始文件是否一模一样，就可以给自己下载的文件做个MD5校验。如果得到的MD5值和网站公布的相同，可确认所下载的文件是完整的。如有不同，说明你下载的文件是不完整的：要么就是在网络下载的过程中出现错误，要么就是此文件已被别人修改。为防止他人更改该文件时放入病毒，最好不要使用。 <br><br>当我们用E-mail给好友发送文件时，可以将要发送文件的MD5值告诉对方，这样好友收到该文件以后即可对其进行校验，来确定文件是否安全。 <br><br>再比如：在刚安装好系统后可以给系统文件做个MD5校验，过了一段时间后如果你怀疑某些文件被人换掉，那么就可以给那些被怀疑的文件做个MD5校验，若和从前得到的MD5校验码不一样，那么就可以肯定是有问题的。 <br><br>如何读取和校验MD5信息 <br><br>了解了MD5信息以后，下面我们来看一看如何读取并校验文件的MD5信息。这需要一款检测MD5值的专门小软件，这是一款绿色软件，解压缩后运行其中的MD5.EXE文件即可。软件的使用非常简单，点击&#8220;Open&#8221;按钮，选择并打开想要进行校验的文件，稍等片刻后，在MD5一栏中便会显示该文件的MD5值，将该数值同网站公布的数值进行比较即可确定文件是否完整了。点击&#8220;Save&#8221;按钮可以将读取的MD5保存为一个.MD5文件，用记事本打开该文件，可以将MD5值复制出来。 <br><br>为了验证文件修改后的MD5值是否发生变化，笔者用一个文本文件进行了测试。如图2所示，第一个文件为进行测试的原始文件，第二个文件为进行修改后的文件(不过只是在打开原始文件的基础上加入了一个空格)，第三个文件为原始文件的复制文件。从图中可以看出，尽管改动不大，但是两个文件的MD5值却大相径庭，而复制得到的文件则不会发生变化。 
<img src ="http://www.cppblog.com/prayer/aggbug/102716.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-12-07 14:13 <a href="http://www.cppblog.com/prayer/archive/2009/12/07/102716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>异或运算^和他的一个常用作用</title><link>http://www.cppblog.com/prayer/archive/2009/10/12/98373.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 12 Oct 2009 06:09:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2009/10/12/98373.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/98373.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2009/10/12/98373.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/98373.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/98373.html</trackback:ping><description><![CDATA[<div class=cnt id=blog_text>
<p>&#160;</p>
<p><font face=宋体>发现一个新知识，介绍给大家：</font></p>
<p><font face=宋体>二进制异或运算：</font><font face=宋体><strong>两者相等为0,不等为1.</strong><br><br>这样我们发现交换两个整数的值时可以不用第三个参数。<br>如a=11,b=9.以下是二进制<br>a=a^b=1011^1001=0010;<br>b=b^a=1001^0010=1011;<br>a=a^b=0010^1011=1001;<br>这样一来a=9,b=11了。<br><br><br>举一个运用， 按一个按钮交换两个mc的位置可以这样。vb<br><br>mybt.onPress=function()<br>{<br>mc1._x=mc1._x^mc2._x;<br>mc2._x=mc2._x^mc1._x;<br>mc1._x=mc1._x^mc2._x;<br>//<br>mc1._y=mc1._y^mc2._y; <br>mc2._y=mc2._y^mc1._y;<br>mc1._y=mc1._y^mc2._y;<br>}<br><br>这样就可以不通过监时变量来传递了。</font></p>
</div>
<br>
<img src ="http://www.cppblog.com/prayer/aggbug/98373.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2009-10-12 14:09 <a href="http://www.cppblog.com/prayer/archive/2009/10/12/98373.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>