最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++ MD5算法的實現(xiàn)代碼

 更新時間:2017年07月23日 12:05:27   作者:Fly20141201  
下面就將網(wǎng)上有關(guān)MD5算法一些知識整理一下,方面自己查閱,需要的朋友可以參考下

在逆向程序的時候,經(jīng)常會碰到加密的算法的問題,前面分析UC的逆向工程師的面試題2的時候,發(fā)現(xiàn)使用了MD5的加密算法(MD5算法是自己實現(xiàn)的,不是使用的算法庫函數(shù))。尤其是在逆向分析網(wǎng)絡(luò)協(xié)議的時候,一般的程序使用的加密算法都是使用的庫函數(shù)提供的算法,有些程序使用的算法是自己實現(xiàn)的;相對來說使用函數(shù)庫提供的加密函數(shù)的算法相對來說比較好識別,因為有算法常見函數(shù)在;但是如果不是使用的函數(shù)庫提供的加密的函數(shù)而是自己去實現(xiàn)某些算法話,識別起來有一定的難度,這就需要你對函數(shù)的加密原理以及流程還算法的特征比較熟悉才能很快識別出來。下面就將網(wǎng)上有關(guān)MD5算法一些知識整理一下,方面自己查閱。

md5簡介

消息摘要算法第五版(英語:Message-Digest Algorithm 5,縮寫為MD5),是當前計算機領(lǐng)域用于確保信息傳輸完整一致而廣泛使用的散列算法之一(又譯哈希算法、摘要算法等),主流編程語言普遍已有MD5的實現(xiàn)。將數(shù)據(jù) (如一段文字)運算變?yōu)榱硪还潭ㄩL度值,是散列算法的基礎(chǔ)原理,MD5的前身有MD2、MD3和MD4。MD5由MD4、MD3、MD2改進而來,主要增強算法復雜度和不可逆性。目前,MD5算法因其普遍、穩(wěn)定、快速的特點,仍廣泛應用于普通 數(shù)據(jù)的錯誤檢查領(lǐng)域。例如在一些BitTorrent下載中,軟件將通過計算MD5檢驗下載到的文件片段的完整性。MD5已經(jīng)廣泛使用在為文件傳輸提供一定的可靠性方面。例如,服務(wù)器預先提供一個MD5校驗和,用戶下載完文件以后, 用MD5算法計算下載文件的MD5校驗和,然后通過檢查這兩個校驗和是否一致,就能判斷下載的文件是否出錯。MD5是輸入不定長度信息,輸出固定長度128-bits的算法。經(jīng)過程序流程,生成四個32位數(shù)據(jù),最后聯(lián)合起來成為一個 128-bits散列?;痉绞綖椋笥?、取余、調(diào)整長度、與鏈接變量進行循環(huán)運算。得出結(jié)果。

md5算法描述

假設(shè)輸入信息(input message)的長度為b(bit),我們想要產(chǎn)生它的報文摘要,在此處b為任意的非負整數(shù):b也可能為0,也不一定為8的整數(shù)倍,且可能是任意大的長度。設(shè)該信息的比特流表示如下: M[0] M[1] M[2] ... M[b-1] 計算此信息的報文摘要需要如下5步:

1.補位

信息計算前先要進行位補位,設(shè)補位后信息的長度為LEN(bit),則LEN%512 = 448(bit),即數(shù)據(jù)擴展至 K * 512 + 448(bit)。即K * 64+56(byte),K為整數(shù)。補位操作始終要執(zhí)行,即使補位前信息的長度對512求余的結(jié)果是448。具體補位操作:補一個1,然后補0至滿足上述要求??偣沧钌僖a1bit,最多補512bit。

2.尾部加上信息長度

