Я должен создать пару ключей (открытый и закрытый (1024)) с веб-сайта: http://travistidwell.com/jsencrypt/demo/
например, здесь мой открытый ключ:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCGGKlBoNlzTJXoHGkRLum1kpsv
YRZEhZYpj3H2zfPAHLx6C5ElwbZHMBFarPl0lhP/Ydge3K9KeVmfahyGAz6Hq8LE
GnL5GYP+ef1ov5aMXSVxaWEkiu4BjvyRps5BedTWoyL6Tw7p15wVoxxO4c+mTlxz
6dxHFGpysm3mMAoajwIDAQAB
-----END PUBLIC KEY-----
и вот мой закрытый ключ:
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQCGGKlBoNlzTJXoHGkRLum1kpsvYRZEhZYpj3H2zfPAHLx6C5El
wbZHMBFarPl0lhP/Ydge3K9KeVmfahyGAz6Hq8LEGnL5GYP+ef1ov5aMXSVxaWEk
iu4BjvyRps5BedTWoyL6Tw7p15wVoxxO4c+mTlxz6dxHFGpysm3mMAoajwIDAQAB
AoGAJB9EiM9BhFOfFhWBIAXZIvZJI2wtyWuK1cs0Ud2MybVz+BRhlyAlb+u84QYz
dHpxDJxY0Yd1GMSzpcO5x0fccd8yPBXIY6Mk3fWZgwx9LcDASpAcaHwzOXFTAF6t
pjxDRry7aiFU6lggHrI09LYeFuBuet+ODLTrHlMuxodcFmECQQDNcoDgU0gxptTe
bKlr28BMpMoe1XrpPsi5VmeJmcukSkZdiYgIFoN9WrFMXQihzKfuQIyNmAJoFcNd
0m++5dGZAkEApxeh3C3/VW0Ga+xEnrJEXY9eDjUcuz1HU9vo1dwi3GSOeT/nqow6
MlAkWxo9edR1zDzNUPFKOj1g2M+kLRC2ZwJAONWeVXB0nle6t7VzwQTP0+QajiEc
mX3m5W7DwcssDM0HXkT3vtULlxgJyEhMZQZKxpxQxbLxp32tyDy48SR+sQJBAJlI
o7LR+4+Jgb+VsmmHDhJqSBVugdn+4CU88v7lgJGAKfdvOX4KQAUR4hg1HTpbPmlL
Seq8P6Tn06Vx7qFs2HcCQQCY2Od7cDSSm8cCJi1s3IL+Rtisnxvg45WqatZAORzM
ovkmQz2yai0gEnP826hrwNMsWe/tbsyCKb84B/Vh9v3d
-----END RSA PRIVATE KEY-----
наконец-то вот мои данные.
const char* Data = "Encrypt me";
теперь мне нужно попытаться зашифровать мои данные char * с открытым ключом RSA, используя только windows crypto api в c ++ и после преобразования encryptзашифрованные данные в BASE64 кодируют.
затем хотите расшифровать закодированные в base64 зашифрованные данные с помощью моего личного ключа.
Пожалуйста, если вы не знаете, не отвечайте и не говорите о cng!
это код, который я копирую, пишу, редактирую.Теперь не понимает, в чем проблема DWORD * outLength
HCRYPTPROV _ServerContextHandle;
HCRYPTKEY _EncryptionKeyHandle;
char* inPublicKeyByPemFormat = (char*)"-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjLqxm/bYHTwmjj9OT6vJH6BqghLSv4mLJ2AW8EKbmmYSLhv8jDu6GJTjKfrqeXaRXVtz5CxcWgb7f9y7PnAYEsp6GzLMn2SvHF/Q2HxQmBvw2bH0uXM9RC9wneqZcPW8x/qhhxBq3Ux+HQth3KpDdf24c6Ut2+6r6DBqrrFbJs73RwPukuFLNzbi/bWxh3Ib4pti0OoSHGylZRddwdGlqL0SEpuWt7ZdJYEHOQM4jFs/T6ThDTEsPytxYAEHWrckRcMIUIylMppCGy28ysguql5pZo+JHoyL+ZfOgPTzBwM8keXunCfPEaYn4fwjwWyFQHlZkMy6npyCD1zZ0Ke2FQIDAQAB-----END PUBLIC KEY-----";
HCRYPTPROV serverContextHandle;
bool result = CryptAcquireContextW(&serverContextHandle, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) == TRUE;
if (result)
{
_ServerContextHandle = serverContextHandle;
BYTE derPublicKey[2048];
DWORD derPublicKeyLength = 2048;
result = CryptStringToBinaryA(inPublicKeyByPemFormat, 0, CRYPT_STRING_BASE64HEADER, derPublicKey, &derPublicKeyLength, NULL, NULL) == TRUE;
CERT_PUBLIC_KEY_INFO* publicKeyInfo = NULL;
DWORD publicKeyInfoLength;
if (result)
{
result = CryptDecodeObjectEx(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, X509_PUBLIC_KEY_INFO, derPublicKey, derPublicKeyLength, CRYPT_ENCODE_ALLOC_FLAG, NULL, &publicKeyInfo, &publicKeyInfoLength) == TRUE;
}
HCRYPTKEY encryptionKeyHandle;
if (result)
{
result = CryptImportPublicKeyInfo(_ServerContextHandle, X509_ASN_ENCODING, publicKeyInfo, &encryptionKeyHandle) == TRUE;
}
LocalFree(publicKeyInfo);
if (result)
{
_EncryptionKeyHandle = encryptionKeyHandle;
}
}
BYTE* inData = (BYTE*)"Hello!";
DWORD inDataLength = 6;
DWORD* outLength = 0;
BYTE* resulte = NULL;
//*outLength = 0;
DWORD length = inDataLength;
result = inData;
if (!CryptEncrypt(_EncryptionKeyHandle, NULL, TRUE, 0, resulte, &length, length))
{
delete resulte;
result = new BYTE[length];
resulte = inData;
*outLength = inDataLength;
if (!CryptEncrypt(_EncryptionKeyHandle, NULL, TRUE, 0, resulte, outLength, length))
{
delete resulte;
resulte = NULL;
*outLength = 0;
}
}
else
{
*outLength = length;
}