日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

C/C++ 常用加密与解密算法

發布時間:2023/11/26 windows 34 coder
生活随笔 收集整理的這篇文章主要介紹了 C/C++ 常用加密与解密算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

計算機安全和數據隱私是現代應用程序設計中至關重要的方面。為了確保數據的機密性和完整性,常常需要使用加密和解密算法。C++是一種廣泛使用的編程語言,提供了許多加密和解密算法的實現。本文將介紹一些在C++中常用的加密與解密算法,這其中包括Xor異或、BASE64、AES、MD5、SHA256、RSA等。

異或加解密

異或(XOR)加密算法是一種基于異或運算的簡單且常見的加密技術。在異或加密中,每個位上的值通過與一個密鑰位進行異或運算來改變。這種加密算法的簡單性和高效性使得它在某些場景下很有用,尤其是對于簡單的數據加密需求。

異或運算是一種邏輯運算,其規則如下:

  • 0 XOR 0 = 0
  • 0 XOR 1 = 1
  • 1 XOR 0 = 1
  • 1 XOR 1 = 0

在異或加密中,將明文與密鑰進行逐位異或運算。如果明文位和密鑰位相同,則結果為0;如果不同,則結果為1。這個過程是可逆的,即可以通過再次異或同樣的密鑰來還原原始明文。

#include <Windows.h>
#include <iostream>

using namespace std;

// 獲取異或整數
long GetXorKey(const char* StrPasswd)
{
	char cCode[32] = { 0 };
	strcpy(cCode, StrPasswd);
	DWORD Xor_Key = 0;
	for (unsigned int x = 0; x < strlen(cCode); x++)
	{
		Xor_Key = Xor_Key * 4 + cCode[x];
	}
	return Xor_Key;
}

// 異或為字符串
std::string XorEncrypt(std::string content, std::string secretKey)
{
	for (UINT i = 0; i < content.length(); i++)
	{
		content[i] ^= secretKey[i % secretKey.length()];
	}
	return content;
}

int main(int argc, char* argv[])
{
	// 計算加密密鑰
	long ref = GetXorKey("lyshark");
	std::cout << "計算異或密鑰: " << ref << std::endl;

	// 執行異或加密
	char szBuffer[1024] = "hello lyshark";
	for (int x = 0; x < strlen(szBuffer); x++)
	{
		szBuffer[x] = szBuffer[x] ^ ref;
		std::cout << "加密后: " << szBuffer[x] << std::endl;
	}

	// 直接異或字符串
	std::string xor_string = "hello lyshark";
	std::cout << "加密后: " << XorEncrypt(xor_string, "lyshark").c_str() << std::endl;

	system("pause");
	return 0;
}

運行后對特定字符串異或處理,如下圖;

BASE64加解密

Base64 是一種常見的編碼和解碼算法,用于將二進制數據轉換成可打印的 ASCII 字符串,以及將這樣的字符串還原回二進制數據。Base64 編碼是一種將二進制數據表示為 ASCII 字符的方式,廣泛應用于數據傳輸和存儲領域。

Base64 編碼基于一組 64 個字符的編碼表,通常包括大寫字母 A-Z、小寫字母 a-z、數字 0-9,以及兩個額外的字符 '+' 和 '/'。這樣的字符集是為了確保編碼后的數據是可打印的,并且在不同系統之間可以被準確傳輸。

編碼的過程如下:

  1. 將待編碼的數據劃分為每 3 個字節一組(24 位)。
  2. 將每組 3 個字節拆分成 4 個 6 位的塊。
  3. 每個 6 位的塊對應編碼表中的一個字符。
  4. 如果數據長度不是 3 的倍數,使用 '=' 字符進行填充。

解碼的過程是編碼的逆過程。

#include <iostream>
#include <Windows.h>

// base64 轉換表, 共64個
static const char base64_alphabet[] ={
	'A', 'B', 'C', 'D', 'E', 'F', 'G',
	'H', 'I', 'J', 'K', 'L', 'M', 'N',
	'O', 'P', 'Q', 'R', 'S', 'T',
	'U', 'V', 'W', 'X', 'Y', 'Z',
	'a', 'b', 'c', 'd', 'e', 'f', 'g',
	'h', 'i', 'j', 'k', 'l', 'm', 'n',
	'o', 'p', 'q', 'r', 's', 't',
	'u', 'v', 'w', 'x', 'y', 'z',
	'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
	'+', '/'
};

// 解碼時使用
static const unsigned char base64_suffix_map[256] = {
	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 253, 255,
	255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 255, 253, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63,
	52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255,
	255, 254, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6,
	7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
	19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255,
	255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,
	37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
	49, 50, 51, 255, 255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
	255, 255, 255, 255
};

static char cmove_bits(unsigned char src, unsigned lnum, unsigned rnum)
{
	src <<= lnum; // src = src << lnum;
	src >>= rnum; // src = src >> rnum;
	return src;
}

int base64_encode(const char* indata, int inlen, char* outdata, int* outlen)
{
	int ret = 0;
	if (indata == NULL || inlen == 0)
	{
		return ret = -1;
	}

	// 源字符串長度, 如果in_len不是3的倍數, 那么需要補成3的倍數
	int in_len = 0;

	// 需要補齊的字符個數, 這樣只有2, 1, 0(0的話不需要拼接, )
	int pad_num = 0; 
	if (inlen % 3 != 0)
	{
		pad_num = 3 - inlen % 3;
	}

	// 拼接后的長度, 實際編碼需要的長度(3的倍數)
	in_len = inlen + pad_num;

	// 編碼后的長度
	int out_len = in_len * 8 / 6;

	// 定義指針指向傳出data的首地址
	char* p = outdata;

	//編碼, 長度為調整后的長度, 3字節一組
	for (int i = 0; i < in_len; i += 3)
	{
		// 將indata第一個字符向右移動2bit(丟棄2bit)
		int value = *indata >> 2;

		// 對應base64轉換表的字符
		char c = base64_alphabet[value];

		// 將對應字符(編碼后字符)賦值給outdata第一字節
		*p = c;

		//處理最后一組(最后3字節)的數據
		if (i == inlen + pad_num - 3 && pad_num != 0)
		{
			if (pad_num == 1)
			{
				*(p + 1) = base64_alphabet[(int)(cmove_bits(*indata, 6, 2) + cmove_bits(*(indata + 1), 0, 4))];
				*(p + 2) = base64_alphabet[(int)cmove_bits(*(indata + 1), 4, 2)];
				*(p + 3) = '=';
			}
			else if (pad_num == 2)
			{
				// 編碼后的數據要補兩個 '='
				*(p + 1) = base64_alphabet[(int)cmove_bits(*indata, 6, 2)];
				*(p + 2) = '=';
				*(p + 3) = '=';
			}
		}
		else
		{
			// 處理正常的3字節的數據
			*(p + 1) = base64_alphabet[cmove_bits(*indata, 6, 2) + cmove_bits(*(indata + 1), 0, 4)];
			*(p + 2) = base64_alphabet[cmove_bits(*(indata + 1), 4, 2) + cmove_bits(*(indata + 2), 0, 6)];
			*(p + 3) = base64_alphabet[*(indata + 2) & 0x3f];
		}
		p += 4;
		indata += 3;
	}
	if (outlen != NULL)
	{
		*outlen = out_len;
	}
	return ret;
}

int base64_decode(const char* indata, int inlen, char* outdata, int* outlen)
{

	int ret = 0;
	if (indata == NULL || inlen <= 0 || outdata == NULL || outlen == NULL)
	{
		return ret = -1;
	}
	if (inlen % 4 != 0)
	{
		// 需要解碼的數據不是4字節倍數
		return ret = -2;
	}

	int t = 0, x = 0, y = 0, i = 0;
	unsigned char c = 0;
	int g = 3;

	while (indata[x] != 0)
	{
		// 需要解碼的數據對應的ASCII值對應base64_suffix_map的值
		c = base64_suffix_map[indata[x++]];

		// 對應的值不在轉碼表中
		if (c == 255)
			return -1;

		// 對應的值是換行或者回車
		if (c == 253)
			continue;

		if (c == 254)
		{
			// 對應的值是'='
			c = 0; g--;
		}

		// 將其依次放入一個int型中占3字節
		t = (t << 6) | c;

		if (++y == 4)
		{
			outdata[i++] = (unsigned char)((t >> 16) & 0xff);
			if (g > 1) outdata[i++] = (unsigned char)((t >> 8) & 0xff);
			if (g > 2) outdata[i++] = (unsigned char)(t & 0xff);
			y = t = 0;
		}
	}
	if (outlen != NULL)
	{
		*outlen = i;
	}
	return ret;
}