將輸入信息的原始長度b(bit)表示成一個64-bit的數(shù)字,把它添加到上一步的結(jié)果后面(在32位的機器上,這64位將用2個字來表示并且低位在前)。當遇到b大于2^64這種極少的情況時,b的高位被截去,僅使用b的低64位。經(jīng)過上面兩步,數(shù)據(jù)就被填補成長度為512(bit)的倍數(shù)。也就是說,此時的數(shù)據(jù)長度是16個字(32byte)的整數(shù)倍。此時的數(shù)據(jù)表示為: M[0 ... N-1] 其中的N是16的倍數(shù)。

3.初始化緩存區(qū)

用一個四個字的緩沖器(A,B,C,D)來計算報文摘要,A,B,C,D分別是32位的寄存器,初始化使用的是十六進制表示的數(shù)字,注意低字節(jié)在前: word A: 01 23 45 67 word B: 89 ab cd ef word C: fe dc ba 98 word D: 76 54 32 10

4.轉(zhuǎn)換

首先定義4個輔助函數(shù),每個函數(shù)的輸入是三個32位的字,輸出是一個32位的字: F(X,Y,Z) = XY v not(X) Z G(X,Y,Z) = XZ v Y not(Z) H(X,Y,Z) = X xor Y xor Z I(X,Y,Z) = Y xor (X v not(Z))

FF(a,b,c,d,Mj,s,ti)表示 a = b + ((a + F(b,c,d) + Mj + ti) << s)
GG(a,b,c,d,Mj,s,ti)表示 a = b + ((a + G(b,c,d) + Mj + ti) << s)
HH(a,b,c,d,Mj,s,ti)表示 a = b + ((a + H(b,c,d) + Mj + ti) << s)
Ⅱ(a,b,c,d,Mj,s,ti)表示 a = b + ((a + I(b,c,d) + Mj + ti) << s)

這四輪(64步)是:

第一輪

FF(a,b,c,d,M0,7,0xd76aa478) FF(d,a,b,c,M1,12,0xe8c7b756) FF(c,d,a,b,M2,17,0x242070db) FF(b,c,d,a,M3,22,0xc1bdceee) FF(a,b,c,d,M4,7,0xf57c0faf) FF(d,a,b,c,M5,12,0x4787c62a) FF(c,d,a,b,M6,17,0xa8304613) FF(b,c,d,a,M7,22,0xfd469501) FF(a,b,c,d,M8,7,0x698098d8) FF(d,a,b,c,M9,12,0x8b44f7af) FF(c,d,a,b,M10,17,0xffff5bb1) FF(b,c,d,a,M11,22,0x895cd7be) FF(a,b,c,d,M12,7,0x6b901122) FF(d,a,b,c,M13,12,0xfd987193) FF(c,d,a,b,M14,17,0xa679438e) FF(b,c,d,a,M15,22,0x49b40821)

第二輪

GG(a,b,c,d,M1,5,0xf61e2562) GG(d,a,b,c,M6,9,0xc040b340) GG(c,d,a,b,M11,14,0x265e5a51) GG(b,c,d,a,M0,20,0xe9b6c7aa) GG(a,b,c,d,M5,5,0xd62f105d) GG(d,a,b,c,M10,9,0x02441453) GG(c,d,a,b,M15,14,0xd8a1e681) GG(b,c,d,a,M4,20,0xe7d3fbc8) GG(a,b,c,d,M9,5,0x21e1cde6) GG(d,a,b,c,M14,9,0xc33707d6) GG(c,d,a,b,M3,14,0xf4d50d87) GG(b,c,d,a,M8,20,0x455a14ed) GG(a,b,c,d,M13,5,0xa9e3e905) GG(d,a,b,c,M2,9,0xfcefa3f8) GG(c,d,a,b,M7,14,0x676f02d9) GG(b,c,d,a,M12,20,0x8d2a4c8a)

第三輪

