⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cryptkeyexport.cpp

📁 Export rsa private/public key pair
💻 CPP
字号:

#include <stdio.h>
#include <windows.h>
#include <tchar.h>
#include <wincrypt.h>
#define RSAKEY_FILENAME   TEXT("d:\\rsakey.h")
#define RC4KEY_FILENAME   TEXT("d:\\rc4key.h")

void PrintError(DWORD dwError)
{
	LPVOID lpMsgBuf;

	if (FormatMessage( 
		FORMAT_MESSAGE_ALLOCATE_BUFFER | 
		FORMAT_MESSAGE_FROM_SYSTEM | 
		FORMAT_MESSAGE_IGNORE_INSERTS,
		NULL,
		dwError,
		MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
		(LPTSTR) &lpMsgBuf,
		0,
		NULL ))
	{
		_tprintf( _T("\tError: %s\r\n"), lpMsgBuf);
	}
	LocalFree( lpMsgBuf );

}

void RsaKeyExport(void)
{
	HCRYPTPROV hCryptProv = NULL;
	HCRYPTKEY hKey; 

	if(!CryptAcquireContext(
		&hCryptProv, 
		NULL, 
		MS_DEF_PROV, 
		PROV_RSA_FULL, 
		0))
	{
		DWORD dwError = GetLastError();

		if (dwError == NTE_BAD_KEYSET)
		{
			if (!CryptAcquireContext(
				&hCryptProv, 
				NULL, 
				MS_DEF_PROV, 
				PROV_RSA_FULL, 
				CRYPT_NEWKEYSET))
			{
				PrintError(GetLastError());
				return;
			}
		}
		else
		{
			PrintError(GetLastError());
			return ;
		}
	}

	if (!CryptGenKey(hCryptProv, AT_KEYEXCHANGE, RSA1024BIT_KEY | CRYPT_EXPORTABLE, &hKey))
	{
		PrintError(GetLastError());
		CryptReleaseContext(hCryptProv, 0);
		return;
	}

	DWORD dwSize = 0;
	if (!CryptExportKey(hKey, NULL, PUBLICKEYBLOB, 0, NULL, &dwSize))
	{
		PrintError(GetLastError());
		CryptDestroyKey(hKey);
		CryptReleaseContext(hCryptProv, 0);
		return;
	}

	LPBYTE lpKeyBlob = (BYTE*)malloc(dwSize);
	if (!CryptExportKey(hKey, NULL, PUBLICKEYBLOB, 0, lpKeyBlob, &dwSize))
	{
		PrintError(GetLastError());
		free(lpKeyBlob);
		CryptDestroyKey(hKey);
		CryptReleaseContext(hCryptProv, 0);
		return;
	}

	FILE *fp = _tfopen(RSAKEY_FILENAME, "w");
	if (fp == NULL)
	{
		PrintError(GetLastError());
		free(lpKeyBlob);
		CryptDestroyKey(hKey);
		CryptReleaseContext(hCryptProv, 0);
		return;
	}

	_ftprintf(fp, TEXT("#ifndef __RSA_KEY_H__\n"));
	_ftprintf(fp, TEXT("#define __RSA_KEY_H__\n\n"));

	_ftprintf(fp, TEXT("const unsigned char szPublicKey[] = {"));
	for (DWORD i=0;i<dwSize;i++)
	{
		if (i % 8 == 0)
			_ftprintf(fp, TEXT("\n\t"));
		
		_ftprintf(fp, TEXT("0x%02x"), lpKeyBlob[i]);

		if (i < dwSize - 1)
			_ftprintf(fp, TEXT(", "), lpKeyBlob[i]);
	}
	_ftprintf(fp, TEXT("\n}\n\n"));
	fclose(fp);
	
	free(lpKeyBlob);

	dwSize = 0;
	if (!CryptExportKey(hKey, NULL, PRIVATEKEYBLOB, 0, NULL, &dwSize))
	{
		PrintError(GetLastError());
		CryptDestroyKey(hKey);
		CryptReleaseContext(hCryptProv, 0);
		return;
	}
	lpKeyBlob = (BYTE*)malloc(dwSize);
	if (!CryptExportKey(hKey, NULL, PRIVATEKEYBLOB, 0, lpKeyBlob, &dwSize))
	{
		PrintError(GetLastError());
		free(lpKeyBlob);
		CryptDestroyKey(hKey);
		CryptReleaseContext(hCryptProv, 0);
		return;
	}

	fp = _tfopen(RSAKEY_FILENAME, "a");
	if (fp == NULL)
	{
		PrintError(GetLastError());
		free(lpKeyBlob);
		CryptDestroyKey(hKey);
		CryptReleaseContext(hCryptProv, 0);
		return;
	}

	_ftprintf(fp, TEXT("const unsigned char szPrivateKey[] = {"));
	for (i=0;i<dwSize;i++)
	{
		if (i % 8 == 0)
			_ftprintf(fp, TEXT("\n\t"));
		
		_ftprintf(fp, TEXT("0x%02x"), lpKeyBlob[i]);

		if (i < dwSize - 1)
			_ftprintf(fp, TEXT(", "), lpKeyBlob[i]);
	}
	_ftprintf(fp, TEXT("\n}\n\n"));
	
	_ftprintf(fp, TEXT("#endif//__RSA_KEY_H__\n"));
	fclose(fp);

	free(lpKeyBlob);

	


	if(hKey)
		CryptDestroyKey(hKey);

	if(hCryptProv) 
		CryptReleaseContext(hCryptProv, 0);

}