int main(int argc, char* argv[])
{
	char str1[] = "hello lyshark";
	char str3[30] = { 0 };
	char str2[30] = { 0 };
	int len = 0;

	base64_encode(str1, (int)strlen(str1), str2, &len);
	printf("加密后: %s 長度: %d\n", str2, len);

	base64_decode(str2, (int)strlen(str2), str3, &len);
	printf("解密后: %s 長度: %d\n", str3, len);

	system("pause");
	return 0;
}

運行后對特定字符串base64處理,如下圖;

AES對稱加解密

高級加密標準(Advanced Encryption Standard,AES)是一種對稱密鑰加密算法,廣泛用于保護敏感數據的機密性。AES 是一種塊密碼算法,支持不同的密鑰長度(128、192、256 比特),并且在安全性和性能之間取得了很好的平衡。

AES 操作在固定大小的數據塊上進行,每個數據塊大小為 128 比特(16 字節)。AES 使用稱為輪(rounds)的迭代結構來執行加密和解密。輪數取決于密鑰長度,分別為 10 輪(128 比特密鑰)、12 輪(192 比特密鑰)和 14 輪(256 比特密鑰)。AES可使用16、24或32字節密鑰(對應128、192和256位),AES分為ECB和CBC模式,處理的數據必須是塊大小16的倍數。

AES 的基本加密流程包括以下步驟:

  1. 密鑰擴展(Key Expansion): 根據輸入密鑰生成輪密鑰,用于后續的輪函數。
  2. 初始輪(Initial Round): 將明文與第一輪密鑰進行逐字節的異或操作。
  3. 輪運算(Rounds): 重復執行一系列輪函數,每輪包括四個操作:字節替代、行移位、列混淆和輪密鑰加。
  4. 最終輪(Final Round): 在最后一輪中,省略列混淆步驟。

AES 的解密過程與加密過程相似,但使用的是逆操作,如逆字節替代、逆行移位、逆列混淆和逆輪密鑰加。

CryptAcquireContext函數,用于獲取或創建與加密服務提供程序(CSP)相關聯的密碼學上下文。這個函數的目的是為了建立與加密服務提供程序相關的密碼學上下文,使得后續的加密操作可以在這個上下文中進行。

以下是CryptAcquireContext函數的一般格式:

BOOL CryptAcquireContext(
  HCRYPTPROV *phProv,
  LPCTSTR    pszContainer,
  LPCTSTR    pszProvider,
  DWORD      dwProvType,
  DWORD      dwFlags
);
  • phProv: 一個指向HCRYPTPROV類型的指針,用于接收密碼學上下文的句柄。
  • pszContainer: 字符串,指定與密鑰集關聯的容器名稱。可以為NULL,表示不使用容器。
  • pszProvider: 字符串,指定要使用的CSP的名稱。如果為NULL,將使用默認的提供程序。
  • dwProvType: 指定CSP的類型。例如,PROV_RSA_FULL表示使用RSA算法的提供程序。
  • dwFlags: 指定標志,控制函數的行為。例如,CRYPT_VERIFYCONTEXT表示驗證上下文,而不是嘗試使用特定的密鑰。

CryptCreateHash 函數,用于創建一個與密碼學上下文相關聯的哈希對象。哈希對象可用于計算數據的哈希值,常用于數字簽名、數據完整性驗證等安全操作。

以下是CryptCreateHash函數的一般格式:

BOOL CryptCreateHash(
  HCRYPTPROV hProv,
  ALG_ID     Algid,
  HCRYPTKEY  hKey,
  DWORD      dwFlags,
  HCRYPTHASH *phHash
);
  • hProv: 與哈希對象關聯的密碼學上下文的句柄。
  • Algid: 哈希算法的標識,例如CALG_MD5表示MD5算法。
  • hKey: 與哈希對象關聯的密鑰。在哈希計算中,通常不需要密鑰,因此可以將其設為NULL
  • dwFlags: 控制函數的行為的標志。一般設為0。
  • phHash: 一個指向HCRYPTHASH類型的指針,用于接收哈希對象的句柄。

成功調用該函數后,phHash將包含一個指向新創建的哈希對象的句柄,該對象與指定的密碼學上下文和哈希算法相關聯。

CryptHashData函數,用于將數據添加到哈希對象中,從而更新哈希值。它常用于在計算數字簽名或驗證數據完整性時,逐步處理數據塊并更新哈希值。

以下是CryptHashData函數的一般格式:

BOOL CryptHashData(
  HCRYPTHASH hHash,
  const BYTE *pbData,
  DWORD      dwDataLen,
  DWORD      dwFlags
);
  • hHash: 指向哈希對象的句柄。
  • pbData: 指向包含要添加到哈希對象的數據的緩沖區的指針。
  • dwDataLen: 數據緩沖區的字節數。
  • dwFlags: 控制函數的行為的標志。一般設為0。

成功調用后,哈希對象的狀態將被更新以反映已添加的數據,從而計算新的哈希值。這使得可以逐步處理大型數據,而不需要將整個數據加載到內存中。

CryptDeriveKey 函數,用于從一個密碼導出密鑰。這個函數通常用于從用戶提供的密碼生成對稱密鑰,這樣就可以用于加密或解密數據。

以下是 CryptDeriveKey 函數的一般格式:

BOOL CryptDeriveKey(
  HCRYPTPROV hProv,
  ALG_ID     Algid,
  HCRYPTHASH hBaseData,
  DWORD      dwFlags,
  HCRYPTKEY  *phKey
);
  • hProv: 一個有效的 CSP(Cryptographic Service Provider)句柄。
  • Algid: 密鑰算法標識符,指定要創建的密鑰類型。
  • hBaseData: 與密鑰生成相關的基本數據的哈希對象的句柄。可以為 NULL
  • dwFlags: 控制函數的行為的標志。一般設為 0。
  • phKey: 指向 HCRYPTKEY 類型的指針,用于接收生成的密鑰的句柄。

成功調用后,phKey 將包含一個新的密鑰句柄,可以用于后續的加密和解密操作。密鑰的具體屬性(比如大小)由 Algid 參數決定。

CryptEncrypt 函數,用于對數據進行加密。這個函數通常用于加密一個數據塊,例如一個文件或一個消息。

以下是 CryptEncrypt 函數的一般格式:

BOOL CryptEncrypt(
  HCRYPTKEY hKey,
  HCRYPTHASH hHash,
  BOOL      Final,
  DWORD     dwFlags,
  BYTE      *pbData,
  DWORD     *pdwDataLen,
  DWORD     dwBufLen
);
  • hKey: 用于加密數據的密鑰的句柄。
  • hHash: 句柄,指定一個哈希對象。對稱算法不需要哈希,因此可以為 NULL
  • Final: 指定是否是最后一個數據塊。如果是最后一個數據塊,將設置為 TRUE
  • dwFlags: 控制函數的行為的標志。一般設為 0。
  • pbData: 指向要加密的數據的指針。
  • pdwDataLen: 指向一個變量,用于輸入數據的大小,輸出加密后數據的大小。
  • dwBufLen: 緩沖區的大小。

成功調用后,pbData 將包含加密后的數據。pdwDataLen 將包含加密后數據的實際大小。

CryptDecrypt 函數,用于對數據進行解密。這個函數通常用于解密一個數據塊,例如一個文件或一個消息。

以下是 CryptDecrypt 函數的一般格式:

BOOL CryptDecrypt(
  HCRYPTKEY hKey,
  HCRYPTHASH hHash,
  BOOL      Final,
  DWORD     dwFlags,
  BYTE      *pbData,
  DWORD     *pdwDataLen
);
  • hKey: 用于解密數據的密鑰的句柄。
  • hHash: 句柄,指定一個哈希對象。對稱算法不需要哈希,因此可以為 NULL
  • Final: 指定是否是最后一個數據塊。如果是最后一個數據塊,將設置為 TRUE
  • dwFlags: 控制函數的行為的標志。一般設為 0。
  • pbData: 指向要解密的數據的指針。
  • pdwDataLen: 指向一個變量,用于輸入解密前數據的大小,輸出解密后數據的大小。

成功調用后,pbData 將包含解密后的數據。pdwDataLen 將包含解密后數據的實際大小。

#include <stdio.h>
#include <Windows.h>

