📄 cryptkeyexport.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 + -