青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

#ant

The dreams in which I'm dying are the best I've ever had...

MD5算法的C++實(shí)現(xiàn)

1. Introduction
MD5算法是一種消息摘要算法(Message Digest Algorithm),此算法以任意長度的信息(message)作為輸入進(jìn)行計算,產(chǎn)生一個128-bit(16-byte)的指紋或報文摘要(fingerprint or message digest)。兩個不同的message產(chǎn)生相同message digest的幾率相當(dāng)小,從一個給定的message digest逆向產(chǎn)生原始message更是困難(不過據(jù)說我國的某個教授很善于從message digest構(gòu)造message),因此MD5算法適合用在數(shù)字簽名應(yīng)用中。MD5實(shí)現(xiàn)簡單,在32位的機(jī)器上運(yùn)行速度也相當(dāng)快,當(dāng)然實(shí)際應(yīng)用也不僅僅局限于數(shù)字簽名。

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

????????? M[0] M[1] M[2] ... M[b-1]

計算此信息的報文摘要需要如下5步:
2.1 Append Padding Bits
信息計算前先要進(jìn)行位補(bǔ)位,設(shè)補(bǔ)位后信息的長度為LEN(bit),則LEN%512 = 448(bit),即數(shù)據(jù)擴(kuò)展至
K*512+448(bit)。即K*64+56(byte),K為整數(shù)。補(bǔ)位操作始終要執(zhí)行,即使補(bǔ)位前信息的長度對512求余的結(jié)果是448。具體補(bǔ)位操作:補(bǔ)一個1,然后補(bǔ)0至滿足上述要求??偣沧钌僖a(bǔ)1bit,最多補(bǔ)512bit。

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

????????? M[0 ... N-1]

其中的N是16的倍數(shù)。

2.3 Initialize MD Buffer
用一個四個字的緩沖器(A,B,C,D)來計算報文摘要,A,B,C,D分別是32位的寄存器,初始化使用的是十六進(jìn)制表示的數(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


2.4 Process Message in 16-Word Blocks
首先定義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))

NOTE:not(X)代表X的按位補(bǔ)運(yùn)算,X v Y 表示X和Y的按位或運(yùn)算,X xor Y代表X和Y的按位異或運(yùn)算,XY代表X和Y的按位與運(yùn)算。

具體過程如下:
?1?/*?Process?each?16-word?block.?*/
?2????For?i?=?0?to?N/16-1?do
?3?
?4??????/*?Copy?block?i?into?X.?*/
?5??????For?j?=?0?to?15?do
?6????????Set?X[j]?to?M[i*16+j].
?7??????end?/*?of?loop?on?j?*/

?8?
?9??????/*?Save?A?as?AA,?B?as?BB,?C?as?CC,?and?D?as?DD.?*/
10??????AA?=?A
11??????BB?=
?B
12??????CC?=
?C
13??????DD?=
?D
14?

15??????/*?Round?1.?*/
16??????/*?Let?[abcd?k?s?i]?denote?the?operation
17???????????a?=?b?+?((a?+?F(b,c,d)?+?X[k]?+?T[i])?<<<?s).?*/

18??????/*?Do?the?following?16?operations.?*/
19??????[ABCD??0??7??1]??[DABC??1?12??2]??[CDAB??2?17??3]??[BCDA??3?22??4]
20??????[ABCD??4??7??5]??[DABC??5?12??6]??[CDAB??6?17??7]??[BCDA??7?22??8
]
21??????[ABCD??8??7??9]??[DABC??9?12?10]??[CDAB?10?17?11]??[BCDA?11?22?12
]
22??????[ABCD?12??7?13]??[DABC?13?12?14]??[CDAB?14?17?15]??[BCDA?15?22?16
]
23?

24??????/*?Round?2.?*/
25??????/*?Let?[abcd?k?s?i]?denote?the?operation
26???????????a?=?b?+?((a?+?G(b,c,d)?+?X[k]?+?T[i])?<<<?s).?*/