HH(a,b,c,d,M5,4,0xfffa3942) HH(d,a,b,c,M8,11,0x8771f681) HH(c,d,a,b,M11,16,0x6d9d6122) HH(b,c,d,a,M14,23,0xfde5380c) HH(a,b,c,d,M1,4,0xa4beea44) HH(d,a,b,c,M4,11,0x4bdecfa9) HH(c,d,a,b,M7,16,0xf6bb4b60) HH(b,c,d,a,M10,23,0xbebfbc70) HH(a,b,c,d,M13,4,0x289b7ec6) HH(d,a,b,c,M0,11,0xeaa127fa) HH(c,d,a,b,M3,16,0xd4ef3085) HH(b,c,d,a,M6,23,0x04881d05) HH(a,b,c,d,M9,4,0xd9d4d039) HH(d,a,b,c,M12,11,0xe6db99e5) HH(c,d,a,b,M15,16,0x1fa27cf8) HH(b,c,d,a,M2,23,0xc4ac5665)

第四輪

Ⅱ(a,b,c,d,M0,6,0xf4292244) Ⅱ(d,a,b,c,M7,10,0x432aff97) Ⅱ(c,d,a,b,M14,15,0xab9423a7) Ⅱ(b,c,d,a,M5,21,0xfc93a039) Ⅱ(a,b,c,d,M12,6,0x655b59c3) Ⅱ(d,a,b,c,M3,10,0x8f0ccc92) Ⅱ(c,d,a,b,M10,15,0xffeff47d) Ⅱ(b,c,d,a,M1,21,0x85845dd1) Ⅱ(a,b,c,d,M8,6,0x6fa87e4f) Ⅱ(d,a,b,c,M15,10,0xfe2ce6e0) Ⅱ(c,d,a,b,M6,15,0xa3014314) Ⅱ(b,c,d,a,M13,21,0x4e0811a1) Ⅱ(a,b,c,d,M4,6,0xf7537e82) Ⅱ(d,a,b,c,M11,10,0xbd3af235) Ⅱ(c,d,a,b,M2,15,0x2ad7d2bb) Ⅱ(b,c,d,a,M9,21,0xeb86d391)

下面是MD5算法的具體的實現(xiàn)

MD5算法的頭文件Md5.h:

#ifndef MD5_H  
#define MD5_H  
 
typedef struct 
{ 
  unsigned int count[2]; 
  unsigned int state[4]; 
  unsigned char buffer[64]; 
}MD5_CTX; 
 
 
#define F(x,y,z) ((x & y) | (~x & z))  
#define G(x,y,z) ((x & z) | (y & ~z))  
#define H(x,y,z) (x^y^z)  
#define I(x,y,z) (y ^ (x | ~z))  
#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))  
 
#define FF(a,b,c,d,x,s,ac) { \ 
a += F(b, c, d) + x + ac; \ 
a = ROTATE_LEFT(a, s); \ 
a += b; \ 
} 
 
#define GG(a,b,c,d,x,s,ac) { \ 
  a += G(b, c, d) + x + ac; \ 
  a = ROTATE_LEFT(a, s); \ 
  a += b; \ 
} 
 
#define HH(a,b,c,d,x,s,ac) { \ 
  a += H(b, c, d) + x + ac; \ 
  a = ROTATE_LEFT(a, s); \ 
  a += b; \ 
} 
#define II(a,b,c,d,x,s,ac) { \ 
  a += I(b, c, d) + x + ac; \ 
  a = ROTATE_LEFT(a, s); \ 
  a += b; \ 
} 
 
 
void MD5Init(MD5_CTX *context); 
void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen); 
void MD5Final(MD5_CTX *context, unsigned char digest[16]); 
void MD5Transform(unsigned int state[4], unsigned char block[64]); 
void MD5Encode(unsigned char *output, unsigned int *input, unsigned int len); 
void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len); 
 
#endif

MD5算法的實現(xiàn)文件Md5.cpp:

unsigned char PADDING[] = {  
  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; 
 
//在逆向代碼的時候,需要關(guān)注下面的特征值 
void MD5Init(MD5_CTX *context) 
{ 
  context->count[0] = 0; 
  context->count[1] = 0; 
  context->state[0] = 0x67452301; 
  context->state[1] = 0xEFCDAB89; 
  context->state[2] = 0x98BADCFE; 
  context->state[3] = 0x10325476; 
} 
 
void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen) 
{ 
  unsigned int i = 0, index = 0, partlen = 0; 
  index = (context->count[0] >> 3) & 0x3F; 
  partlen = 64 - index; 
  context->count[0] += inputlen << 3; 
  if (context->count[0] < (inputlen << 3)) 
    context->count[1]++; 
  context->count[1] += inputlen >> 29; 
 
  if (inputlen >= partlen) 
  { 
    memcpy(&context->buffer[index], input, partlen); 
    MD5Transform(context->state, context->buffer); 
    for (i = partlen; i + 64 <= inputlen; i += 64) 
      MD5Transform(context->state, &input[i]); 
    index = 0; 
  } 
  else 
  { 
    i = 0; 
  } 
  memcpy(&context->buffer[index], &input[i], inputlen - i); 
} 
 
void MD5Final(MD5_CTX *context, unsigned char digest[16]) 
{ 
  unsigned int index = 0, padlen = 0; 
  unsigned char bits[8]; 
  index = (context->count[0] >> 3) & 0x3F; 
  padlen = (index < 56) ? (56 - index) : (120 - index); 
  MD5Encode(bits, context->count, 8); 
  MD5Update(context, PADDING, padlen); 
  MD5Update(context, bits, 8); 
  MD5Encode(digest, context->state, 16); 
} 
 
void MD5Encode(unsigned char *output, unsigned int *input, unsigned int len) 
{ 
  unsigned int i = 0, j = 0; 
  while (j < len) 
  { 
    output[j] = input[i] & 0xFF; 
    output[j + 1] = (input[i] >> 8) & 0xFF; 
    output[j + 2] = (input[i] >> 16) & 0xFF; 
    output[j + 3] = (input[i] >> 24) & 0xFF; 
    i++; 
    j += 4; 
  } 
} 
 
void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len) 
{ 
  unsigned int i = 0, j = 0; 
  while (j < len) 
  { 
    output[i] = (input[j]) | 
      (input[j + 1] << 8) | 
      (input[j + 2] << 16) | 
      (input[j + 3] << 24); 
    i++; 
    j += 4; 
  } 
} 
 
void MD5Transform(unsigned int state[4], unsigned char block[64]) 
{ 
  unsigned int a = state[0]; 
  unsigned int b = state[1]; 
  unsigned int c = state[2]; 
  unsigned int d = state[3]; 
  unsigned int x[64]; 
 
  MD5Decode(x, block, 64); 
  FF(a, b, c, d, x[0], 7, 0xd76aa478); 
  FF(d, a, b, c, x[1], 12, 0xe8c7b756); 
  FF(c, d, a, b, x[2], 17, 0x242070db); 
  FF(b, c, d, a, x[3], 22, 0xc1bdceee); 
  FF(a, b, c, d, x[4], 7, 0xf57c0faf); 
  FF(d, a, b, c, x[5], 12, 0x4787c62a); 
  FF(c, d, a, b, x[6], 17, 0xa8304613); 
  FF(b, c, d, a, x[7], 22, 0xfd469501); 
  FF(a, b, c, d, x[8], 7, 0x698098d8); 
  FF(d, a, b, c, x[9], 12, 0x8b44f7af); 
  FF(c, d, a, b, x[10], 17, 0xffff5bb1); 
  FF(b, c, d, a, x[11], 22, 0x895cd7be); 
  FF(a, b, c, d, x[12], 7, 0x6b901122); 
  FF(d, a, b, c, x[13], 12, 0xfd987193); 
  FF(c, d, a, b, x[14], 17, 0xa679438e); 
  FF(b, c, d, a, x[15], 22, 0x49b40821); 
 
 
  GG(a, b, c, d, x[1], 5, 0xf61e2562); 
  GG(d, a, b, c, x[6], 9, 0xc040b340); 
  GG(c, d, a, b, x[11], 14, 0x265e5a51); 
  GG(b, c, d, a, x[0], 20, 0xe9b6c7aa); 
  GG(a, b, c, d, x[5], 5, 0xd62f105d); 
  GG(d, a, b, c, x[10], 9, 0x2441453); 
  GG(c, d, a, b, x[15], 14, 0xd8a1e681); 
  GG(b, c, d, a, x[4], 20, 0xe7d3fbc8); 
  GG(a, b, c, d, x[9], 5, 0x21e1cde6); 
  GG(d, a, b, c, x[14], 9, 0xc33707d6); 
  GG(c, d, a, b, x[3], 14, 0xf4d50d87); 
  GG(b, c, d, a, x[8], 20, 0x455a14ed); 
  GG(a, b, c, d, x[13], 5, 0xa9e3e905); 
  GG(d, a, b, c, x[2], 9, 0xfcefa3f8); 
  GG(c, d, a, b, x[7], 14, 0x676f02d9); 
  GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); 
 
 
  HH(a, b, c, d, x[5], 4, 0xfffa3942); 
  HH(d, a, b, c, x[8], 11, 0x8771f681); 
  HH(c, d, a, b, x[11], 16, 0x6d9d6122); 
  HH(b, c, d, a, x[14], 23, 0xfde5380c); 
  HH(a, b, c, d, x[1], 4, 0xa4beea44); 
  HH(d, a, b, c, x[4], 11, 0x4bdecfa9); 
  HH(c, d, a, b, x[7], 16, 0xf6bb4b60); 
  HH(b, c, d, a, x[10], 23, 0xbebfbc70); 
  HH(a, b, c, d, x[13], 4, 0x289b7ec6); 
  HH(d, a, b, c, x[0], 11, 0xeaa127fa); 
  HH(c, d, a, b, x[3], 16, 0xd4ef3085); 
  HH(b, c, d, a, x[6], 23, 0x4881d05); 
  HH(a, b, c, d, x[9], 4, 0xd9d4d039); 
  HH(d, a, b, c, x[12], 11, 0xe6db99e5); 
  HH(c, d, a, b, x[15], 16, 0x1fa27cf8); 
  HH(b, c, d, a, x[2], 23, 0xc4ac5665); 
 
 
  II(a, b, c, d, x[0], 6, 0xf4292244); 
  II(d, a, b, c, x[7], 10, 0x432aff97); 
  II(c, d, a, b, x[14], 15, 0xab9423a7); 
  II(b, c, d, a, x[5], 21, 0xfc93a039); 
  II(a, b, c, d, x[12], 6, 0x655b59c3); 
  II(d, a, b, c, x[3], 10, 0x8f0ccc92); 
  II(c, d, a, b, x[10], 15, 0xffeff47d); 
  II(b, c, d, a, x[1], 21, 0x85845dd1); 
  II(a, b, c, d, x[8], 6, 0x6fa87e4f); 
  II(d, a, b, c, x[15], 10, 0xfe2ce6e0); 
  II(c, d, a, b, x[6], 15, 0xa3014314); 
  II(b, c, d, a, x[13], 21, 0x4e0811a1); 
  II(a, b, c, d, x[4], 6, 0xf7537e82); 
  II(d, a, b, c, x[11], 10, 0xbd3af235); 
  II(c, d, a, b, x[2], 15, 0x2ad7d2bb); 
  II(b, c, d, a, x[9], 21, 0xeb86d391); 
  state[0] += a; 
  state[1] += b; 
  state[2] += c; 
  state[3] += d; 
} 

MD5算法的調(diào)用測試:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
 
  int i; 
  unsigned char encrypt[] = "admin";//21232f297a57a5a743894a0e4a801fc3  
  unsigned char decrypt[16]; 
 
  MD5_CTX md5; 
 
  MD5Init(&md5); 
  MD5Update(&md5, encrypt, strlen((char *)encrypt)); 
  MD5Final(&md5, decrypt); 
 
  //Md5加密后的32位結(jié)果 
  printf("加密前:%s\n加密后16位:", encrypt); 
  for (i = 4; i<12; i++) 
  { 
    printf("%02x", decrypt[i]);  
  } 
 
  //Md5加密后的32位結(jié)果 
  printf("\n加密前:%s\n加密后32位:", encrypt); 
  for (i = 0; i<16; i++) 
  { 
    printf("%02x", decrypt[i]);  
  } 
 
  getchar(); 
 
  return 0; 
}

上面的代碼工程的下載地址:Md5Demo201707.zip

破解MD5加密的網(wǎng)址:http://www.cmd5.com/

感謝鏈接:
http://blog.sina.com.cn/s/blog_693de6100101kcu6.html

https://github.com/JieweiWei/md5

相關(guān)文章

  • C++超詳細分析順序表

    C++超詳細分析順序表

    程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要創(chuàng)建這種元素組,用變量記錄它們,傳進傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關(guān)系由它們的存儲順序自然表示
    2022-03-03
  • opencv實現(xiàn)顏色檢測

    opencv實現(xiàn)顏色檢測

    這篇文章主要為大家詳細介紹了opencv實現(xiàn)顏色檢測,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C++實現(xiàn)簡易通訊錄功能

    C++實現(xiàn)簡易通訊錄功能

    這篇文章主要為大家詳細介紹了C++實現(xiàn)簡易通訊錄功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 詳解C++元編程之Parser Combinator

    詳解C++元編程之Parser Combinator

    借助C++的constexpr能力,可以輕而易舉的構(gòu)造Parser Combinator,對用戶定義的字符串(User defined literal)釋放了巨大的潛力。
    2021-05-05
  • c++代碼各種注釋示例詳解

    c++代碼各種注釋示例詳解

    大家好,本篇文章主要講的是c++代碼各種注釋示例詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語言實現(xiàn)掃雷小游戲詳細代碼

    C語言實現(xiàn)掃雷小游戲詳細代碼

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)掃雷小游戲的代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C/C++ Windows SAPI實現(xiàn)文字轉(zhuǎn)語音功能

    C/C++ Windows SAPI實現(xiàn)文字轉(zhuǎn)語音功能

    本文通過封裝Windows SAPI(Speech Application Programming Interface),提供了一個現(xiàn)代化的C++接口實現(xiàn)文字轉(zhuǎn)語音功能,這篇文章重點給大家介紹C/C++ Windows SAPI自實現(xiàn)文字轉(zhuǎn)語音功能,感興趣的朋友一起看看吧
    2025-02-02
  • c/c++中struct定義、聲明、對齊方式解析

    c/c++中struct定義、聲明、對齊方式解析

    這篇文章通過C/C++的兩種聲明方式開始,給大家詳細分析了/c+中struct定義、聲明、對齊方式,對此有興趣的朋友可以參考學習下。
    2018-03-03
  • C++基于文件流與armadillo讀取mnist示例詳解

    C++基于文件流與armadillo讀取mnist示例詳解

    這篇文章主要給大家介紹了關(guān)于C++基于文件流與armadillo讀取mnist的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • C/C++?QT實現(xiàn)自定義對話框的示例代碼

    C/C++?QT實現(xiàn)自定義對話框的示例代碼

    對話框分為多種,常見的有通用對話框,自定義對話框,模態(tài)對話框,非模態(tài)對話框等,本文主要介紹了QT自定義對話框,感興趣的可以了解一下
    2021-11-11

最新評論

磐石市| 榆中县| 循化| 疏附县| 漾濞| 湖北省| 桓仁| 鄄城县| 英超| 和顺县| 浦北县| 大厂| 卫辉市| 钟山县| 彩票| 土默特右旗| 淮滨县| 鹤庆县| 吉木乃县| 池州市| 朝阳市| 平顺县| 台北县| 鹰潭市| 江都市| 瓦房店市| 朝阳市| 三穗县| 樟树市| 绩溪县| 汉沽区| 华坪县| 五寨县| 景洪市| 乌拉特前旗| 凤台县| 宝清县| 瓦房店市| 酒泉市| 大兴区| 县级市|