// AES加密
BOOL AesEncrypt(BYTE* pPassword, BYTE* pData, DWORD& dwDataLength, DWORD dwBufferLength)
{
	BOOL bRet = TRUE;
	HCRYPTPROV hCryptProv = NULL;
	HCRYPTHASH hCryptHash = NULL;
	HCRYPTKEY hCryptKey = NULL;
	DWORD dwPasswordLength = strlen((char*)pPassword);
	do
	{
		bRet = CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
		bRet = CryptCreateHash(hCryptProv, CALG_MD5, NULL, 0, &hCryptHash);
		bRet = CryptHashData(hCryptHash, pPassword, dwPasswordLength, 0);
		bRet = CryptDeriveKey(hCryptProv, CALG_AES_128, hCryptHash, CRYPT_EXPORTABLE, &hCryptKey);
		bRet = CryptEncrypt(hCryptKey, NULL, TRUE, 0, pData, &dwDataLength, dwBufferLength);
	} while (FALSE);

	if (hCryptKey || hCryptHash || hCryptProv)
	{
		CryptDestroyKey(hCryptKey);
		CryptDestroyHash(hCryptHash);
		CryptReleaseContext(hCryptProv, 0);
	}
	return bRet;
}

// AES解密
BOOL AesDecrypt(BYTE* pPassword, BYTE* pData, DWORD& dwDataLength, DWORD dwBufferLength)
{
	BOOL bRet = TRUE;
	HCRYPTPROV hCryptProv = NULL;
	HCRYPTHASH hCryptHash = NULL;
	HCRYPTKEY hCryptKey = NULL;
	DWORD dwPasswordLength = strlen((char*)pPassword);

	do
	{
		bRet = CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
		bRet = CryptCreateHash(hCryptProv, CALG_MD5, NULL, 0, &hCryptHash);
		bRet = CryptHashData(hCryptHash, pPassword, dwPasswordLength, 0);
		bRet = CryptDeriveKey(hCryptProv, CALG_AES_128, hCryptHash, CRYPT_EXPORTABLE, &hCryptKey);
		bRet = CryptDecrypt(hCryptKey, NULL, TRUE, 0, pData, &dwDataLength);
	} while (FALSE);

	if (hCryptKey || hCryptHash || hCryptProv)
	{
		CryptDestroyKey(hCryptKey);
		CryptDestroyHash(hCryptHash);
		CryptReleaseContext(hCryptProv, 0);
	}
	return bRet;
}

int main(int argc, char* argv[])
{
	BYTE pData[MAX_PATH] = { 0 };
	DWORD dwDataLength = 0;
	char* Msg = (char *)"hello lyshark";

	strcpy((char*)pData, Msg);
	dwDataLength = 1 + ::strlen((char*)pData);

	// AES 加密
	AesEncrypt((BYTE*)"123321", pData, dwDataLength, MAX_PATH);
	printf("AES 加密長度: %d 加密后: %s \n", dwDataLength, pData);

	// AES 解密
	AesDecrypt((BYTE*)"123321", pData, dwDataLength, MAX_PATH);
	printf("AES 解密長度: %d 解密后: %s \n", dwDataLength, pData);

	system("pause");
	return 0;
}

上述代碼運行,實現對特定字符串hello lyshark加密,并使用密碼123321,如下圖所示;

MD5/SHA256單向加解密

MD5(Message Digest Algorithm 5)是一種廣泛使用的哈希函數,常用于生成數據的數字簽名。MD5 產生的哈希值(摘要)通常是一個 128 位的十六進制數字,通常表示為 32 個字符。盡管 MD5 在過去廣泛用于校驗文件完整性和生成密碼散列,但由于其容易受到碰撞攻擊的影響,現在已被更安全的哈希算法如 SHA-256 取代。

MD5 是一種不可逆的哈希函數,其核心原理包括以下幾步:

  1. 填充: 對輸入數據進行填充,使其長度滿足 512 位的倍數,并在數據尾部附加原始數據長度的二進制表示。
  2. 初始化: 初始化 128 位的緩沖區,用于存儲中間計算結果。
  3. 處理塊: 將填充后的數據按照 512 位的塊進行劃分,每個塊進行一系列的運算,更新緩沖區。
  4. 輸出: 將最終得到的緩沖區內容作為 MD5 的輸出。

MD5 的核心操作主要包括四輪循環,每輪循環包含 16 次操作。這些操作涉及位運算、邏輯運算和模運算等,以及對緩沖區內容的不斷更新。

SHA-256(Secure Hash Algorithm 256-bit)是 SHA-2 家族中的一員,是一種廣泛使用的密碼哈希函數。SHA-256 生成的哈希值長度為 256 位,通常以 64 個字符的十六進制字符串表示。SHA-256 在密碼學和數據完整性驗證中得到廣泛應用,被認為是一種安全可靠的哈希算法。

SHA-256 的基本原理與 MD5 類似,但具有更復雜的設計和更長的輸出長度。其核心過程包括以下幾個步驟:

  1. 填充: 將輸入數據填充到滿足 512 位塊大小的倍數,并在數據尾部添加原始數據長度的二進制表示。
  2. 初始化: 初始化 256 位的緩沖區,用于存儲中間計算結果。
  3. 處理塊: 將填充后的數據按照 512 位的塊進行劃分,每個塊進行一系列的運算,更新緩沖區。
  4. 輸出: 將最終得到的緩沖區內容作為 SHA-256 的輸出。

SHA-256 的核心操作包括四輪循環,每輪循環包含 64 次操作。這些操作包括位運算、邏輯運算、模運算等,以及對緩沖區內容的不斷更新。

CryptAcquireContext 函數,用于獲取密碼學上下文句柄。這個函數通常是在進行加密和解密操作之前調用的第一步。

以下是 CryptAcquireContext 函數的一般格式:

BOOL CryptAcquireContext(
  HCRYPTPROV *phProv,
  LPCTSTR    pszContainer,
  LPCTSTR    pszProvider,
  DWORD      dwProvType,
  DWORD      dwFlags
);
  • phProv: 用于接收密碼學上下文句柄的指針。
  • pszContainer: 指定密鑰容器的名稱。可以為 NULL
  • pszProvider: 指定加密服務提供者的名稱。可以為 NULL
  • dwProvType: 指定提供者類型。常見的類型包括 PROV_RSA_FULLPROV_RSA_AES 等。
  • dwFlags: 控制函數的行為的標志。通常為 0。

成功調用后,phProv 將包含一個密碼學上下文句柄,該句柄用于后續的加密和解密操作。

CryptGetHashParam 函數,用于檢索哈希對象的參數。哈希對象是用于計算數據摘要的對象,通常在密碼學操作中使用。

以下是 CryptGetHashParam 函數的一般格式:

BOOL CryptGetHashParam(
  HCRYPTHASH hHash,
  DWORD      dwParam,
  BYTE       *pbData,
  DWORD      *pdwDataLen,
  DWORD      dwFlags
);
  • hHash: 哈希對象的句柄。
  • dwParam: 指定要檢索的參數類型。常見的參數類型包括 HP_HASHVAL(獲取哈希值)和 HP_HASHSIZE(獲取哈希值的大小)等。
  • pbData: 用于接收參數數據的緩沖區。
  • pdwDataLen: 用于指定輸入緩沖區的大小,并在成功調用后包含實際返回的數據長度。
  • dwFlags: 控制函數的行為的標志。通常為 0。

成功調用后,pbData 緩沖區中將包含請求的參數數據。

CryptDestroyHash 函數,用于銷毀哈希對象。哈希對象是在進行哈希計算時創建的對象,使用完畢后需要通過 CryptDestroyHash 來釋放相關資源。

以下是 CryptDestroyHash 函數的一般格式:

BOOL CryptDestroyHash(
  HCRYPTHASH hHash
);
  • hHash: 要銷毀的哈希對象的句柄。

函數返回一個布爾值,表示是否成功銷毀哈希對象。如果成功,返回 TRUE,否則返回 FALSE

CryptReleaseContext 函數,用于釋放密碼學上下文。密碼學上下文是在進行加密或哈希操作時所創建的,使用完畢后需要通過 CryptReleaseContext 來釋放相關資源。

以下是 CryptReleaseContext 函數的一般格式:

BOOL CryptReleaseContext(
  HCRYPTPROV hProv,
  DWORD      dwFlags
);
  • hProv: 要釋放的密碼學上下文的句柄。
  • dwFlags: 一組標志,通常可以設置為零。

函數返回一個布爾值,表示是否成功釋放密碼學上下文。如果成功,返回 TRUE,否則返回 FALSE

這兩個算法都是單向加密算法,其可以將一段任意字符串壓縮為一個唯一常數。

#include <stdio.h>
#include <Windows.h>