27??????/*?Do?the?following?16?operations.?*/
28??????[ABCD??1??5?17]??[DABC??6??9?18]??[CDAB?11?14?19]??[BCDA??0?20?20]
29??????[ABCD??5??5?21]??[DABC?10??9?22]??[CDAB?15?14?23]??[BCDA??4?20?24
]
30??????[ABCD??9??5?25]??[DABC?14??9?26]??[CDAB??3?14?27]??[BCDA??8?20?28
]
31??????[ABCD?13??5?29]??[DABC??2??9?30]??[CDAB??7?14?31]??[BCDA?12?20?32
]
32?

33??????/*?Round?3.?*/
34??????/*?Let?[abcd?k?s?t]?denote?the?operation
35???????????a?=?b?+?((a?+?H(b,c,d)?+?X[k]?+?T[i])?<<<?s).?*/

36??????/*?Do?the?following?16?operations.?*/
37??????[ABCD??5??4?33]??[DABC??8?11?34]??[CDAB?11?16?35]??[BCDA?14?23?36]
38??????[ABCD??1??4?37]??[DABC??4?11?38]??[CDAB??7?16?39]??[BCDA?10?23?40
]
39??????[ABCD?13??4?41]??[DABC??0?11?42]??[CDAB??3?16?43]??[BCDA??6?23?44
]
40??????[ABCD??9??4?45]??[DABC?12?11?46]??[CDAB?15?16?47]??[BCDA??2?23?48
]
41?

42??????/*?Round?4.?*/
43??????/*?Let?[abcd?k?s?t]?denote?the?operation
44???????????a?=?b?+?((a?+?I(b,c,d)?+?X[k]?+?T[i])?<<<?s).?*/

45??????/*?Do?the?following?16?operations.?*/
46??????[ABCD??0??6?49]??[DABC??7?10?50]??[CDAB?14?15?51]??[BCDA??5?21?52]
47??????[ABCD?12??6?53]??[DABC??3?10?54]??[CDAB?10?15?55]??[BCDA??1?21?56
]
48??????[ABCD??8??6?57]??[DABC?15?10?58]??[CDAB??6?15?59]??[BCDA?13?21?60
]
49??????[ABCD??4??6?61]??[DABC?11?10?62]??[CDAB??2?15?63]??[BCDA??9?21?64
]
50?

51??????/*?Then?perform?the?following?additions.?(That?is?increment?each
52?
????????of?the?four?registers?by?the?value?it?had?before?this?block
53?????????was?started.)?*/

54??????A?=?A?+?AA
55??????B?=?B?+
?BB
56??????C?=?C?+
?CC
57??????D?=?D?+
?DD
58?

59????end?/*?of?loop?on?i?*/

2.5 Output
報文摘要的產(chǎn)生后的形式為:A,B,C,D。也就是低位字節(jié)A開始,高位字節(jié)D結(jié)束。

3. C++ Implementation
有了上面5個步驟的算法描述,用C++實(shí)現(xiàn)起來就很直接了。需要注意的是在具體實(shí)現(xiàn)的時候上述5個步驟的順序會有所變動,因為在大多數(shù)情況下我們都無法或很難提前計算出輸入信息的長度b(如輸入信息來自文件或網(wǎng)絡(luò))。因此在具體實(shí)現(xiàn)時Append Padding BitsAppend Length這兩步會放在最后面。

4. Test Suite
由于實(shí)現(xiàn)代碼比較長,在這里就不貼出來了,在本文后面會提供下載。MD5類的public接口如下:
md5.h
?1?class?MD5?{
?2?public
:
?3?
????MD5();
?4?????MD5(const?void*
input,?size_t?length);
?5?????MD5(const?string&
str);
?6?????MD5(ifstream?&
in);
?7?????void?update(const?void*
input,?size_t?length);
?8?????void?update(const?string&
str);
?9?????void?update(ifstream&
in);
10?????const?byte*
?digest();
11?
????string?toString();
12?????void
?reset();
13?
????...
14?};

下面簡單介紹一下具體用法:
1.計算字符串的MD5值
下面的代碼計算字符串"abc"的MD5值并用cout輸出:
1?MD5?md5;
2?md5.update("abc"
);
3?cout?<<?md5.toString()?<<
?endl;
4?//或者更簡單點(diǎn)