void DesKeyExport(void)
{
	HCRYPTPROV hCryptProv = NULL;
	HCRYPTKEY hKey; 
	HCRYPTKEY hXchgKey ;

	if(!CryptAcquireContext(
		&hCryptProv, 
		NULL, 
		MS_ENHANCED_PROV, 
		PROV_RSA_FULL, 
		0))
	{
		DWORD dwError = GetLastError();

		if (dwError == NTE_BAD_KEYSET)
		{
			if (!CryptAcquireContext(
				&hCryptProv, 
				NULL, 
				MS_ENHANCED_PROV, 
				PROV_RSA_FULL, 
				CRYPT_NEWKEYSET))
			{
				PrintError(GetLastError());
				return;
			}
		}
		else
		{
			PrintError(GetLastError());
			return ;
		}
	}
#define KEYLENGTH  0x00800000

	if (!CryptGenKey(hCryptProv, CALG_RC4, KEYLENGTH | CRYPT_EXPORTABLE, &hKey))
	{
		PrintError(GetLastError());
		CryptReleaseContext(hCryptProv, 0);
		return;
	}

	if (!CryptGetUserKey(hCryptProv, AT_KEYEXCHANGE, &hXchgKey))
	{
		PrintError(GetLastError());
		CryptDestroyKey(hKey);
		CryptReleaseContext(hCryptProv, 0);
		return;
	}

	DWORD dwSize = 0;
	if (!CryptExportKey(hKey, hXchgKey, SIMPLEBLOB , 0, NULL, &dwSize))
	{
		PrintError(GetLastError());
		CryptDestroyKey(hKey);
		CryptDestroyKey(hXchgKey);
		CryptReleaseContext(hCryptProv, 0);
		return;
	}

	LPBYTE lpKeyBlob = (BYTE*)malloc(dwSize);
	if (!CryptExportKey(hKey, hXchgKey, SIMPLEBLOB, 0, lpKeyBlob, &dwSize))
	{
		PrintError(GetLastError());
		free(lpKeyBlob);
		CryptDestroyKey(hKey);
		CryptDestroyKey(hXchgKey);
		CryptReleaseContext(hCryptProv, 0);
		return;
	}

	FILE *fp = _tfopen(RC4KEY_FILENAME, "w");
	if (fp == NULL)
	{
		PrintError(GetLastError());
		free(lpKeyBlob);
		CryptDestroyKey(hKey);
		CryptDestroyKey(hXchgKey);
		CryptReleaseContext(hCryptProv, 0);
		return;
	}

	_ftprintf(fp, TEXT("#ifndef __RC4_KEY_H__\n"));
	_ftprintf(fp, TEXT("#define __RC4_KEY_H__\n\n"));

	_ftprintf(fp, TEXT("const unsigned char szSessionKey[] = {"));
	for (DWORD i=0;i<dwSize;i++)
	{
		if (i % 8 == 0)
			_ftprintf(fp, TEXT("\n\t"));
		
		_ftprintf(fp, TEXT("0x%02x"), lpKeyBlob[i]);

		if (i < dwSize - 1)
			_ftprintf(fp, TEXT(", "), lpKeyBlob[i]);
	}
	_ftprintf(fp, TEXT("\n}\n\n"));
	_ftprintf(fp, TEXT("#endif//__RC4_KEY_H__\n"));

	fclose(fp);
	
	free(lpKeyBlob);


	if(hKey)
		CryptDestroyKey(hKey);

	if(hXchgKey)
		CryptDestroyKey(hXchgKey);

	if(hCryptProv) 
		CryptReleaseContext(hCryptProv, 0);
}

void main(void) 
{
	//DesKeyExport();
	RsaKeyExport();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -