隨筆-9  評論-1  文章-0  trackbacks-0
          ??1?/************************************************
          ??2?MD5?算法的Java?Bean
          ??3?@author:Topcat?Tuppin
          ??4?Last?Modified:10,Mar,2001
          ??5?*************************************************/
          ??6?import?java.lang.reflect.*;
          ??7?/*************************************************
          ??8?md5?類實現了RSA?Data?Security,?Inc.在提交給IETF
          ??9?的RFC1321中的MD5?message-digest?算法。
          ?10?*************************************************/
          ?11?
          ?12?public?class?MD5?{
          ?13?????/*?下面這些S11-S44實際上是一個4*4的矩陣,在原始的C實現中是用#define?實現的,
          ?14?????這里把它們實現成為static?final是表示了只讀,切能在同一個進程空間內的多個
          ?15?????Instance間共享*/
          ?16?????????static?final?int?S11?=?7;
          ?17?????????static?final?int?S12?=?12;
          ?18?????????static?final?int?S13?=?17;
          ?19?????????static?final?int?S14?=?22;
          ?20?
          ?21?????????static?final?int?S21?=?5;
          ?22?????????static?final?int?S22?=?9;
          ?23?????????static?final?int?S23?=?14;
          ?24?????????static?final?int?S24?=?20;
          ?25?
          ?26?????????static?final?int?S31?=?4;
          ?27?????????static?final?int?S32?=?11;
          ?28?????????static?final?int?S33?=?16;
          ?29?????????static?final?int?S34?=?23;
          ?30?
          ?31?????????static?final?int?S41?=?6;
          ?32?????????static?final?int?S42?=?10;
          ?33?????????static?final?int?S43?=?15;
          ?34?????????static?final?int?S44?=?21;
          ?35?
          ?36?????????static?final?byte[]?PADDING?=?{?-128,?0,?0,?0,?0,?0,?0,?0,?0,
          ?37?????????0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,
          ?38?????????0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,
          ?39?????????0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0,?0?};
          ?40?????????/*?下面的三個成員是MD5計算過程中用到的3個核心數據,在原始的C實現中
          ?41????????????被定義到MD5_CTX結構中
          ?42?????????
          ?43??????????*/
          ?44?????????private?long[]?state?=?new?long[4];??//?state?(ABCD)
          ?45?????????private?long[]?count?=?new?long[2];??//?number?of?bits,?modulo?2^64?(lsb?first)
          ?46?????????private?byte[]?buffer?=?new?byte[64];?//?input?buffer
          ?47?????????
          ?48?????/*?digestHexStr是MD5的唯一一個公共成員,是最新一次計算結果的
          ?49????? ?16進制ASCII表示.
          ?50?????*/
          ?51?????????public?String?digestHexStr;
          ?52?????????
          ?53?????????/*?digest,是最新一次計算結果的2進制內部表示,表示128bit的MD5值.
          ?54?????*/
          ?55?????????private?byte[]?digest?=?new?byte[16];
          ?56?????????
          ?57?????/*
          ?58???????getMD5ofStr是類MD5最主要的公共方法,入口參數是你想要進行MD5變換的字符串
          ?59???????返回的是變換完的結果,這個結果是從公共成員digestHexStr取得的.
          ?60?????*/
          ?61?????????public?String?getMD5ofStr(String?inbuf)?{
          ?62?????????????????md5Init();
          ?63?????????????????md5Update(inbuf.getBytes(),?inbuf.length());
          ?64?????????????????md5Final();
          ?65?????????????????digestHexStr?=?"";
          ?66?????????????????for?(int?i?=?0;?i?<?16;?i++)?{
          ?67?????????????????????????digestHexStr?+=?byteHEX(digest[i]);
          ?68?????????????????}
          ?69?????????????????return?digestHexStr;
          ?70?
          ?71?????????}
          ?72?????????//?這是MD5這個類的標準構造函數,JavaBean要求有一個public的并且沒有參數的構造函數
          ?73?????????public?MD5()?{
          ?74?????????????????md5Init();
          ?75?
          ?76?????????????????return;
          ?77?????????}
          ?78?????????
          ?79?
          ?80?
          ?81?????????/*?md5Init是一個初始化函數,初始化核心變量,裝入標準的幻數?*/
          ?82?????????private?void?md5Init()?{
          ?83?????????????????count[0]?=?0L;
          ?84?????????????????count[1]?=?0L;
          ?85?????????????????///*?Load?magic?initialization?constants.
          ?86?
          ?87?????????????????state[0]?=?0x67452301L;
          ?88?????????????????state[1]?=?0xefcdab89L;
          ?89?????????????????state[2]?=?0x98badcfeL;
          ?90?????????????????state[3]?=?0x10325476L;
          ?91?
          ?92?????????????????return;
          ?93?????????}
          ?94?????????/*?F,?G,?H?,I?是4個基本的MD5函數,在原始的MD5的C實現中,由于它們是
          ?95?????????簡單的位運算,可能出于效率的考慮把它們實現成了宏,在java中,我們把它們
          ?96??????  實現成了private方法,名字保持了原來C中的。?*/
          ?97?
          ?98?????????private?long?F(long?x,?long?y,?long?z)?{
          ?99?????????????????return?(x?&?y)?|?((~x)?&?z);
          100?
          101?????????}
          102?????????private?long?G(long?x,?long?y,?long?z)?{
          103?????????????????return?(x?&?z)?|?(y?&?(~z));
          104?
          105?????????}
          106?????????private?long?H(long?x,?long?y,?long?z)?{
          107?????????????????return?x?^?y?^?z;
          108?????????}
          109?
          110?????????private?long?I(long?x,?long?y,?long?z)?{
          111?????????????????return?y?^?(x?|?(~z));
          112?????????}
          113?????????
          114????????/*?
          115???????????FF,GG,HH和II將調用F,G,H,I進行近一步變換
          116???????????FF,?GG,?HH,?and?II?transformations?for?rounds?1,?2,?3,?and?4.
          117???????????Rotation?is?separate?from?addition?to?prevent?recomputation.
          118????????*/??
          119?
          120?????????private?long?FF(long?a,?long?b,?long?c,?long?d,?long?x,?long?s,
          121?????????????????long?ac)?{
          122?????????????????a?+=?F?(b,?c,?d)?+?x?+?ac;
          123?????????????????a?=?((int)?a?<<?s)?|?((int)?a?>>>?(32?-?s));
          124?????????????????a?+=?b;
          125?????????????????return?a;
          126?????????}
          127?
          128?????????private?long?GG(long?a,?long?b,?long?c,?long?d,?long?x,?long?s,
          129?????????????????long?ac)?{
          130?????????????????a?+=?G?(b,?c,?d)?+?x?+?ac;
          131?????????????????a?=?((int)?a?<<?s)?|?((int)?a?>>>?(32?-?s));
          132?????????????????a?+=?b;
          133?????????????????return?a;
          134?????????}
          135?????????private?long?HH(long?a,?long?b,?long?c,?long?d,?long?x,?long?s,
          136?????????????????long?ac)?{
          137?????????????????a?+=?H?(b,?c,?d)?+?x?+?ac;
          138?????????????????a?=?((int)?a?<<?s)?|?((int)?a?>>>?(32?-?s));
          139?????????????????a?+=?b;
          140?????????????????return?a;
          141?????????}
          142?????????private?long?II(long?a,?long?b,?long?c,?long?d,?long?x,?long?s,
          143?????????????????long?ac)?{
          144?????????????????a?+=?I?(b,?c,?d)?+?x?+?ac;
          145?????????????????a?=?((int)?a?<<?s)?|?((int)?a?>>>?(32?-?s));
          146?????????????????a?+=?b;
          147?????????????????return?a;
          148?????????}
          149?????????/*
          150??????????md5Update是MD5的主計算過程,inbuf是要變換的字節串,inputlen是長度,這個
          151??????????函數由getMD5ofStr調用,調用之前需要調用md5init,因此把它設計成private的
          152?????????*/
          153?????????private?void?md5Update(byte[]?inbuf,?int?inputLen)?{
          154?
          155?????????????????int?i,?index,?partLen;
          156?????????????????byte[]?block?=?new?byte[64];
          157?????????????????index?=?(int)(count[0]?>>>?3)?&?0x3F;
          158?????????????????//?/*?Update?number?of?bits?*/
          159?????????????????if?((count[0]?+=?(inputLen?<<?3))?<?(inputLen?<<?3))
          160?????????????????????????count[1]++;
          161?????????????????count[1]?+=?(inputLen?>>>?29);
          162?
          163?????????????????partLen?=?64?-?index;
          164?
          165?????????????????//?Transform?as?many?times?as?possible.
          166?????????????????if?(inputLen?>=?partLen)?{
          167?????????????????????????md5Memcpy(buffer,?inbuf,?index,?0,?partLen);
          168?????????????????????????md5Transform(buffer);
          169?
          170?????????????????????????for?(i?=?partLen;?i?+?63?<?inputLen;?i?+=?64)?{
          171?
          172?????????????????????????????????md5Memcpy(block,?inbuf,?0,?i,?64);
          173?????????????????????????????????md5Transform?(block);
          174?????????????????????????}
          175?????????????????????????index?=?0;
          176?
          177?????????????????}?else
          178?
          179?????????????????????????i?=?0;
          180?
          181?????????????????///*?Buffer?remaining?input?*/
          182?????????????????md5Memcpy(buffer,?inbuf,?index,?i,?inputLen?-?i);
          183?
          184?????????}
          185?????????
          186?????????/*
          187???????????md5Final整理和填寫輸出結果
          188?????????*/
          189?????????private?void?md5Final?()?{
          190?????????????????byte[]?bits?=?new?byte[8];
          191?????????????????int?index,?padLen;
          192?
          193?????????????????///*?Save?number?of?bits?*/
          194?????????????????Encode?(bits,?count,?8);
          195?
          196?????????????????///*?Pad?out?to?56?mod?64.
          197?????????????????index?=?(int)(count[0]?>>>?3)?&?0x3f;
          198?????????????????padLen?=?(index?<?56)???(56?-?index)?:?(120?-?index);
          199?????????????????md5Update?(PADDING,?padLen);
          200?
          201?????????????????///*?Append?length?(before?padding)?*/
          202?????????????????md5Update(bits,?8);
          203?
          204?????????????????///*?Store?state?in?digest?*/
          205?????????????????Encode?(digest,?state,?16);
          206?
          207?????????}
          208??????????
          209?????????/*?md5Memcpy是一個內部使用的byte數組的塊拷貝函數,從input的inpos開始把len長度的
          210?     ?字節拷貝到output的outpos位置開始?
          211?????????*/
          212?
          213?????????private?void?md5Memcpy?(byte[]?output,?byte[]?input,
          214?????????????????int?outpos,?int?inpos,?int?len)
          215?????????{
          216?????????????????int?i;
          217?
          218?????????????????for?(i?=?0;?i?<?len;?i++)
          219?????????????????????????output[outpos?+?i]?=?input[inpos?+?i];
          220?????????}
          221?????????
          222?????????/*
          223????????????md5Transform是MD5核心變換程序,有md5Update調用,block是分塊的原始字節
          224?????????*/
          225?????????private?void?md5Transform?(byte?block[])?{
          226?????????????????long?a?=?state[0],?b?=?state[1],?c?=?state[2],?d?=?state[3];
          227?????????????????long[]?x?=?new?long[16];
          228?
          229?????????????????Decode?(x,?block,?64);
          230?
          231?????????????????/*?Round?1?*/
          232?????????????????a?=?FF?(a,?b,?c,?d,?x[0],?S11,?0xd76aa478L);?/*?1?*/
          233?????????????????d?=?FF?(d,?a,?b,?c,?x[1],?S12,?0xe8c7b756L);?/*?2?*/
          234?????????????????c?=?FF?(c,?d,?a,?b,?x[2],?S13,?0x242070dbL);?/*?3?*/
          235?????????????????b?=?FF?(b,?c,?d,?a,?x[3],?S14,?0xc1bdceeeL);?/*?4?*/
          236?????????????????a?=?FF?(a,?b,?c,?d,?x[4],?S11,?0xf57c0fafL);?/*?5?*/
          237?????????????????d?=?FF?(d,?a,?b,?c,?x[5],?S12,?0x4787c62aL);?/*?6?*/
          238?????????????????c?=?FF?(c,?d,?a,?b,?x[6],?S13,?0xa8304613L);?/*?7?*/
          239?????????????????b?=?FF?(b,?c,?d,?a,?x[7],?S14,?0xfd469501L);?/*?8?*/
          240?????????????????a?=?FF?(a,?b,?c,?d,?x[8],?S11,?0x698098d8L);?/*?9?*/
          241?????????????????d?=?FF?(d,?a,?b,?c,?x[9],?S12,?0x8b44f7afL);?/*?10?*/
          242?????????????????c?=?FF?(c,?d,?a,?b,?x[10],?S13,?0xffff5bb1L);?/*?11?*/
          243?????????????????b?=?FF?(b,?c,?d,?a,?x[11],?S14,?0x895cd7beL);?/*?12?*/
          244?????????????????a?=?FF?(a,?b,?c,?d,?x[12],?S11,?0x6b901122L);?/*?13?*/
          245?????????????????d?=?FF?(d,?a,?b,?c,?x[13],?S12,?0xfd987193L);?/*?14?*/
          246?????????????????c?=?FF?(c,?d,?a,?b,?x[14],?S13,?0xa679438eL);?/*?15?*/
          247?????????????????b?=?FF?(b,?c,?d,?a,?x[15],?S14,?0x49b40821L);?/*?16?*/
          248?
          249?????????????????/*?Round?2?*/
          250?????????????????a?=?GG?(a,?b,?c,?d,?x[1],?S21,?0xf61e2562L);?/*?17?*/
          251?????????????????d?=?GG?(d,?a,?b,?c,?x[6],?S22,?0xc040b340L);?/*?18?*/
          252?????????????????c?=?GG?(c,?d,?a,?b,?x[11],?S23,?0x265e5a51L);?/*?19?*/
          253?????????????????b?=?GG?(b,?c,?d,?a,?x[0],?S24,?0xe9b6c7aaL);?/*?20?*/
          254?????????????????a?=?GG?(a,?b,?c,?d,?x[5],?S21,?0xd62f105dL);?/*?21?*/
          255?????????????????d?=?GG?(d,?a,?b,?c,?x[10],?S22,?0x2441453L);?/*?22?*/
          256?????????????????c?=?GG?(c,?d,?a,?b,?x[15],?S23,?0xd8a1e681L);?/*?23?*/
          257?????????????????b?=?GG?(b,?c,?d,?a,?x[4],?S24,?0xe7d3fbc8L);?/*?24?*/
          258?????????????????a?=?GG?(a,?b,?c,?d,?x[9],?S21,?0x21e1cde6L);?/*?25?*/
          259?????????????????d?=?GG?(d,?a,?b,?c,?x[14],?S22,?0xc33707d6L);?/*?26?*/
          260?????????????????c?=?GG?(c,?d,?a,?b,?x[3],?S23,?0xf4d50d87L);?/*?27?*/
          261?????????????????b?=?GG?(b,?c,?d,?a,?x[8],?S24,?0x455a14edL);?/*?28?*/
          262?????????????????a?=?GG?(a,?b,?c,?d,?x[13],?S21,?0xa9e3e905L);?/*?29?*/
          263?????????????????d?=?GG?(d,?a,?b,?c,?x[2],?S22,?0xfcefa3f8L);?/*?30?*/
          264?????????????????c?=?GG?(c,?d,?a,?b,?x[7],?S23,?0x676f02d9L);?/*?31?*/
          265?????????????????b?=?GG?(b,?c,?d,?a,?x[12],?S24,?0x8d2a4c8aL);?/*?32?*/
          266?
          267?????????????????/*?Round?3?*/
          268?????????????????a?=?HH?(a,?b,?c,?d,?x[5],?S31,?0xfffa3942L);?/*?33?*/
          269?????????????????d?=?HH?(d,?a,?b,?c,?x[8],?S32,?0x8771f681L);?/*?34?*/
          270?????????????????c?=?HH?(c,?d,?a,?b,?x[11],?S33,?0x6d9d6122L);?/*?35?*/
          271?????????????????b?=?HH?(b,?c,?d,?a,?x[14],?S34,?0xfde5380cL);?/*?36?*/
          272?????????????????a?=?HH?(a,?b,?c,?d,?x[1],?S31,?0xa4beea44L);?/*?37?*/
          273?????????????????d?=?HH?(d,?a,?b,?c,?x[4],?S32,?0x4bdecfa9L);?/*?38?*/
          274?????????????????c?=?HH?(c,?d,?a,?b,?x[7],?S33,?0xf6bb4b60L);?/*?39?*/
          275?????????????????b?=?HH?(b,?c,?d,?a,?x[10],?S34,?0xbebfbc70L);?/*?40?*/
          276?????????????????a?=?HH?(a,?b,?c,?d,?x[13],?S31,?0x289b7ec6L);?/*?41?*/
          277?????????????????d?=?HH?(d,?a,?b,?c,?x[0],?S32,?0xeaa127faL);?/*?42?*/
          278?????????????????c?=?HH?(c,?d,?a,?b,?x[3],?S33,?0xd4ef3085L);?/*?43?*/
          279?????????????????b?=?HH?(b,?c,?d,?a,?x[6],?S34,?0x4881d05L);?/*?44?*/
          280?????????????????a?=?HH?(a,?b,?c,?d,?x[9],?S31,?0xd9d4d039L);?/*?45?*/
          281?????????????????d?=?HH?(d,?a,?b,?c,?x[12],?S32,?0xe6db99e5L);?/*?46?*/
          282?????????????????c?=?HH?(c,?d,?a,?b,?x[15],?S33,?0x1fa27cf8L);?/*?47?*/
          283?????????????????b?=?HH?(b,?c,?d,?a,?x[2],?S34,?0xc4ac5665L);?/*?48?*/
          284?
          285?????????????????/*?Round?4?*/
          286?????????????????a?=?II?(a,?b,?c,?d,?x[0],?S41,?0xf4292244L);?/*?49?*/
          287?????????????????d?=?II?(d,?a,?b,?c,?x[7],?S42,?0x432aff97L);?/*?50?*/
          288?????????????????c?=?II?(c,?d,?a,?b,?x[14],?S43,?0xab9423a7L);?/*?51?*/
          289?????????????????b?=?II?(b,?c,?d,?a,?x[5],?S44,?0xfc93a039L);?/*?52?*/
          290?????????????????a?=?II?(a,?b,?c,?d,?x[12],?S41,?0x655b59c3L);?/*?53?*/
          291?????????????????d?=?II?(d,?a,?b,?c,?x[3],?S42,?0x8f0ccc92L);?/*?54?*/
          292?????????????????c?=?II?(c,?d,?a,?b,?x[10],?S43,?0xffeff47dL);?/*?55?*/
          293?????????????????b?=?II?(b,?c,?d,?a,?x[1],?S44,?0x85845dd1L);?/*?56?*/
          294?????????????????a?=?II?(a,?b,?c,?d,?x[8],?S41,?0x6fa87e4fL);?/*?57?*/
          295?????????????????d?=?II?(d,?a,?b,?c,?x[15],?S42,?0xfe2ce6e0L);?/*?58?*/
          296?????????????????c?=?II?(c,?d,?a,?b,?x[6],?S43,?0xa3014314L);?/*?59?*/
          297?????????????????b?=?II?(b,?c,?d,?a,?x[13],?S44,?0x4e0811a1L);?/*?60?*/
          298?????????????????a?=?II?(a,?b,?c,?d,?x[4],?S41,?0xf7537e82L);?/*?61?*/
          299?????????????????d?=?II?(d,?a,?b,?c,?x[11],?S42,?0xbd3af235L);?/*?62?*/
          300?????????????????c?=?II?(c,?d,?a,?b,?x[2],?S43,?0x2ad7d2bbL);?/*?63?*/
          301?????????????????b?=?II?(b,?c,?d,?a,?x[9],?S44,?0xeb86d391L);?/*?64?*/
          302?
          303?????????????????state[0]?+=?a;
          304?????????????????state[1]?+=?b;
          305?????????????????state[2]?+=?c;
          306?????????????????state[3]?+=?d;
          307?
          308?????????}
          309?????????
          310?????????/*Encode把long數組按順序拆成byte數組,因為java的long類型是64bit的,
          311???????????只拆低32bit,以適應原始C實現的用途
          312?????????*/
          313?????????private?void?Encode?(byte[]?output,?long[]?input,?int?len)?{
          314?????????????????int?i,?j;
          315?
          316?????????????????for?(i?=?0,?j?=?0;?j?<?len;?i++,?j?+=?4)?{
          317?????????????????????????output[j]?=?(byte)(input[i]?&?0xffL);
          318?????????????????????????output[j?+?1]?=?(byte)((input[i]?>>>?8)?&?0xffL);
          319?????????????????????????output[j?+?2]?=?(byte)((input[i]?>>>?16)?&?0xffL);
          320?????????????????????????output[j?+?3]?=?(byte)((input[i]?>>>?24)?&?0xffL);
          321?????????????????}
          322?????????}
          323?
          324?????????/*Decode把byte數組按順序合成成long數組,因為java的long類型是64bit的,
          325???????????只合成低32bit,高32bit清零,以適應原始C實現的用途
          326?????????*/
          327?????????private?void?Decode?(long[]?output,?byte[]?input,?int?len)?{
          328?????????????????int?i,?j;
          329?
          330?
          331?????????????????for?(i?=?0,?j?=?0;?j?<?len;?i++,?j?+=?4)
          332?????????????????????????output[i]?=?b2iu(input[j])?|
          333?????????????????????????????????(b2iu(input[j?+?1])?<<?8)?|
          334?????????????????????????????????(b2iu(input[j?+?2])?<<?16)?|
          335?????????????????????????????????(b2iu(input[j?+?3])?<<?24);
          336?
          337?????????????????return;
          338?????????}
          339????????
          340?????????/*
          341???????????b2iu是我寫的一個把byte按照不考慮正負號的原則的"升位"程序,因為java沒有unsigned運算
          342?????????*/
          343?????????public?static?long?b2iu(byte?b)?{
          344?????????????????return?b?<?0???b?&?0x7F?+?128?:?b;
          345?????????}
          346?????????
          347?????/*byteHEX(),用來把一個byte類型的數轉換成十六進制的ASCII表示,
          348????? 因為java中的byte的toString無法實現這一點,我們又沒有C語言中的
          349???????sprintf(outbuf,"%02X",ib)
          350?????*/
          351?????????public?static?String?byteHEX(byte?ib)?{
          352?????????????????char[]?Digit?=?{?'0','1','2','3','4','5','6','7','8','9',
          353?????????????????'A','B','C','D','E','F'?};
          354?????????????????char?[]?ob?=?new?char[2];
          355?????????????????ob[0]?=?Digit[(ib?>>>?4)?&?0X0F];
          356?????????????????ob[1]?=?Digit[ib?&?0X0F];
          357?????????????????String?s?=?new?String(ob);
          358?????????????????return?s;
          359?????????}
          360?
          361?????????public?static?void?main(String?args[])?{
          362?
          363?
          364?????????????????MD5?m?=?new?MD5();
          365?????????????????if?(Array.getLength(args)?==?0)?{???//如果沒有參數,執行標準的Test?Suite
          366?????????????????
          367????????????????????????????System.out.println("MD5?Test?suite:");
          368?????????????????????System.out.println("MD5(\"\"):"+m.getMD5ofStr(""));
          369?????????????????????System.out.println("MD5(\"a\"):"+m.getMD5ofStr("a"));
          370?????????????????????System.out.println("MD5(\"abc\"):"+m.getMD5ofStr("abc"));
          371?????????????????????System.out.println("MD5(\"message?digest\"):"+m.getMD5ofStr("message?digest"));
          372?????????????????????System.out.println("MD5(\"abcdefghijklmnopqrstuvwxyz\"):"+
          373?????????????????????????m.getMD5ofStr("abcdefghijklmnopqrstuvwxyz"));
          374?????????????????????System.out.println("MD5(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\"):"+
          375??????????????????????????m.getMD5ofStr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"));
          376?????????????????}
          377?????????????????else?
          378???????????????????????????System.out.println("MD5("?+?args[0]?+?")="?+?m.getMD5ofStr(args[0]));
          379?????????????????
          380??????????
          381?????????}
          382?
          383?}
          posted on 2006-06-29 15:23 你是目標 閱讀(332) 評論(0)  編輯  收藏 所屬分類: JSP

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 昌邑市| 绍兴市| 萨迦县| 焦作市| 策勒县| 抚远县| 通榆县| 漳平市| 新民市| 荃湾区| 石楼县| 乌鲁木齐县| 丹阳市| 突泉县| 太仆寺旗| 三河市| 荔浦县| 徐州市| 蒙自县| 东山县| 班玛县| 湖南省| 廊坊市| 通榆县| 宜宾市| 荆州市| 吉木乃县| 五常市| 牡丹江市| 海口市| 麟游县| 琼结县| 旬邑县| 开阳县| 山东省| 景德镇市| 蚌埠市| 高淳县| 永仁县| 登封市| 淮南市|