5?cout?<<?MD5("abc").toString()?<<?endl;

2.計算文件的MD5值
下面的代碼計算文本文件"D:\test.txt"的MD5值并用cout輸出,如果是二進(jìn)制文件打開的時候記得要指定ios::binary模式。另外需要注意的是用來計算的文件必須存在,所以最好在計算前先判斷下ifstream的狀態(tài)。
(本來判斷ifstream是否有效不該是客戶的責(zé)任,原本想在ifstream無效時用文件名做參數(shù)拋出FileNotFoundException之類的異常,后來卻發(fā)現(xiàn)從ifstream中居然無法得到文件名...)
1?MD5?md5;
2?md5.update(ifstream("D:\\test.txt"
));
3?cout?<<?md5.toString()?<<
?endl;
4?//或者更簡單點(diǎn)

5?cout?<<?MD5(ifstream("D:\\test.txt")).toString()?<<?endl;

3.最基本的用法
上面的用來計算字符串和文件MD5值的接口都是為了方便才提供的,其實(shí)最基本的接口是:
void update(const void *input, size_t length);
update的另外兩個重載都是基于它來實(shí)現(xiàn)的,下面的代碼用上述接口來實(shí)現(xiàn)FileDigest函數(shù),該函數(shù)用來計算文件的MD5值:
?1?string?FileDigest(const?string& file)?{
?2?

?3?????ifstream?in(file.c_str(),?ios::binary);
?4?????if?(!
in)
?5?????????return?""
;
?6?

?7?????MD5?md5;
?8?
????std::streamsize?length;
?9?????char?buffer[1024
];
10?????while?(!
in.eof())?{
11?????????in.read(buffer,?1024
);
12?????????length?=
?in.gcount();
13?????????if?(length?>?0
)
14?
????????????md5.update(buffer,?length);
15?
????}
16?
????in.close();
17?????return
?md5.toString();
18?}

下面看看測試代碼:
test.cpp
?1?#include?"md5.h"
?2?#include?<iostream>
?3?
?4?using?namespace?std;
?5?

?6?void?PrintMD5(const?string& str,?MD5& md5)?{
?7?????cout?<<?"MD5(\""?<<?str?<<?"\")?=?"?<<?md5.toString()?<<
?endl;
?8?
}
?9?

10?int?main()?{
11?

12?????MD5?md5;
13?????md5.update(""
);
14?????PrintMD5(""
,?md5);
15?

16?????md5.update("a");
17?????PrintMD5("a"
,?md5);
18?

19?????md5.update("bc");
20?????PrintMD5("abc"
,?md5);
21?

22?????md5.update("defghijklmnopqrstuvwxyz");
23?????PrintMD5("abcdefghijklmnopqrstuvwxyz"
,?md5);
24?

25?????md5.reset();
26?????md5.update("message?digest"
);
27?????PrintMD5("message?digest"
,?md5);
28?

29?????md5.reset();
30?????md5.update(ifstream("D:\\test.txt"
));
31?????PrintMD5("D:\\test.txt"
,?md5);
32?

33?????return?0;
34?}