BOOL CalculateHash(BYTE* pData, DWORD dwDataLength, ALG_ID algHashType, BYTE** ppHashData, DWORD* pdwHashDataLength)
{
	HCRYPTPROV hCryptProv = NULL;
	HCRYPTHASH hCryptHash = NULL;
	BYTE* pHashData = NULL;
	DWORD dwHashDataLength = 0;
	DWORD dwTemp = 0;
	BOOL bRet = FALSE;
	do
	{
		bRet = CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
		bRet = CryptCreateHash(hCryptProv, algHashType, NULL, NULL, &hCryptHash);
		bRet = CryptHashData(hCryptHash, pData, dwDataLength, 0);
		dwTemp = sizeof(dwHashDataLength);
		bRet = CryptGetHashParam(hCryptHash, HP_HASHSIZE, (BYTE*)(&dwHashDataLength), &dwTemp, 0);
		pHashData = new BYTE[dwHashDataLength];
		RtlZeroMemory(pHashData, dwHashDataLength);
		bRet = ::CryptGetHashParam(hCryptHash, HP_HASHVAL, pHashData, &dwHashDataLength, 0);
		*ppHashData = pHashData;
		*pdwHashDataLength = dwHashDataLength;
	} while (FALSE);

	if (FALSE == bRet)
	{
		if (pHashData)
		{
			delete[]pHashData;
			pHashData = NULL;
		}
	}
	if (hCryptHash || hCryptProv)
	{
		CryptDestroyHash(hCryptHash);
		CryptReleaseContext(hCryptProv, 0);
	}
	return bRet;
}

int main(int argc, char* argv[])
{
	char szBuf[1024] = "hello lyshark";
	BYTE* pHashData = NULL;
	DWORD dwHashDataLength = 0;

	// MD5
	CalculateHash((BYTE *)szBuf, strlen(szBuf), CALG_MD5, &pHashData, &dwHashDataLength);

	for (DWORD x = 0; x < dwHashDataLength; x++)
	{
		printf("%x", pHashData[x]);
	}

	printf("\n");

	// SHA256
	CalculateHash((BYTE *)szBuf, strlen(szBuf), CALG_SHA_256, &pHashData, &dwHashDataLength);
	for (DWORD x = 0; x < dwHashDataLength; x++)
	{
		printf("%x", pHashData[x]);
	}

	delete[]pHashData;
	pHashData = NULL;

	system("pause");
	return 0;
}

上述代碼運行后,則可以計算出hello lyshark字符串的md5以及sha256摘要信息,如下所示;

RSA對稱加解密

RSA(Rivest–Shamir–Adleman)是一種非對稱加密算法,于1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩米爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)三位密碼學家提出。RSA算法基于兩個大素數的乘積的難解性問題,它廣泛用于安全通信和數字簽名等領域。

RSA算法涉及到兩個密鑰:公鑰和私鑰。其中,公鑰用于加密,私鑰用于解密。其基本原理建立在兩個數論問題上:

  • 大整數分解問題: 將一個大合數分解為兩個質數的乘積的難度。
  • 歐拉函數和模反演問題: 利用歐拉函數和模反演性質,確保僅有私鑰的持有者能夠有效地解密。

RSA算法的密鑰生成過程包括以下步驟:

  1. 選擇兩個大素數 p 和 q。
  2. 計算 n = pq,n 稱為模數。
  3. 計算歐拉函數 φ(n) = (p-1)(q-1)。
  4. 選擇公鑰 e,滿足 1 < e < φ(n),且 e 與 φ(n) 互質。
  5. 計算私鑰 d,使得 de ≡ 1 (mod φ(n))。

公鑰是 (n, e),私鑰是 (n, d)。

加密和解密過程如下:

RSA算法的安全性基于大整數分解問題的困難性,即在已知 n 的情況下,要找到 pq 的乘積。當 n 非常大時,這一過程變得非常耗時,使得RSA算法在當前的計算資源下被廣泛應用于加密通信和數字簽名。

CryptGenKey 是 Windows Cryptographic API (CryptoAPI) 中的一個函數,用于生成密鑰。該函數允許應用程序生成對稱密鑰、非對稱密鑰對以及用于哈希的密鑰。

以下是 CryptGenKey 函數的一般格式:

BOOL CryptGenKey(
  HCRYPTPROV hProv,
  ALG_ID     Algid,
  DWORD      dwFlags,
  HCRYPTKEY  *phKey
);
  • hProv: 用于生成密鑰的密碼學服務提供者 (CSP) 的句柄。
  • Algid: 標識要生成的密鑰類型,可以是對稱密鑰算法、非對稱密鑰算法或用于哈希的密鑰算法。
  • dwFlags: 控制密鑰生成的標志。對于不同的密鑰類型,可能有不同的標志。
  • phKey: 生成的密鑰的句柄。

函數返回一個布爾值,表示是否成功生成密鑰。如果成功,返回 TRUE,否則返回 FALSE

CryptExportKey 函數是 Windows Cryptographic API (CryptoAPI) 中的一個函數,用于導出密鑰的原始或簡單 BLOB 格式。密鑰 BLOB 包含密鑰的完整信息,以便在不同的系統或進程之間傳輸密鑰。

以下是 CryptExportKey 函數的一般格式:

BOOL CryptExportKey(
  HCRYPTKEY hKey,
  HCRYPTKEY hExpKey,
  DWORD     dwBlobType,
  DWORD     dwFlags,
  BYTE      *pbData,
  DWORD     *pdwDataLen
);
  • hKey: 要導出的密鑰的句柄。
  • hExpKey: 導出密鑰的密碼學服務提供者 (CSP) 句柄。通常,使用與 hKey 相同的 CSP。
  • dwBlobType: 導出的 BLOB 類型,可以是簡單 BLOB 或原始 BLOB。
  • dwFlags: 導出操作的標志。
  • pbData: 用于接收導出的密鑰 BLOB 的緩沖區。
  • pdwDataLen: 指向存儲密鑰 BLOB 大小的變量的指針。在調用函數之前,應將其設置為緩沖區的大小;在調用函數后,它將包含實際寫入緩沖區的字節數。

函數返回一個布爾值,表示是否成功導出密鑰。如果成功,返回 TRUE,否則返回 FALSE

CryptImportKey 函數是 Windows Cryptographic API (CryptoAPI) 中的一個函數,用于導入密鑰的原始或簡單 BLOB 格式。該函數通常與 CryptExportKey 函數一起使用,用于在不同的系統或進程之間傳輸密鑰。

以下是 CryptImportKey 函數的一般格式:

BOOL CryptImportKey(
  HCRYPTPROV hProv,
  const BYTE *pbData,
  DWORD      dwDataLen,
  HCRYPTKEY  hPubKey,
  DWORD      dwFlags,
  HCRYPTKEY  *phKey
);
  • hProv: 密鑰將與之關聯的密碼學服務提供者 (CSP) 的句柄。
  • pbData: 包含要導入的密鑰 BLOB 的緩沖區的指針。
  • dwDataLen: 密鑰 BLOB 的長度(以字節為單位)。
  • hPubKey: 用于解密密鑰 BLOB 的公鑰的句柄。
  • dwFlags: 導入密鑰的標志。
  • phKey: 指向導入的密鑰的句柄的指針。

函數返回一個布爾值,表示是否成功導入密鑰。如果成功,返回 TRUE,否則返回 FALSE

RSA算法包括公鑰與私鑰兩部,加密時會先使用RSA生成公鑰與私鑰,然后在進行加密。

#include <iostream>
#include <Windows.h>

using namespace std;

// 生成公鑰和私鑰
BOOL GenerateKey(BYTE **ppPublicKey, DWORD *pdwPublicKeyLength, BYTE **ppPrivateKey, DWORD *pdwPrivateKeyLength)
{
  BOOL bRet = TRUE;
  HCRYPTPROV hCryptProv = NULL;
  HCRYPTKEY hCryptKey = NULL;
  BYTE *pPublicKey = NULL;
  DWORD dwPublicKeyLength = 0;
  BYTE *pPrivateKey = NULL;
  DWORD dwPrivateKeyLength = 0;

  do
  {
    bRet = CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0);
    if (FALSE == bRet)
      break;
    bRet = CryptGenKey(hCryptProv, AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &hCryptKey);
    if (FALSE == bRet)
      break;
    bRet = CryptExportKey(hCryptKey, NULL, PUBLICKEYBLOB, 0, NULL, &dwPublicKeyLength);
    if (FALSE == bRet)
      break;
    pPublicKey = new BYTE[dwPublicKeyLength];
    RtlZeroMemory(pPublicKey, dwPublicKeyLength);
    bRet = CryptExportKey(hCryptKey, NULL, PUBLICKEYBLOB, 0, pPublicKey, &dwPublicKeyLength);
    if (FALSE == bRet)
      break;
    bRet = CryptExportKey(hCryptKey, NULL, PRIVATEKEYBLOB, 0, NULL, &dwPrivateKeyLength);
    if (FALSE == bRet)
      break;

    pPrivateKey = new BYTE[dwPrivateKeyLength];
    RtlZeroMemory(pPrivateKey, dwPrivateKeyLength);
    bRet = CryptExportKey(hCryptKey, NULL, PRIVATEKEYBLOB, 0, pPrivateKey, &dwPrivateKeyLength);
    if (FALSE == bRet)
      break;

    *ppPublicKey = pPublicKey;
    *pdwPublicKeyLength = dwPublicKeyLength;
    *ppPrivateKey = pPrivateKey;
    *pdwPrivateKeyLength = dwPrivateKeyLength;

  } while (FALSE);

  if (hCryptKey)
    CryptDestroyKey(hCryptKey);
  if (hCryptProv)
    CryptReleaseContext(hCryptProv, 0);
  return bRet;
}

