• <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>
            隨筆 - 298  文章 - 377  trackbacks - 0
            <2008年6月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            293012345

            常用鏈接

            留言簿(34)

            隨筆分類

            隨筆檔案

            文章檔案

            相冊

            收藏夾

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            //對字段進行加密

            CString MD_password,MD_name,MD_email;
            //調用加密函數
            MD_name = CMD5Checksum::GetMD5(name);
            MD_password = CMD5Checksum::GetMD5(password);
            MD_email = CMD5Checksum::GetMD5(email);

            其中GetMD5函數就是完成對字符串的加密工作。這個函數保存在MD5Checksum.h和MD5ChecksumDefines.h里,函數的實現在MD5Checksum.cpp文件里。可以完成對字符串的加密,還可以完成對文件名的加密工作。這三個文件如下:

            MD5Checksum.h:

            #if !defined(AFX_MD5CHECKSUM_H__2BC7928E_4C15_11D3_B2EE_A4A60E20D2C3__INCLUDED_)
            #define AFX_MD5CHECKSUM_H__2BC7928E_4C15_11D3_B2EE_A4A60E20D2C3__INCLUDED_

            #if _MSC_VER > 1000
            #pragma once

            #endif // _MSC_VER > 1000

            class CMD5Checksum
            {
            public:
            //interface functions for the RSA MD5 calculation
            static CString GetMD5(BYTE* pBuf, UINT nLength);
            static CString GetMD5(CFile& File);
            //static CString GetMD5(const CString& strFilePath);//對文件名加密
            static CString GetMD5(const CString str);//對字符串加密

            protected:
            //constructor/destructor
            CMD5Checksum();
            virtual ~CMD5Checksum() {};

            //RSA MD5 implementation
            void Transform(BYTE Block[64]);
            void Update(BYTE* Input, ULONG nInputLen);
            CString Final();
            inline DWORD RotateLeft(DWORD x, int n);
            inline void FF( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);
            inline void GG( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);
            inline void HH( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);
            inline void II( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T);

            //utility functions
            void DWordToByte(BYTE* Output, DWORD* Input, UINT nLength);
            void ByteToDWord(DWORD* Output, BYTE* Input, UINT nLength);

            private:
            BYTE m_lpszBuffer[64]; //input buffer
            ULONG m_nCount[2]; //number of bits, modulo 2^64 (lsb first)
            ULONG m_lMD5[4]; //MD5 checksum
            };

            #endif // !defined(AFX_MD5CHECKSUM_H__2BC7928E_4C15_11D3_B2EE_A4A60E20D2C3__INCLUDED_)

            MD5ChecksumDefines.h

            //MD5ChecksumDefines.h : MD5 Checksum constants

            //Magic initialization constants
            #define MD5_INIT_STATE_0 0x67452301
            #define MD5_INIT_STATE_1 0xefcdab89
            #define MD5_INIT_STATE_2 0x98badcfe
            #define MD5_INIT_STATE_3 0x10325476

            //Constants for Transform routine.
            #define MD5_S11 7
            #define MD5_S12 12
            #define MD5_S13 17
            #define MD5_S14 22
            #define MD5_S21 5
            #define MD5_S22 9
            #define MD5_S23 14
            #define MD5_S24 20
            #define MD5_S31 4
            #define MD5_S32 11
            #define MD5_S33 16
            #define MD5_S34 23
            #define MD5_S41 6
            #define MD5_S42 10
            #define MD5_S43 15
            #define MD5_S44 21

            //Transformation Constants - Round 1
            #define MD5_T01 0xd76aa478 //Transformation Constant 1
            #define MD5_T02 0xe8c7b756 //Transformation Constant 2
            #define MD5_T03 0x242070db //Transformation Constant 3
            #define MD5_T04 0xc1bdceee //Transformation Constant 4
            #define MD5_T05 0xf57c0faf //Transformation Constant 5
            #define MD5_T06 0x4787c62a //Transformation Constant 6
            #define MD5_T07 0xa8304613 //Transformation Constant 7
            #define MD5_T08 0xfd469501 //Transformation Constant 8
            #define MD5_T09 0x698098d8 //Transformation Constant 9
            #define MD5_T10 0x8b44f7af //Transformation Constant 10
            #define MD5_T11 0xffff5bb1 //Transformation Constant 11
            #define MD5_T12 0x895cd7be //Transformation Constant 12
            #define MD5_T13 0x6b901122 //Transformation Constant 13
            #define MD5_T14 0xfd987193 //Transformation Constant 14
            #define MD5_T15 0xa679438e //Transformation Constant 15
            #define MD5_T16 0x49b40821 //Transformation Constant 16

            //Transformation Constants - Round 2
            #define MD5_T17 0xf61e2562 //Transformation Constant 17
            #define MD5_T18 0xc040b340 //Transformation Constant 18
            #define MD5_T19 0x265e5a51 //Transformation Constant 19
            #define MD5_T20 0xe9b6c7aa //Transformation Constant 20
            #define MD5_T21 0xd62f105d //Transformation Constant 21
            #define MD5_T22 0x02441453 //Transformation Constant 22
            #define MD5_T23 0xd8a1e681 //Transformation Constant 23
            #define MD5_T24 0xe7d3fbc8 //Transformation Constant 24
            #define MD5_T25 0x21e1cde6 //Transformation Constant 25
            #define MD5_T26 0xc33707d6 //Transformation Constant 26
            #define MD5_T27 0xf4d50d87 //Transformation Constant 27
            #define MD5_T28 0x455a14ed //Transformation Constant 28
            #define MD5_T29 0xa9e3e905 //Transformation Constant 29
            #define MD5_T30 0xfcefa3f8 //Transformation Constant 30
            #define MD5_T31 0x676f02d9 //Transformation Constant 31
            #define MD5_T32 0x8d2a4c8a //Transformation Constant 32

            //Transformation Constants - Round 3
            #define MD5_T33 0xfffa3942 //Transformation Constant 33
            #define MD5_T34 0x8771f681 //Transformation Constant 34
            #define MD5_T35 0x6d9d6122 //Transformation Constant 35
            #define MD5_T36 0xfde5380c //Transformation Constant 36
            #define MD5_T37 0xa4beea44 //Transformation Constant 37
            #define MD5_T38 0x4bdecfa9 //Transformation Constant 38
            #define MD5_T39 0xf6bb4b60 //Transformation Constant 39
            #define MD5_T40 0xbebfbc70 //Transformation Constant 40
            #define MD5_T41 0x289b7ec6 //Transformation Constant 41
            #define MD5_T42 0xeaa127fa //Transformation Constant 42
            #define MD5_T43 0xd4ef3085 //Transformation Constant 43
            #define MD5_T44 0x04881d05 //Transformation Constant 44
            #define MD5_T45 0xd9d4d039 //Transformation Constant 45
            #define MD5_T46 0xe6db99e5 //Transformation Constant 46
            #define MD5_T47 0x1fa27cf8 //Transformation Constant 47
            #define MD5_T48 0xc4ac5665 //Transformation Constant 48

            //Transformation Constants - Round 4
            #define MD5_T49 0xf4292244 //Transformation Constant 49
            #define MD5_T50 0x432aff97 //Transformation Constant 50
            #define MD5_T51 0xab9423a7 //Transformation Constant 51
            #define MD5_T52 0xfc93a039 //Transformation Constant 52
            #define MD5_T53 0x655b59c3 //Transformation Constant 53
            #define MD5_T54 0x8f0ccc92 //Transformation Constant 54
            #define MD5_T55 0xffeff47d //Transformation Constant 55
            #define MD5_T56 0x85845dd1 //Transformation Constant 56
            #define MD5_T57 0x6fa87e4f //Transformation Constant 57
            #define MD5_T58 0xfe2ce6e0 //Transformation Constant 58
            #define MD5_T59 0xa3014314 //Transformation Constant 59
            #define MD5_T60 0x4e0811a1 //Transformation Constant 60
            #define MD5_T61 0xf7537e82 //Transformation Constant 61
            #define MD5_T62 0xbd3af235 //Transformation Constant 62
            #define MD5_T63 0x2ad7d2bb //Transformation Constant 63
            #define MD5_T64 0xeb86d391 //Transformation Constant 64


            //Null data (except for first BYTE) used to finalise the checksum calculation
            static unsigned char PADDING[64] = {
            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
            };

            MD5Checksum.cpp

            // MD5Checksum.cpp: implementation of the MD5Checksum class.
            //
            //////////////////////////////////////////////////////////////////////



            #include "stdafx.h"
            #include "MD5Checksum.h"
            #include "MD5ChecksumDefines.h"

            #ifdef _DEBUG
            #undef THIS_FILE
            static char THIS_FILE[]=__FILE__;
            #define new DEBUG_NEW
            #endif


            //CString CMD5Checksum::GetMD5(const CString& strFilePath)
            //{
            // //open the file as a binary file in readonly mode, denying write access
            // CFile File(strFilePath, CFile::modeRead | CFile::shareDenyWrite | CFile::typeBinary);
            //
            // //the file has been successfully opened, so now get and return its checksum
            // return GetMD5(File);
            //}

            CString CMD5Checksum::GetMD5(const CString str)
            {
            try
            {
            CMD5Checksum MD5Checksum; //checksum object
            int nLength = 0; //number of bytes read from the file
            const int nBufferSize = 1024; //checksum the file in blocks of 1024 bytes
            BYTE Buffer[nBufferSize]; //buffer for data read from the file

            //checksum the file in blocks of 1024 bytes
            if((nLength = str.GetLength()) > 0 )
            {
            MD5Checksum.Update( Buffer, nLength );
            }

            //finalise the checksum and return it
            return MD5Checksum.Final();
            }

            //report any file exceptions in debug mode only
            catch (CFileException* e )
            {
            TRACE0("CMD5Checksum::GetMD5: CFileException caught");
            throw e;
            }
            }

            CString CMD5Checksum::GetMD5(CFile& File)
            {
            try
            {
            CMD5Checksum MD5Checksum; //checksum object
            int nLength = 0; //number of bytes read from the file
            const int nBufferSize = 1024; //checksum the file in blocks of 1024 bytes
            BYTE Buffer[nBufferSize]; //buffer for data read from the file

            //checksum the file in blocks of 1024 bytes
            while ((nLength = File.Read( Buffer, nBufferSize )) > 0 )
            {
            MD5Checksum.Update( Buffer, nLength );
            }

            //finalise the checksum and return it
            return MD5Checksum.Final();
            }

            //report any file exceptions in debug mode only
            catch (CFileException* e )
            {
            TRACE0("CMD5Checksum::GetMD5: CFileException caught");
            throw e;
            }
            }



            CString CMD5Checksum::GetMD5(BYTE* pBuf, UINT nLength)
            {
            //entry invariants
            // IsValidAddress(pBuf,nLength,FALSE);

            //calculate and return the checksum
            CMD5Checksum MD5Checksum;
            MD5Checksum.Update( pBuf, nLength );
            return MD5Checksum.Final();
            }



            DWORD CMD5Checksum::RotateLeft(DWORD x, int n)
            {
            //check that DWORD is 4 bytes long - true in Visual C++ 6 and 32 bit Windows
            // sizeof(x);

            //rotate and return x
            return (x << n) | (x >> (32-n));
            }



            void CMD5Checksum::FF( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T)
            {
            DWORD F = (B & C) | (~B & D);
            A += F + X + T;
            A = RotateLeft(A, S);
            A += B;
            }



            void CMD5Checksum::GG( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T)
            {
            DWORD G = (B & D) | (C & ~D);
            A += G + X + T;
            A = RotateLeft(A, S);
            A += B;
            }



            void CMD5Checksum::HH( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T)
            {
            DWORD H = (B ^ C ^ D);
            A += H + X + T;
            A = RotateLeft(A, S);
            A += B;
            }



            void CMD5Checksum::II( DWORD& A, DWORD B, DWORD C, DWORD D, DWORD X, DWORD S, DWORD T)
            {
            DWORD I = (C ^ (B | ~D));
            A += I + X + T;
            A = RotateLeft(A, S);
            A += B;
            }



            void CMD5Checksum::ByteToDWord(DWORD* Output, BYTE* Input, UINT nLength)
            {
            //entry invariants
            ASSERT( nLength % 4 == 0 );
            ASSERT( AfxIsValidAddress(Output, nLength/4, TRUE) );
            ASSERT( AfxIsValidAddress(Input, nLength, FALSE) );

            //initialisations
            UINT i=0; //index to Output array
            UINT j=0; //index to Input array

            //transfer the data by shifting and copying
            for ( ; j < nLength; i++, j += 4)
            {
            Output[i] = (ULONG)Input[j] |
            (ULONG)Input[j+1] << 8 |
            (ULONG)Input[j+2] << 16 |
            (ULONG)Input[j+3] << 24;
            }
            }


            void CMD5Checksum::Transform(BYTE Block[64])
            {
            //initialise local data with current checksum
            ULONG a = m_lMD5[0];
            ULONG b = m_lMD5[1];
            ULONG c = m_lMD5[2];
            ULONG d = m_lMD5[3];

            //copy BYTES from input 'Block' to an array of ULONGS 'X'
            ULONG X[16];
            ByteToDWord( X, Block, 64 );

            //Perform Round 1 of the transformation
            FF (a, b, c, d, X[ 0], MD5_S11, MD5_T01);
            FF (d, a, b, c, X[ 1], MD5_S12, MD5_T02);
            FF (c, d, a, b, X[ 2], MD5_S13, MD5_T03);
            FF (b, c, d, a, X[ 3], MD5_S14, MD5_T04);
            FF (a, b, c, d, X[ 4], MD5_S11, MD5_T05);
            FF (d, a, b, c, X[ 5], MD5_S12, MD5_T06);
            FF (c, d, a, b, X[ 6], MD5_S13, MD5_T07);
            FF (b, c, d, a, X[ 7], MD5_S14, MD5_T08);
            FF (a, b, c, d, X[ 8], MD5_S11, MD5_T09);
            FF (d, a, b, c, X[ 9], MD5_S12, MD5_T10);
            FF (c, d, a, b, X[10], MD5_S13, MD5_T11);
            FF (b, c, d, a, X[11], MD5_S14, MD5_T12);
            FF (a, b, c, d, X[12], MD5_S11, MD5_T13);
            FF (d, a, b, c, X[13], MD5_S12, MD5_T14);
            FF (c, d, a, b, X[14], MD5_S13, MD5_T15);
            FF (b, c, d, a, X[15], MD5_S14, MD5_T16);

            //Perform Round 2 of the transformation
            GG (a, b, c, d, X[ 1], MD5_S21, MD5_T17);
            GG (d, a, b, c, X[ 6], MD5_S22, MD5_T18);
            GG (c, d, a, b, X[11], MD5_S23, MD5_T19);
            GG (b, c, d, a, X[ 0], MD5_S24, MD5_T20);
            GG (a, b, c, d, X[ 5], MD5_S21, MD5_T21);
            GG (d, a, b, c, X[10], MD5_S22, MD5_T22);
            GG (c, d, a, b, X[15], MD5_S23, MD5_T23);
            GG (b, c, d, a, X[ 4], MD5_S24, MD5_T24);
            GG (a, b, c, d, X[ 9], MD5_S21, MD5_T25);
            GG (d, a, b, c, X[14], MD5_S22, MD5_T26);
            GG (c, d, a, b, X[ 3], MD5_S23, MD5_T27);
            GG (b, c, d, a, X[ 8], MD5_S24, MD5_T28);
            GG (a, b, c, d, X[13], MD5_S21, MD5_T29);
            GG (d, a, b, c, X[ 2], MD5_S22, MD5_T30);
            GG (c, d, a, b, X[ 7], MD5_S23, MD5_T31);
            GG (b, c, d, a, X[12], MD5_S24, MD5_T32);

            //Perform Round 3 of the transformation
            HH (a, b, c, d, X[ 5], MD5_S31, MD5_T33);
            HH (d, a, b, c, X[ 8], MD5_S32, MD5_T34);
            HH (c, d, a, b, X[11], MD5_S33, MD5_T35);
            HH (b, c, d, a, X[14], MD5_S34, MD5_T36);
            HH (a, b, c, d, X[ 1], MD5_S31, MD5_T37);
            HH (d, a, b, c, X[ 4], MD5_S32, MD5_T38);
            HH (c, d, a, b, X[ 7], MD5_S33, MD5_T39);
            HH (b, c, d, a, X[10], MD5_S34, MD5_T40);
            HH (a, b, c, d, X[13], MD5_S31, MD5_T41);
            HH (d, a, b, c, X[ 0], MD5_S32, MD5_T42);
            HH (c, d, a, b, X[ 3], MD5_S33, MD5_T43);
            HH (b, c, d, a, X[ 6], MD5_S34, MD5_T44);
            HH (a, b, c, d, X[ 9], MD5_S31, MD5_T45);
            HH (d, a, b, c, X[12], MD5_S32, MD5_T46);
            HH (c, d, a, b, X[15], MD5_S33, MD5_T47);
            HH (b, c, d, a, X[ 2], MD5_S34, MD5_T48);

            //Perform Round 4 of the transformation
            II (a, b, c, d, X[ 0], MD5_S41, MD5_T49);
            II (d, a, b, c, X[ 7], MD5_S42, MD5_T50);
            II (c, d, a, b, X[14], MD5_S43, MD5_T51);
            II (b, c, d, a, X[ 5], MD5_S44, MD5_T52);
            II (a, b, c, d, X[12], MD5_S41, MD5_T53);
            II (d, a, b, c, X[ 3], MD5_S42, MD5_T54);
            II (c, d, a, b, X[10], MD5_S43, MD5_T55);
            II (b, c, d, a, X[ 1], MD5_S44, MD5_T56);
            II (a, b, c, d, X[ 8], MD5_S41, MD5_T57);
            II (d, a, b, c, X[15], MD5_S42, MD5_T58);
            II (c, d, a, b, X[ 6], MD5_S43, MD5_T59);
            II (b, c, d, a, X[13], MD5_S44, MD5_T60);
            II (a, b, c, d, X[ 4], MD5_S41, MD5_T61);
            II (d, a, b, c, X[11], MD5_S42, MD5_T62);
            II (c, d, a, b, X[ 2], MD5_S43, MD5_T63);
            II (b, c, d, a, X[ 9], MD5_S44, MD5_T64);

            //add the transformed values to the current checksum
            m_lMD5[0] += a;
            m_lMD5[1] += b;
            m_lMD5[2] += c;
            m_lMD5[3] += d;
            }



            CMD5Checksum::CMD5Checksum()
            {
            // zero members
            memset( m_lpszBuffer, 0, 64 );
            m_nCount[0] = m_nCount[1] = 0;

            // Load magic state initialization constants
            m_lMD5[0] = MD5_INIT_STATE_0;
            m_lMD5[1] = MD5_INIT_STATE_1;
            m_lMD5[2] = MD5_INIT_STATE_2;
            m_lMD5[3] = MD5_INIT_STATE_3;
            }


            void CMD5Checksum::DWordToByte(BYTE* Output, DWORD* Input, UINT nLength )
            {
            //entry invariants
            ASSERT( nLength % 4 == 0 );
            ASSERT( AfxIsValidAddress(Output, nLength, TRUE) );
            ASSERT( AfxIsValidAddress(Input, nLength/4, FALSE) );

            //transfer the data by shifting and copying
            UINT i = 0;
            UINT j = 0;
            for ( ; j < nLength; i++, j += 4)
            {
            Output[j] = (UCHAR)(Input[i] & 0xff);
            Output[j+1] = (UCHAR)((Input[i] >> 8) & 0xff);
            Output[j+2] = (UCHAR)((Input[i] >> 16) & 0xff);
            Output[j+3] = (UCHAR)((Input[i] >> 24) & 0xff);
            }
            }



            CString CMD5Checksum::Final()
            {
            //Save number of bits
            BYTE Bits[8];
            DWordToByte( Bits, m_nCount, 8 );

            //Pad out to 56 mod 64.
            UINT nIndex = (UINT)((m_nCount[0] >> 3) & 0x3f);
            UINT nPadLen = (nIndex < 56) ? (56 - nIndex) : (120 - nIndex);
            Update( PADDING, nPadLen );

            //Append length (before padding)
            Update( Bits, 8 );

            //Store final state in 'lpszMD5'
            const int nMD5Size = 16;
            unsigned char lpszMD5[ nMD5Size ];
            DWordToByte( lpszMD5, m_lMD5, nMD5Size );

            //Convert the hexadecimal checksum to a CString
            CString strMD5;
            for ( int i=0; i < nMD5Size; i++)
            {
            CString Str;
            if (lpszMD5[i] == 0) {
            Str = CString("00");
            }
            else if (lpszMD5[i] <= 15) {
            Str.Format(_T("0%x"),lpszMD5[i]);
            }
            else {
            Str.Format(_T("%x"),lpszMD5[i]);
            }

            ASSERT( Str.GetLength() == 2 );
            strMD5 += Str;
            }
            ASSERT( strMD5.GetLength() == 32 );
            return strMD5;
            }



            void CMD5Checksum::Update( BYTE* Input, ULONG nInputLen )
            {
            //Compute number of bytes mod 64
            UINT nIndex = (UINT)((m_nCount[0] >> 3) & 0x3F);

            //Update number of bits
            if ( ( m_nCount[0] += nInputLen << 3 ) < ( nInputLen << 3) )
            {
            m_nCount[1]++;
            }
            m_nCount[1] += (nInputLen >> 29);

            //Transform as many times as possible.
            UINT i=0;
            UINT nPartLen = 64 - nIndex;
            if (nInputLen >= nPartLen)
            {
            memcpy( &m_lpszBuffer[nIndex], Input, nPartLen );
            Transform( m_lpszBuffer );
            for (i = nPartLen; i + 63 < nInputLen; i += 64)
            {
            Transform( &Input[i] );
            }
            nIndex = 0;
            }
            else
            {
            i = 0;
            }
            // Buffer remaining input
            memcpy( &m_lpszBuffer[nIndex], &Input[i], nInputLen-i);
            }


            加入這三個文件,就可以調用里面的重載函數,完成對字符串的加密工作和對文件名的加密工作等等。

            posted on 2012-06-17 00:01 聶文龍 閱讀(1698) 評論(0)  編輯 收藏 引用
            久久天天躁夜夜躁狠狠躁2022 | 久久综合狠狠综合久久综合88| 欧美大战日韩91综合一区婷婷久久青草| 久久99国产精一区二区三区| 欧美伊人久久大香线蕉综合 | 久久www免费人成看国产片| 91久久精品电影| 国产69精品久久久久久人妻精品| 久久se精品一区二区| 久久黄视频| 国产精品九九久久免费视频 | 亚洲人成网站999久久久综合 | 99精品久久精品| 18岁日韩内射颜射午夜久久成人| 国产精品9999久久久久| 亚洲国产精品成人久久| 中文精品99久久国产| 久久国产精品成人影院| 久久精品国产第一区二区三区 | 久久中文字幕精品| 久久久91人妻无码精品蜜桃HD| 久久99热这里只频精品6| 99久久www免费人成精品| 久久天天躁狠狠躁夜夜96流白浆| 久久国产乱子伦精品免费午夜| 久久精品一本到99热免费| 久久亚洲中文字幕精品一区四| 97久久超碰国产精品2021| 日产精品久久久久久久| 久久亚洲视频| 四虎国产精品成人免费久久| 久久人人超碰精品CAOPOREN| www久久久天天com| 亚洲精品tv久久久久久久久 | 精品久久久久久久无码| 久久亚洲国产精品成人AV秋霞 | 99久久99久久精品免费看蜜桃| 国内精品久久久久影院薰衣草| 久久综合亚洲色一区二区三区| 亚洲精品无码专区久久同性男 | 国内精品久久久久久99蜜桃|