Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[34.228.213.183] |
|
Сообщ.
#1
,
|
|
|
Пишу обычный шифратор текста при помощи рса.
Генерация и экспорт ключа работают. Надо ключи рса преобразовать в строку, выбрал base64 посредством winapi. и вот, есть такой код #include <Windows.h> #include <WinCrypt.h> #include <string> #include <iostream> #pragma comment (lib, "crypt32.lib") #include <stdio.h> BOOL success = TRUE; HCRYPTPROV hProv; HCRYPTKEY hKey; DWORD dwprLen; BYTE* prKeyBlob; DWORD dwpbLen; BYTE* pbKeyBlob; LPSTR PublicKey; LPSTR PrivateKey; BOOL GenerateKey() { if (!CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0) && !CryptAcquireContext(&hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET)) { printf("Can't create contex! %d\n", GetLastError()); return FALSE; } if (!CryptGenKey(hProv, AT_KEYEXCHANGE, 2048 << 16 | CRYPT_EXPORTABLE, &hKey)) { printf("Can't create RSA key pair %d\n", GetLastError()); success = FALSE; } return success; } BOOL ExportPrivateKey() { if (!CryptExportKey(hKey, NULL, PRIVATEKEYBLOB, 0, NULL, &dwprLen)) { printf("Can't export RSA key pair. Error:%x\n", GetLastError()); success = FALSE; } if (!(prKeyBlob = (BYTE*)malloc(dwprLen))) { printf("Out of memory\n"); success = FALSE; } if (!CryptExportKey(hKey, NULL, PRIVATEKEYBLOB, 0, prKeyBlob, &dwprLen)) { printf("Can't export RSA key pair\n"); success = FALSE; } for (DWORD i = 0; i < dwprLen; i++) { printf("%02c", prKeyBlob[i]); } std::string key(reinterpret_cast<char const*>(prKeyBlob)); for (int i = 0; i < strlen(key.c_str()); i++) { printf("%c", key[i]); } printf("\n"); printf("\n"); return success; } BOOL ExportPublicKey() { if (!CryptExportKey(hKey, 0, PUBLICKEYBLOB, 0, NULL, &dwpbLen)) { printf("Can't export RSA key pair %d\n", GetLastError()); success = FALSE; } if (!(pbKeyBlob = (LPBYTE)malloc(dwpbLen))) { printf("Out of memory %d\n", GetLastError()); success = FALSE; } if (!CryptExportKey(hKey, NULL, PUBLICKEYBLOB, 0, pbKeyBlob, &dwpbLen)) { printf("Can't export RSA key pair %d\n", GetLastError()); success = FALSE; } for (DWORD i = 0; i < dwpbLen; i++) { printf("%02c", pbKeyBlob[i]); } printf("\n"); printf("\n"); return success; } void Encode() { DWORD dlen = 0; if (!CryptBinaryToString(pbKeyBlob, dwpbLen, CRYPT_STRING_BASE64, NULL, &dlen)) { printf("Error while getting size... %d\n", GetLastError()); } if (!CryptBinaryToString(pbKeyBlob, dwpbLen, CRYPT_STRING_BASE64, PublicKey, &dlen)) { printf("Error while converting to base64 string... %d\n", GetLastError()); } printf("Base64: %s\n", PublicKey); } int main(void) { GenerateKey(); ExportPrivateKey(); ExportPublicKey(); Encode(); } Но когда я запускаю, я получаю: "Base64: (null)" Что не так? |
Сообщ.
#2
,
|
|
|
Цитата gerdal @ Но когда я запускаю, я получаю: "Base64: (null)" Что не так? Попробуй так: // выделим памяти с запасом : char PublicKey [16384]; char PrivateKey [16384]; Только покажи, что в итоге получится. У меня с импортом были проблемы. |