// 公鑰加密數據
BOOL RsaEncrypt(BYTE *pPublicKey, DWORD dwPublicKeyLength, BYTE *pData, DWORD &dwDataLength, DWORD dwBufferLength)
{
  BOOL bRet = TRUE;
  HCRYPTPROV hCryptProv = NULL;
  HCRYPTKEY hCryptKey = NULL;

  do
  {
    bRet = CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0);
    if (FALSE == bRet)
      break;
    bRet = CryptImportKey(hCryptProv, pPublicKey, dwPublicKeyLength, NULL, 0, &hCryptKey);
    if (FALSE == bRet)
      break;
    bRet = CryptEncrypt(hCryptKey, NULL, TRUE, 0, pData, &dwDataLength, dwBufferLength);
    if (FALSE == bRet)
      break;
  } while (FALSE);
    
  if (hCryptKey)
    CryptDestroyKey(hCryptKey);
  if (hCryptProv)
    CryptReleaseContext(hCryptProv, 0);
  return bRet;
}

// 私鑰解密數據
BOOL RsaDecrypt(BYTE *pPrivateKey, DWORD dwProvateKeyLength, BYTE *pData, DWORD &dwDataLength)
{
  BOOL bRet = TRUE;
  HCRYPTPROV hCryptProv = NULL;
  HCRYPTKEY hCryptKey = NULL;

  do
  {
    bRet = CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_RSA_FULL, 0);
    if (FALSE == bRet)
      break;
    bRet = CryptImportKey(hCryptProv, pPrivateKey, dwProvateKeyLength, NULL, 0, &hCryptKey);
    if (FALSE == bRet)
      break;
    bRet = CryptDecrypt(hCryptKey, NULL, TRUE, 0, pData, &dwDataLength);
    if (FALSE == bRet)
      break;
  } while (FALSE);

  if (hCryptKey)
    CryptDestroyKey(hCryptKey);
  if (hCryptProv)
    CryptReleaseContext(hCryptProv, 0);
  return bRet;
}

int main(int argc, char * argv[])
{
  BYTE *pPublicKey = NULL;
  DWORD dwPublicKeyLength = 0;
  BYTE *pPrivateKey = NULL;
  DWORD dwPrivateKeyLength = 0;
  BYTE *pData = NULL;
  DWORD dwDataLength = 0;
  DWORD dwBufferLength = 4096;

  pData = new BYTE[dwBufferLength];

  RtlZeroMemory(pData, dwBufferLength);
  lstrcpy((char *)pData, "hello lyshark");
  dwDataLength = 1 + lstrlen((char *)pData);

  // 輸出加密前原始數據
  printf("加密前原始數據: ");
  for (int i = 0; i < dwDataLength; i++)
    printf("%x", pData[i]);
  printf("\n\n");

  // 生成公鑰和私鑰
  GenerateKey(&pPublicKey, &dwPublicKeyLength, &pPrivateKey, &dwPrivateKeyLength);
  printf("公鑰: ");
  for (int i = 0; i < dwPublicKeyLength; i++)
    printf("%.2x", pPublicKey[i]);
  printf("\n\n");

  printf("私鑰: ");
  for (int i = 0; i < dwPrivateKeyLength; i++)
    printf("%.2x", pPrivateKey[i]);
  printf("\n\n");

  // 使用公鑰加密
  RsaEncrypt(pPublicKey, dwPublicKeyLength, pData, dwDataLength, dwBufferLength);
  printf("公鑰加密: ");
  for (int i = 0; i < dwDataLength; i++)
    printf("%x", pData[i]);
  printf("\n\n");

  // 使用私鑰解密
  RsaDecrypt(pPrivateKey, dwPrivateKeyLength, pData, dwDataLength);
  printf("私鑰解密: ");
  for (int i = 0; i < dwDataLength; i++)
    printf("%x", pData[i]);
  printf("\n\n");

  delete[]pData;
  delete[]pPrivateKey;
  delete[]pPublicKey;
  system("pause");
  return 0;
}

運行后生成公鑰與私鑰,并對字符串加密與解密,如下圖所示;

總結

以上是生活随笔為你收集整理的C/C++ 常用加密与解密算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