測試結(jié)果:
MD5("") = d41d8cd98f00b204e9800998ecf8427e
MD5("a") = 0cc175b9c0f1b6a831c399e269772661
MD5("abc") = 900150983cd24fb0d6963f7d28e17f72
MD5("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
MD5("message digest") = f96b697d7cb7938d525a2f31aaf161d0
MD5("D:\test.txt") = 7ac66c0f148de9519b8bd264312c4d64


源代碼下載:點(diǎn)擊下載
在這里放上Vrcats修改的Qt版本:點(diǎn)擊下載

posted on 2007-09-11 12:20 螞蟻終結(jié)者 閱讀(57828) 評論(121)  編輯 收藏 引用 所屬分類: Encrypt

評論共2頁: 1 2 

Feedback

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-10 08:27 SmartPtr

.NET中產(chǎn)生HashCode用的貌似也是MD5算法???  回復(fù)  更多評論   

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-10 09:56 Ray

其實(shí)頭文件里的那些define都可以放到cpp里。
類接口也可以再簡化一下。  回復(fù)  更多評論   

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-10 11:25 螞蟻終結(jié)者

@Ray
Thanks!
頭文件的define確實(shí)該放在cpp里,是我疏忽了。
類的接口也正在優(yōu)化...  回復(fù)  更多評論   

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-10 11:45 螞蟻終結(jié)者

@SmartPtr
Sorry!我對.Net不太熟悉呵呵  回復(fù)  更多評論   

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-11 00:34 fanofcpp

不錯的說,希望把優(yōu)化的代碼貼出來。  回復(fù)  更多評論   

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-11 12:25 螞蟻終結(jié)者

總算抽出時間修改了一下接口,只敢說比以前的好。實(shí)在想不出比較完美的,要是哪位有好的想法還望告知...
  回復(fù)  更多評論   

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-11 13:27 Minidx全文檢索

奇怪,怎么跑上面來了  回復(fù)  更多評論   

# Hi,哥們兒 2007-09-11 14:38 VrcatS

我在做一個手機(jī)的IM項目,沒有合適的MD5庫,試了一下你這個,喲,還真管用。于是我就順手給你這庫寫了一個Qt的移植,可以直接用在Qt和Qtopia里頭。在GCC4下面測過了,回頭等我項目整測的時候還會測其他平臺。下載點(diǎn)在這里HTTP://www.vrcats.com/md5.tar.gz
我的MSN:robot_liuzheng\@hotmail\.com有空交流  回復(fù)  更多評論   

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-11 15:32 螞蟻終結(jié)者

@VrcatS
有意思,thanks!
  回復(fù)  更多評論   

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-12 23:46 ornaking

呵呵~~~還是受不了了~~~
辭職了~~~
看了你的帖子~~~好強(qiáng)啊~~~
以后多過來學(xué)習(xí)學(xué)習(xí)哈~~~  回復(fù)  更多評論   

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-13 08:27 螞蟻終結(jié)者

@ornaking
呵呵,共同學(xué)習(xí)  回復(fù)  更多評論   

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-14 22:04 abc

代碼在VC++ 2005上鏈接是發(fā)生錯誤!
錯誤 1 error LNK2019: 無法解析的外部符號 "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall MD5::toString(void)" (?toString@MD5@@QAE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ),該符號在函數(shù) "void __cdecl PrintMD5(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class MD5 &)" (?PrintMD5@@YAXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAVMD5@@@Z) 中被引用 test.obj
錯誤 2 error LNK2019: 無法解析的外部符號 "public: void __thiscall MD5::update(void const *,unsigned int)" (?update@MD5@@QAEXPBXI@Z),該符號在函數(shù) "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl FileDigest(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?FileDigest@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV12@@Z) 中被引用 test.obj
錯誤 3 error LNK2019: 無法解析的外部符號 "public: __thiscall MD5::MD5(void)" (??0MD5@@QAE@XZ),該符號在函數(shù) "class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __cdecl FileDigest(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?FileDigest@@YA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@ABV12@@Z) 中被引用 test.obj
錯誤 4 error LNK2019: 無法解析的外部符號 "public: void __thiscall MD5::update(class std::basic_ifstream<char,struct std::char_traits<char> > &)" (?update@MD5@@QAEXAAV?$basic_ifstream@DU?$char_traits@D@std@@@std@@@Z),該符號在函數(shù) _main 中被引用 test.obj
錯誤 5 error LNK2019: 無法解析的外部符號 "public: void __thiscall MD5::reset(void)" (?reset@MD5@@QAEXXZ),該符號在函數(shù) _main 中被引用 test.obj
錯誤 6 error LNK2019: 無法解析的外部符號 "public: void __thiscall MD5::update(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (?update@MD5@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z),該符號在函數(shù) _main 中被引用 test.obj
錯誤 7 error LNK2019: 無法解析的外部符號 "public: __thiscall MD5::MD5(class std::basic_ifstream<char,struct std::char_traits<char> > &)" (??0MD5@@QAE@AAV?$basic_ifstream@DU?$char_traits@D@std@@@std@@@Z),該符號在函數(shù) _main 中被引用 test.obj
錯誤 8 error LNK2019: 無法解析的外部符號 "public: __thiscall MD5::MD5(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)" (??0MD5@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z),該符號在函數(shù) _main 中被引用 test.obj
錯誤 9 fatal error LNK1120: 8 個無法解析的外部命令 C:\Documents and Settings\1\桌面\程設(shè)大賽\1003\Debug\1003.exe
  回復(fù)  更多評論   

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-15 09:52 螞蟻終結(jié)者

@abc
我最早就是在VC++ 2005上寫的代碼,在GCC上也測試過。
有可能你沒有把md5.cpp加入工程,如果只用md5.h和test.cpp進(jìn)行編譯就會出現(xiàn)上面的8個error。
  回復(fù)  更多評論   

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-15 14:19 abc

呵呵,這怎么可能沒加?
今天重新生成了一遍莫名其妙地又好了……
感謝您的代碼,我要急用所以沒時間再研究md5算法,直接用您的代碼構(gòu)建程序后提交答案。  回復(fù)  更多評論   

# re: MD5算法的C++實(shí)現(xiàn) 2007-09-15 18:41 螞蟻終結(jié)者

@abc
沒問題就好?!澳弊挚吹梦液霉?..  回復(fù)  更多評論   

評論共2頁: 1 2 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久九九免费视频| 国模套图日韩精品一区二区| 日韩午夜av电影| 欧美一区视频在线| 亚洲高清免费在线| 欧美激情影院| 一区二区av在线| 国产欧美一区视频| 欧美国产亚洲另类动漫| 亚洲欧美大片| 在线亚洲+欧美+日本专区| 亚洲第一色在线| 亚洲少妇一区| 欧美freesex8一10精品| 久久中文字幕导航| 乱中年女人伦av一区二区| 老鸭窝亚洲一区二区三区| 亚洲影视在线| 欧美极品在线视频| 欧美福利在线| 欧美一区二区三区视频免费播放| 这里只有精品丝袜| 一区二区三区**美女毛片| 亚洲高清一区二区三区| 91久久国产精品91久久性色| 国产午夜精品一区二区三区视频| 欧美午夜精品理论片a级大开眼界| 久久久国产一区二区三区| 欧美一区二区在线免费观看| 欧美一区二区三区免费在线看| 亚洲欧美高清| 免费视频一区| 国产精品午夜电影| 在线免费日韩片| 91久久线看在观草草青青| 亚洲欧洲日本一区二区三区| 国产精品毛片大码女人| 国产伪娘ts一区| 亚洲国产精品免费| 亚洲一区二区三区免费视频| 久久久国产成人精品| 欧美激情一区二区三区| 亚洲视频网在线直播| 久久久久综合网| 欧美日韩在线影院| 亚洲国产精品va在线看黑人| 午夜日韩电影| 亚洲精品在线一区二区| 久久永久免费| 国产私拍一区| 亚洲自拍偷拍麻豆| 亚洲免费大片| 欧美视频在线不卡| 亚洲一区二区网站| 久久一综合视频| 一区二区三区国产在线观看| 91久久夜色精品国产网站| 欧美性jizz18性欧美| 欧美成人激情视频| 国产精品夫妻自拍| 亚洲国产一成人久久精品| 国产精品自拍视频| 一本色道久久88亚洲综合88| 国产美女扒开尿口久久久| 久久综合九色九九| 欧美人与禽猛交乱配| 日韩一区二区久久| 国产精品99久久久久久久久久久久| 欧美日韩一区在线视频| 欧美一区二区三区播放老司机 | 欧美一级片久久久久久久| 欧美精品久久99| 另类天堂av| 欧美精品18| 亚洲国产高清一区| 狠狠做深爱婷婷久久综合一区| 美女脱光内衣内裤视频久久影院| 雨宫琴音一区二区在线| 久久综合久久综合久久| 亚洲国产精品一区制服丝袜| 一区二区三区国产精品| 欧美日韩不卡一区| 亚洲欧美中文另类| 99精品视频免费观看| 亚洲精品久久久久久久久久久久| 亚洲一区二区在线视频| 久久本道综合色狠狠五月| 一本色道久久99精品综合| 亚洲国产一区二区三区a毛片 | 久久在线免费观看视频| 中日韩美女免费视频网站在线观看| 欧美在线高清| a4yy欧美一区二区三区| 欧美激情久久久| 欧美国产三级| 亚洲三级国产| 亚洲精品一区二区三区99| 亚洲国产成人久久| 亚洲国产精品第一区二区| 欧美暴力喷水在线| 欧美fxxxxxx另类| 亚洲国产精品久久精品怡红院| 欧美jizzhd精品欧美喷水| 久久视频在线视频| 国产精品毛片在线| 欧美大片一区| 国产精品理论片在线观看| 国产精品乱码一区二区三区| 欧美激情精品久久久久久黑人 | 欧美激情视频一区二区三区免费| 日韩午夜免费| 欧美区一区二区三区| 1024成人网色www| 欧美一区二区日韩一区二区| 午夜视频一区| 国产精品视频一二三| 久久精品一区二区三区不卡牛牛| 久久aⅴ乱码一区二区三区| 国产精品久久福利| 欧美一级久久久| 欧美伊人精品成人久久综合97| 国产欧美一区二区白浆黑人| 欧美一区二区性| 最近看过的日韩成人| 正在播放欧美一区| 国产一区二区三区在线播放免费观看| 亚洲精品日韩一| 性久久久久久久| 亚洲一卡二卡三卡四卡五卡| 亚洲高清不卡在线观看| 国产精品一区在线播放| av成人免费观看| 开心色5月久久精品| 一本一本大道香蕉久在线精品| 欧美激情综合在线| 一区二区欧美国产| 欧美激情综合色综合啪啪| 亚洲一区影院| 中日韩美女免费视频网址在线观看 | 国产夜色精品一区二区av| 亚洲电影激情视频网站| 国产一区999| 久久精品人人| 欧美一级视频一区二区| 国产精品美女视频网站| 日韩午夜免费视频| 亚洲一级黄色片| 欧美午夜www高清视频| 夜夜嗨av色一区二区不卡| 一本久道久久综合婷婷鲸鱼| 欧美视频中文字幕在线| 亚洲欧美日韩国产中文| 久久成人精品| 极品尤物一区二区三区| 免费日本视频一区| 日韩特黄影片| 久久精品国产一区二区三区| 樱花yy私人影院亚洲| 欧美1区2区3区| a4yy欧美一区二区三区| 欧美在现视频| 亚洲国产日韩欧美在线动漫| 欧美区在线观看| 午夜精品影院| 欧美激情免费在线| 新片速递亚洲合集欧美合集| 国产一区激情| 欧美mv日韩mv国产网站| 亚洲视频在线二区| 噜噜爱69成人精品| 亚洲在线视频免费观看| 影音先锋另类| 欧美亚州韩日在线看免费版国语版| 亚洲一区二区毛片| 欧美国产成人在线| 欧美亚洲视频一区二区| 亚洲成色777777女色窝| 欧美日韩综合视频| 久久精品一区二区三区四区 | 在线观看日韩专区| 欧美日一区二区在线观看 | 久久久美女艺术照精彩视频福利播放 | 亚洲毛片在线| 久久久人成影片一区二区三区观看| 亚洲精品久久久蜜桃| 国产精品天天看| 欧美精品网站| 久久精品日韩一区二区三区| 日韩一级免费观看| 农村妇女精品| 久久高清国产| 一区二区高清在线观看| 亚洲电影免费在线| 国产亚洲精品bv在线观看| 欧美日本成人| 欧美大香线蕉线伊人久久国产精品| 欧美怡红院视频一区二区三区| 一区二区三区久久精品| 中文在线资源观看网站视频免费不卡 | 欧美日韩国产精品一区二区亚洲|