av网站地址 | 在线视频一二三 | 毛片在线网 | 97精品国产97久久久久久春色 | 午夜国产成人 | 亚洲国产中文字幕在线视频综合 | 亚洲片在线资源 | 久久在线 | 亚洲专区在线播放 | 天天干天天射天天操 | 精品一二三四五区 | 黄色一级动作片 | 在线免费国产视频 | 成人午夜影院在线观看 | 久久国产精品系列 | 中国一级特黄毛片大片久久 | 精品国产一区二区三区四区在线观看 | 久久精品这里热有精品 | 天天操天天怕 | 久久综合色婷婷 | 亚洲精品国 | 欧美日韩精品在线观看视频 | 久久伊人八月婷婷综合激情 | av在线播放国产 | 1024久久| 看片的网址 | 亚洲美女免费精品视频在线观看 | 97超碰国产精品 | 中文字幕第一页av | 97av超碰| 999日韩| 深夜成人av | 国产精品久久一卡二卡 | 91亚洲精品久久久久图片蜜桃 | 中文字幕在线观看你懂的 | 免费看黄色小说的网站 | 日韩影视大全 | 国产精品免费久久久 | 91高清不卡| 久久久久亚洲国产精品 | 天天干天天玩天天操 | 五月婷婷精品 | 亚洲黄色大片 | 亚洲美女免费视频 | 亚洲午夜久久久久久久久 | 婷婷五月情 | 五月开心六月伊人色婷婷 | 欧美日韩啪啪 | 麻豆视频免费入口 | 精品久久国产 | 日韩午夜精品福利 | 免费观看91视频 | 91香蕉视频720p | 亚洲女同videos | 国产一级电影免费观看 | 丁香六月伊人 | 久久人人做 | 欧美日韩成人一区 | 国产免费亚洲 | 一区二区三区免费播放 | 久草免费福利在线观看 | 欧美日韩高清一区二区 国产亚洲免费看 | 色婷婷丁香 | 国产精品久久久久永久免费看 | av东方在线| 精品国产免费看 | 久久99精品一区二区三区三区 | 美女网站在线观看 | 91网站免费观看 | 日韩电影久久 | 9999在线| 天天色天天干天天色 | 免费能看的av | 五月天婷婷综合 | 韩国精品一区二区三区六区色诱 | 综合国产在线观看 | 最新中文字幕在线播放 | 精品人妖videos欧美人妖 | 亚洲精品国 | 亚洲黄色在线观看 | 丁香六月av | 久久免费视频精品 | 日韩影视大全 | 国产精品欧美一区二区 | 99视频在线观看免费 | 网站免费黄色 | 久久这里只有精品视频99 | 精品免费观看 | 97超碰福利久久精品 | 色视频网页 | 色狠狠婷婷 | 久久国内视频 | 91一区二区三区久久久久国产乱 | 日韩综合精品 | 久久精品国产精品亚洲 | 97超碰国产精品女人人人爽 | 国产免费成人av | 在线亚洲高清视频 | 色综合天天在线 | 丁香五婷 | 日韩av图片| 国产美女免费观看 | 成人久久毛片 | 特黄色大片 | 中文字幕最新精品 | 亚洲国产成人在线 | 不卡国产视频 | 国产成人精品久久二区二区 | 美女黄频免费 | 久久久久久久久久免费 | 人人澡澡人人 | 麻豆成人精品 | 天天色天天搞 | 欧美日韩视频 | 日韩电影中文,亚洲精品乱码 | 成人黄色片免费 | 国产精品久久电影观看 | 欧美激情精品一区 | 手机看片1042 | 国产黄色大片 | 亚洲干| 色综合激情久久 | 久久99最新地址 | 国际精品久久 | 久久综合99| 亚洲天堂网在线播放 | a在线视频v视频 | 国产午夜三级一区二区三 | 97碰碰精品嫩模在线播放 | www婷婷 | 欧美性爽爽 | 最近日本韩国中文字幕 | 久草视频中文在线 | 依人成人综合网 | 国产美女主播精品一区二区三区 | 亚洲精品日韩一区二区电影 | 亚洲精品播放 | 99精品视频在线 | 欧美巨大 | 人人爱人人舔 | 91中文字幕一区 | 亚洲免费成人 | 丝袜美腿亚洲 | 欧美日韩18 | 久久人人射 | 91日韩免费 | 国产精品欧美一区二区三区不卡 | 欧美一级日韩免费不卡 | 日韩精品免费一线在线观看 | 久久久综合九色合综国产精品 | 狠狠干婷婷色 | 午夜久久久久久久 | 99c视频在线 | 欧美日韩高清一区二区三区 | 99c视频在线 | 激情婷婷久久 | 国产免费精彩视频 | 亚洲欧美偷拍另类 | 欧美精品久久久久久久久久久 | 日韩欧美视频在线播放 | 最近中文字幕免费大全 | 国产亚州av| 国产大片黄色 | 婷婷日韩 | 欧美一区二区三区免费看 | 91理论电影 | 国产精品自拍在线 | 黄色软件网站在线观看 | www.色的| 日日夜夜骑 | 日韩视频免费观看高清 | 久久一久久| 久久久噜噜噜久久久 | 欧美成人h版 | 中文字幕在线观看日本 | 在线看一区 | 国产99在线播放 | 女人魂免费观看 | 天堂在线免费视频 | 麻豆视频在线观看免费 | 91精品国产99久久久久 | 久久精品99精品国产香蕉 | 中国成人一区 | 欧美日本不卡高清 | 在线亚洲人成电影网站色www | 天天综合色 | 国产999精品久久久久久 | 国产精品第二页 | 日韩二区三区在线 | 人人干人人搞 | 欧美久久久影院 | 国产精品久久久久久久久婷婷 | 日韩在线观 | www.久久91 | 99精品国产免费久久 | 国产成人三级在线观看 | 国产精品24小时在线观看 | 久久久久久久久久网 | 日本字幕网| 国产精品激情偷乱一区二区∴ | 国产 视频 久久 | 国产精品孕妇 | 91视频3p| 日日骑 | 日韩动态视频 | 欧美激情另类 | 美女免费网站 | 中文字幕一区在线 | 911在线| 精品高清视频 | 中文字幕二区 | 一区二区精品视频 | 不卡的av中文字幕 | 久久99亚洲精品 | 国产黄色特级片 | 日日成人网 | 日韩精品久久久免费观看夜色 | 国产精品综合久久久久久 | 精精国产xxxx视频在线播放 | 免费看黄在线看 | 91九色视频在线播放 | 午夜精品电影 | 国产免费影院 | 亚洲国产高清在线观看视频 | 五月激情电影 | www五月天com| 在线视频app | 日韩最新在线视频 | 欧美乱码精品一区二区 | 天天爱天天操天天爽 | 欧美精品一区二区在线播放 | 人人舔人人干 | 国产免费观看高清完整版 | 色婷婷免费视频 | 综合国产在线 | 久久精品亚洲精品国产欧美 | 久久免费视频网站 | 国产日韩欧美在线看 | 麻豆免费视频网站 | 久久精品精品 | 天天综合入口 | 亚洲人成免费网站 | 国产亚洲精品久久 | 黄色精品在线看 | 色在线网站| 国产精品一区二区麻豆 | 91免费网 | 亚洲专区在线播放 | 日韩黄色免费电影 | 啪啪午夜免费 | 国产经典av | 青春草视频 | 人人爽人人爽人人片 | 97视频在线观看播放 | 99精品国产aⅴ | 亚洲精品电影在线 | 亚洲欧洲视频 | 久久久人人人 | 午夜久久久久久久久久久 | 国产美女视频一区 | 国产精品18久久久久久久网站 | 久久久天堂 | 2023av在线| 天天干夜夜爱 | 久久久综合九色合综国产精品 | 蜜臀精品久久久久久蜜臀 | 91麻豆免费版 | 黄色在线观看www | 亚洲精品午夜久久久 | 国产69久久| 九色福利视频 | 久久综合视频网 | 国产精品va视频 | 综合色站导航 | 97人人爽人人 | www.久久久.cum| 久久99免费视频 | 精品视频在线免费观看 | 欧美伦理一区二区 | 91精品视频免费观看 | 日韩在线免费高清视频 | 亚洲一区二区天堂 | 亚洲香蕉在线观看 | 九九久久婷婷 | 久久99热这里只有精品国产 | 国产.精品.日韩.另类.中文.在线.播放 | 亚洲激情av| 国产黄色成人av | 国产美腿白丝袜足在线av | 91精品老司机久久一区啪 | 日本中文字幕在线观看 | 国产一区二区久久精品 | 精品一区 在线 | 91日本在线播放 | 欧美二区在线播放 | 久久成人毛片 | 欧美乱码精品一区二区 | 亚洲最大成人免费网站 | 亚洲黄色高清 | 中文字幕视频网站 | 色欧美成人精品a∨在线观看 | 久久国内视频 | 国产视频一级 | 一级黄色毛片 | 国产专区一 | 亚洲婷婷在线视频 | 91av片| 91久久精品一区二区二区 | 日韩av黄 | 白丝av免费观看 | a级片网站 | 视频 国产区 | 伊人射 | 中文av在线免费观看 | av福利在线看 | 久草手机视频 | 日韩av免费网站 | 日日日日干 | 有码中文字幕在线观看 | 91精品在线免费观看视频 | 97超碰在线免费 | 国产精品伦一区二区三区视频 | 国产视频日韩视频欧美视频 | 欧美性免费 | 国产精品久久久 | 天天操夜夜操 | 亚洲成人精品在线 | 欧美爽爽爽 | 精品综合久久 | 国产一区二区三区高清播放 | 国产精品热视频 | 日韩免费一区 | 超碰97人人在线 | 成人免费视频播放 | 97在线看| 欧美成人xxx | 日日爽天天爽 | 久久久久久国产精品999 | 国产视频精品久久 | 色五丁香| 成人动漫一区二区三区 | av中文字幕网| 色狠狠综合 | 九九九九热精品免费视频点播观看 | 久草影视在线观看 | 色美女在线 | 国产一区二三区好的 | 久久6精品 | 婷婷色视频 | av免费播放 | 国产免费成人 | 日日干日日 | 国产精品门事件 | 久久九九影视网 | 国产视频精选在线 | 国产成人精品一区二区在线观看 | 免费在线激情电影 | 国产亚洲精品美女 | av动态图片 | 天堂视频一区 | 蜜桃av久久久亚洲精品 | 亚洲精品高清视频在线观看 | 91自拍视频在线观看 | 超碰在线个人 | av在线免费在线观看 | 亚洲精品白浆高清久久久久久 | 狠狠躁18三区二区一区ai明星 | 成年人看片网站 | 亚洲国内精品在线 | 一区中文字幕在线观看 | 91福利视频免费 | 久久精品直播 | 国产精品美女久久久久久久久 | 人人爱天天操 | 国产手机在线播放 | 草久热 | 天天操天天综合网 | 亚洲精品中文字幕在线观看 | 美女天天操 | 欧洲一区二区三区精品 | 日韩在线免费电影 | 久久99电影| 日韩美女久久 | 亚洲永久精品视频 | 国产精品女视频 | 中文字幕一区二区三区乱码不卡 | 在线观看视频99 | 精品视频www | 免费在线观看av网站 | 日韩精品一区二区三区高清免费 | 夜夜操天天 | 欧美日韩亚洲第一页 | 91专区在线观看 | 国产精品九九久久久久久久 | 久久免费视频6 | 97超碰香蕉| 国产一级久久久 | 欧美激情h| 97香蕉视频 | 五月宗合网 | 国产精品综合av一区二区国产馆 | 五月婷亚洲 | 麻豆91在线观看 | 超碰人人乐 | 亚洲欧洲精品一区 | 久草免费在线视频 | 最新高清无码专区 | 成人欧美在线 | 日韩成人精品在线观看 | 日韩欧美在线一区 | 午夜久久成人 | 超碰97在线资源站 | 国产人在线成免费视频 | 91视频 - 88av| 欧美日韩一区二区三区视频 | 国产成人精品一区二区三区在线 | 制服丝袜在线91 | 国产99久久九九精品免费 | 国产美女网站视频 | 国产在线视频一区二区三区 | 免费亚洲成人 | 久久桃花网 | 日韩免费高清在线观看 | 久久精品这里精品 | 色综合久久久久久久 | 五月婷婷在线观看视频 | 日韩在线电影一区 | 亚洲国内精品 | 久久精品视频4 | 一区二区三区动漫 | 国产精品系列在线播放 | 欧美福利网址 | 伊人影院在线观看 | 四虎在线免费观看视频 | 婷婷看片| 91黄视频在线观看 | 中文字幕一区二区三区精华液 | 欧洲精品码一区二区三区免费看 | 日韩av男人的天堂 | 成年人免费看片 | 免费黄色网址大全 | 日韩免费看的电影 | 国产韩国日本高清视频 | 久草在线资源观看 | 97国产小视频 | 色资源在线| 成人久久18免费网站麻豆 | 激情五月婷婷丁香 | 超碰99人人 | 五月天久久久 | 国产色拍拍拍拍在线精品 | 国语自产偷拍精品视频偷 | 中文字幕第 | 日b视频国产| 99色视频在线 | 久久精品久久精品久久精品 | 一区二区三区在线免费观看视频 | 亚洲成a人片77777kkkk1在线观看 | www.成人精品 | 久久久网页 | 麻豆系列在线观看 | 在线观看91视频 | 国产一级免费片 | 久久久久久久久久久久久国产精品 | 午夜精品麻豆 | 五月天亚洲激情 | 视频一区视频二区在线观看 | 中文字幕888| 99热国产精品 | 国产精品扒开做爽爽的视频 | 人人射人人澡 | 免费黄色a网站 | 欧美午夜a | 黄色午夜 | 欧美日韩国产精品爽爽 | 亚州精品在线视频 | 日韩99热 | 亚洲精品视频在线观看免费视频 | 国产精品黄网站在线观看 | av一区二区在线观看中文字幕 | 色综合久久久久综合体 | 日韩在线观看一区二区三区 | 亚洲精品456在线播放乱码 | 亚洲精品视频免费看 | 夜夜爽88888免费视频4848 | 欧美日韩高清在线观看 | 免费高清看电视网站 | 丰满少妇在线观看网站 | 麻豆传媒在线免费看 | 91私密视频| 夜夜嗨av色一区二区不卡 | 91中文视频| 国产五月 | 日日日网 | 黄影院| japanesefreesex中国少妇 | 欧美大片在线看免费观看 | 亚洲精品女人 | 二区中文字幕 | 久久99欧美 | 在线看岛国av | 国产在线精品一区二区三区 | 久在线观看视频 | 亚洲成熟女人毛片在线 | 国产乱码精品一区二区蜜臀 | 日韩影视精品 | 国产综合小视频 | 免费观看www视频 | 久久精品一区二区三区四区 | 久久不射电影网 | 日韩视频中文字幕 | 美女网站视频一区 | 91人人揉日日捏人人看 | 91精品对白一区国产伦 | 亚洲精品在线电影 | 免费观看全黄做爰大片国产 | 国产成人精品区 | 亚洲乱码久久久 | 国产视频一区在线播放 | 久久久福利 | 毛片基地黄久久久久久天堂 | 精品久久久久久一区二区里番 | 亚洲成a人片77777潘金莲 | 麻豆国产精品永久免费视频 | 91精品视频在线 | 午夜精品福利一区二区三区蜜桃 | 国产精品嫩草影院99网站 | 久久国产成人午夜av影院宅 | 91视频麻豆 | 欧美精品久久久久a | 日韩专区在线 | 免费福利视频网 | 福利视频网站 | 欧美午夜寂寞影院 | 狠狠狠狠狠操 | 狠狠色噜噜狠狠狠狠2021天天 | 探花在线观看 | 午夜精品一区二区三区免费视频 | 亚洲黄色成人av | 久久国产热| 国产一级免费在线观看 | 黄色片网站 | 亚州人成在线播放 | 免费男女羞羞的视频网站中文字幕 | 国产精品久久久久久久久费观看 | av在线之家电影网站 | 手机av看片 | 天天干夜夜爱 | 欧美日韩国产二区三区 | 日韩成人精品一区二区三区 | 久久国产露脸精品国产 | www久| 爱爱一区 | 国产精品毛片久久久久久久久久99999999 | 天天射天天干 | 成 人 黄 色 视频免费播放 | 国产精品女人久久久 | 黄污在线观看 | 午夜视频黄 | 99国产精品久久久久久久久久 | 17videosex性欧美 | 狠狠色伊人亚洲综合成人 | 午夜三级大片 | 经典三级一区 | 成人亚洲精品国产www | 久久久久久久国产精品 | 91在线免费观看国产 | 91污在线 | 欧美日韩在线观看一区二区三区 | 少妇资源站 | 亚洲天天综合网 | av免费电影网站 | 精品在线视频一区 | 久久免费国产电影 | 日韩欧美在线综合网 | 草久在线观看视频 | 亚洲一区在线看 | 久草在线免费资源 | 国产精品入口a级 | 久久1区| 美女免费视频一区 | 综合色在线| 手机av在线网站 | 蜜桃麻豆www久久囤产精品 | 精品久久久久一区二区国产 | 在线黄频 | 国产精品自产拍在线观看网站 | 久久精品中文字幕免费mv | 日韩久久久久久 | 久久久免费在线观看 | 成人久久网 | 国产一区二区三区在线免费观看 | 蜜桃视频在线视频 | 亚洲欧美成人综合 | 夜夜躁狠狠躁 | 日本视频高清 | 激情五月婷婷 | 欧美精品乱码99久久影院 | 中文字幕在线第一页 | 国产精品久久久区三区天天噜 | 天天操夜夜操 | www.午夜| 久久视频一区二区 | 日本美女xx| 丁香激情婷婷 | 国产一级片免费播放 | 天天操夜操 | 亚州欧美精品 | 欧美一级在线观看视频 | 97狠狠干 | 999久久国产精品免费观看网站 | 曰韩在线 | 久热av在线 | 色综合网在线 | 美女视频黄频大全免费 | 亚洲精品在 | 亚洲视频2 | 在线观看黄色的网站 | www.一区二区三区 | 国内少妇自拍视频一区 | 很黄很黄的网站免费的 | 菠萝菠萝蜜在线播放 | 五月综合激情网 | 在线观看成人小视频 | 午夜精品久久久久久久99婷婷 | 国产经典 欧美精品 | 久久综合加勒比 | 综合久久一本 | 中文字幕888 | 婷婷免费视频 | 欧美激情综合五月色丁香小说 | 国产综合在线视频 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 在线观看国产高清视频 | 在线电影日韩 | 国产精品毛片一区二区在线看 | 日本在线视频一区二区三区 | 婷婷婷国产在线视频 | 日韩欧美视频在线免费观看 | 丁香婷婷社区 | 国产一二区免费视频 | 日日干网 | 国产视频中文字幕 | 99久久精品免费看国产免费软件 | 免费情缘 | 婷婷中文字幕综合 | 国产高清久久久 | 国产高清av免费在线观看 | 青草视频免费观看 | 天天射天天爱天天干 | 美女网站在线免费观看 | 96久久精品 | 久久99精品视频 | 久久国语 | 国产97视频在线 | 日韩av片在线 | 99综合视频| 91看片在线看片 | 国产精品久久99综合免费观看尤物 | 狠狠狠综合 | 亚洲黄色免费在线看 | 在线播放一区二区三区 | 国产视频1 | 久99久精品视频免费观看 | 涩涩网站在线播放 | 91在线色| 日日色综合 | 粉嫩一区二区三区粉嫩91 | 99re中文字幕 | 五月天国产精品 | 亚洲另类久久 | 国产精品美女www爽爽爽视频 | 久久99精品国产91久久来源 | 久99久中文字幕在线 | 黄在线 | 99久久精品免费看国产四区 | 在线电影中文字幕 | 欧美一级黄色片 | 久久精品79国产精品 | av青草| 国产亚洲情侣一区二区无 | 一级片观看 | 久久电影网站中文字幕 | 国产一区二区高清不卡 | 日韩中文在线播放 | 免费人成在线观看 | 黄色大片免费播放 | 欧美动漫一区二区三区 | 日韩欧美在线视频一区二区 | 国产精品无av码在线观看 | 国产黄色片免费在线观看 | 国产福利一区二区三区在线观看 | 超碰免费久久 | 久久综合九色欧美综合狠狠 | 黄色精品一区 | 久久亚洲欧美日韩精品专区 | 国产一区二区三区四区大秀 | 国产在线观看一 | 国产成人精品一区二区三区福利 | 一区二区三区国产欧美 | 婷婷在线精品视频 | 国产精国产精品 | 国产69精品久久久久9999apgf | 久久精品99国产精品亚洲最刺激 | 99亚洲精品 | 久久精品96 | 色综合久久五月天 | 蜜臀av网址 | 色偷偷88欧美精品久久久 | 在线黄色av | 9ⅰ精品久久久久久久久中文字幕 | 91亚洲精 | 99精品久久久久久久 | 欧美二区在线播放 | 国产成人性色生活片 | 午夜精品久久久 | 国产一区欧美在线 | 日本一区二区三区视频在线播放 | 人人舔人人 | 91女人18片女毛片60分钟 | 91精品久久久久久久91蜜桃 | 国产精品video爽爽爽爽 | 欧美日韩精品在线观看视频 | 五月av在线 | 天天操天天摸天天爽 | 五月婷社区 | 成人黄色一级视频 | 国产黄色片免费看 | 精品视频国产一区 | 成人作爱视频 | 欧美精品一二 | 国产成人黄色 | 国产一区二区三精品久久久无广告 | 久久久久亚洲国产 | 日韩电影一区二区三区在线观看 | 日韩视频免费观看高清 | 久草在线中文视频 | 成人av直播 | 成人性生爱a∨ | zzijzzij亚洲成熟少妇 | 91精品国产自产在线观看永久 | 久久在线观看视频 | 精品亚洲成人 | 亚洲国产精品500在线观看 | 在线免费国产视频 | 午夜999| 在线免费观看黄色 | 操操操日日日干干干 | 97色国产| 免费特级黄色片 | 久久国产a | 激情婷婷综合网 | 色香蕉在线 | 久久亚洲美女 | 欧美日本一区 | 日日干天天插 | 亚洲蜜桃av| 国产精品国产三级国产aⅴ无密码 | 伊人狠狠干 | 欧美一区二区视频97 | 7777xxxx| 伊人射| 亚洲天堂网在线播放 | 亚洲女欲精品久久久久久久18 | 深爱婷婷久久综合 | 亚洲欧美综合精品久久成人 | 国产亚洲精品久久网站 | 99亚洲国产 | 狠狠躁18三区二区一区ai明星 | 日日日日日 | 玖玖在线视频观看 | 久久久久久免费视频 | 国产精品99久久久久人中文网介绍 | 人人爽人人爽人人爽学生一级 | 美女免费视频黄 | 91三级视频 | 97视频免费在线观看 | 久久艹在线观看 | 日本黄色一级电影 | 国产精品久久久久亚洲影视 | 欧美与欧洲交xxxx免费观看 | 日韩在线视频播放 | 久草在线最新视频 | 91精品推荐| 国产精品手机在线观看 | 婷婷视频在线观看 | 一区二区毛片 | 亚洲激情在线视频 | 精品一区二区三区电影 | 嫩草av在线 | 国产三级av在线 | 青青河边草免费直播 | 开心激情五月网 | 亚洲艳情| 久久精品黄色 | 九色精品免费永久在线 | 欧美在线观看小视频 | 欧美精品在线观看一区 | 97人人澡人人添人人爽超碰 | 亚洲国产精品小视频 | 黄色视屏在线免费观看 | 91成人免费在线视频 | 久久99精品国产99久久 | 奇米网网址 | 天天操夜夜干 | 日韩精品免费在线观看视频 | 日韩免费观看高清 | 狠狠干成人综合网 | 国产福利电影网址 | 国产午夜精品久久 | 亚洲欧美日韩在线一区二区 | 亚洲欧美日韩在线看 | 日韩黄色免费看 | 99精品国产99久久久久久97 | 香蕉成人在线视频 | 国产精品视频免费在线观看 | 91免费网站在线观看 | a视频在线 | 亚洲理论在线观看电影 | 综合久久2023| av在线电影播放 | 在线观看精品国产 | 日韩视频图片 | 欧美激情第八页 | 蜜桃视频精品 | 一区二区精品国产 | 久久精品草| 黄在线免费看 | 亚洲精品久久久久中文字幕二区 | a黄色影院 | 中文字幕在线乱 | 亚洲天堂精品视频在线观看 | 四虎8848免费高清在线观看 | 日韩高清精品一区二区 | 色爱区综合激月婷婷 | 狠狠操天天射 | wwxxxx日本| 日韩精品亚洲专区在线观看 | 色av资源网 | 最近中文字幕第一页 | 久久99热久久99精品 | 精品人人人人 | 亚洲国产精品一区二区久久,亚洲午夜 | 91精品久久久久久综合乱菊 | 国产69精品久久久久9999apgf | 亚洲精品自拍视频在线观看 | 国产手机精品视频 | www.天天操.com | 96香蕉视频| 日韩欧美一区二区不卡 | 日韩大片在线免费观看 | 色全色在线资源网 | 日韩欧美在线中文字幕 | avcom在线| 射九九 | 亚洲另类在线视频 | 激情狠狠干 | 99色免费视频 | 久久久久久久久久久久电影 | 大荫蒂欧美视频另类xxxx | 激情综合网五月婷婷 | 免费高清av在线看 | av中文在线影视 | 久草视频在线免费看 | 久久香蕉国产 | 91视频网址入口 | 日韩精品在线免费观看 | ,午夜性刺激免费看视频 | 欧美国产日韩一区 | 天天夜操| 91精品国产乱码 | 欧美激情va永久在线播放 | 欧美精品视 | 国产精品精品 | 国产二区av | 天天色天天干天天色 | 亚洲国产精品999 | 9久久精品 | 99热99re6国产在线播放 | 亚洲综合欧美精品电影 | 精品人妖videos欧美人妖 | 国产视频999 | 欧美少妇xxx | 右手影院亚洲欧美 | 在线观看中文 | 91桃色在线播放 | 国产一级片免费视频 | 99久久久久成人国产免费 | 国产aa免费视频 | 国产中年夫妇高潮精品视频 | 国产成人久久久77777 | av亚洲产国偷v产偷v自拍小说 | av网站在线免费观看 | 午夜久久视频 | 精品一区二区在线看 | 精品国产乱码久久久久 | 亚洲 欧洲av| av中文天堂 | 美女网站在线免费观看 | 日韩免费精品 | 亚洲va欧美va人人爽春色影视 | 国产一区在线视频播放 | 精品国产免费人成在线观看 | 三级av中文字幕 | 视频在线91| 国产一区二区精品 | 国产一区二区三区免费在线观看 | 久久视频精品在线观看 | 亚洲国产欧美在线人成大黄瓜 | 国产午夜精品免费一区二区三区视频 | 亚洲狠狠干 | 五月激情丁香图片 | 天天艹天天干天天 | 天堂网一区二区三区 | 天天干天天弄 | 激情导航| 久久a v电影| 久久这里只有精品久久 | 色综合久久99 | 国产护士av | 色综合久久88色综合天天 | 97av在线视频| 中文伊人 | 精品福利视频在线观看 | 亚洲人天堂 | 亚洲区视频在线观看 | 天天干婷婷 | 亚洲涩涩涩 | 亚洲伊人色 | 精品国产乱码一区二 | 久草综合在线观看 | 亚洲年轻女教师毛茸茸 | 亚洲精品国产成人av在线 | 美女视频黄在线观看 | 久草在线免费在线观看 | 91免费视频网站在线观看 | 一级黄色毛片 | 91久草视频 | 天天躁天天操 | 午夜在线观看影院 | 91精品久久香蕉国产线看观看 | 日韩乱色精品一区二区 | 国产精品第三页 | 天天躁天天躁天天躁婷 | 亚洲综合在线观看视频 | 丰满少妇麻豆av | 日韩精品免费一区二区在线观看 | 欧美色伊人 | 国产a精品 | 国产成人a v电影 | 日韩在线电影一区 | 日本精品一区二区三区在线播放视频 | 99热99re6国产在线播放 | 91高清不卡 | 99这里只有久久精品视频 | 久久人人爽人人爽 | 成人羞羞视频在线观看免费 | 亚洲综合色av | 国内精品久久久久久久影视简单 | 青草视频在线播放 | 精品久久精品久久 | 亚洲精品自在在线观看 | 在线观看免费视频 | 国产第一页在线播放 | 九九色网| 超碰资源在线 | 六月丁香激情网 | 国内精品久久久精品电影院 | 天天鲁天天干天天射 | 天天爽夜夜爽人人爽一区二区 | 久久欧美精品 | 96久久| 中文字幕a在线 | 国产精品一区二区 91 | 中文字幕在线影院 | 日韩电影中文字幕在线 | 国产精品成人久久久 | 又色又爽又黄高潮的免费视频 | 97精品国产97久久久久久 | 精品日本视频 | 久久激情精品 | 日韩三级久久 | 丁香久久五月 | 国内精品久久久久久久久久清纯 | 国产精品a成v人在线播放 | 嫩草伊人久久精品少妇av | 三级黄色理论片 | 日日夜夜噜噜噜 | 国产精品永久在线观看 | 色综合天天做天天爱 | 免费网站在线观看成人 | 国产成人av一区二区三区在线观看 | 欧美日韩精品在线播放 | 欧美日韩一区二区三区不卡 | 欧美一级特黄aaaaaa大片在线观看 | 在线高清 | 在线观看亚洲精品 | 欧美在线观看视频一区二区 |