Исходник С Cryptoapi Rsa 1024 Нужна Помощь Знающих

  • Автор темы darklight131080
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

darklight131080

Гость
#1
Здравствуйте!!!

Такая проблема один чел сказал что тут длина ключа RSA меньше чem 1024 а мне надо 2048. что надо исправить, добавить, буду рад любым предложениям.


Генерация ключей

C++:
#include <Windows.h>
#include <WinCrypt.h>
#include <stdio.h>
#pragma comment (lib, "advapi32.lib")
BOOL GenerateKey()
{
HCRYPTPROV hProv;
HCRYPTKEY hKey;
BOOL success = TRUE;
if( !CryptAcquireContext( &hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0) &&
!CryptAcquireContext( &hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET) ) //пытаемся открыть существующий keyset или создать новый
{
printf( "Не удается создать контекст\n" );
return FALSE;
}
if( !CryptGenKey( hProv, AT_KEYEXCHANGE, 1024<<16, &hKey) ) //генерируем 1024-битный ключ для обмена
{
printf( "Не удается создать ключ RSA для обмена\n" );
success = FALSE;
}
CryptReleaseContext( hProv, 0);
if( success ) printf( "Успешно создан ключ RSA для обмена\n" );
return success;
}
int main( void )
{
return GenerateKey() ? 0 : -1;
}


Шифрование файла


C++:
#include <Windows.h>
#include <WinCrypt.h>
#include "utils.h"
#include <stdio.h>
#pragma comment (lib, "advapi32.lib")
BOOL _EncryptFile( char *_InFile, char *_OutFile)
{
HCRYPTPROV hProv;
HCRYPTKEY hPubKey;
HCRYPTHASH hHash;
HANDLE hInFile = INVALID_HANDLE_VALUE, hOutFile = INVALID_HANDLE_VALUE;
BOOL success = TRUE;
if( !CryptAcquireContext( &hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0) ) //получаем контекст
{
printf( "Не удается получить контекст\n" );
return FALSE;
}
if( !CryptGetUserKey( hProv, AT_KEYEXCHANGE, &hPubKey) ) //достаем публичный ключ пользователя
{
puts( "Не удается получить публичный ключ из контейнера\n" );
CryptReleaseContext( hProv, 0);
return FALSE;
}
if( (hInFile = CreateFileA( _InFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE ) //открываем входной файл
{
printf( "Не удается открыть входной файл\n" );
success = FALSE;
}
if( success && (hOutFile = CreateFileA( _OutFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL)) == INVALID_HANDLE_VALUE ) //открываем выходной файл
{
printf("Не удается открыть выходной файл\n");
success = FALSE;
}
if( success ) if( CryptCreateHash( hProv, CALG_MD5, 0, 0, &hHash) ) //создаем хэш
{
HCRYPTKEY hKey;
if( CryptGenKey( hProv, CALG_3DES, CRYPT_EXPORTABLE, &hKey) ) //генерируем ключ для 3DES
{
EncFileHeader fh;
DWORD dwLen = sizeof(struct RSA1024KeyExchBLOB);
if( CryptExportKey( hKey, hPubKey, SIMPLEBLOB, 0, (BYTE *) &fh.kb, &dwLen) ) //экспортируем ключ 3DES
{
DWORD dwSzHigh, dwSzLow = GetFileSize( hInFile, &dwSzHigh); //получаем размер исходного файла
unsigned __int64 fSize = (dwSzHigh << 32) + dwSzLow;
BYTE buf[BUFFER_SIZE+8]; //8 - запас на padding
fh.fSize = fSize;
if( WriteFile( hOutFile, &fh, sizeof(EncFileHeader), &dwLen, NULL) ) //пишем ключ и размер исходного файла
{
while( fSize )
{
if( !ReadFile( hInFile, buf, BUFFER_SIZE, &dwLen, NULL) ) //читаем блок данных
{
printf( "Ошибка чтения файла\n" );
success = FALSE;
break;
}
dwSzLow = dwLen;
if( !CryptEncrypt( hKey, hHash, fSize <= BUFFER_SIZE, 0, buf, &dwSzLow, sizeof(buf)) ) //шифруем и хешируем его
{
printf( "Ошибка шифрования\n" );
success = FALSE;
break;
}
if( !WriteFile( hOutFile, buf, dwSzLow, &dwSzLow, NULL) )
{
printf( "Ошибка записи\n" );
success = FALSE;
break;
}
fSize -= dwLen;
}
if( !fSize ) //все зашифровали нормально
{
dwLen = sizeof(buf);
if( CryptSignHash( hHash, AT_KEYEXCHANGE, NULL, 0, buf, &dwLen) ) //подписываем хэш
{
if( !WriteFile( hOutFile, buf, dwLen, &dwLen, NULL) )
printf( "Ошибка записи хеша в файл\n" );
else
printf( "Шифрование успешно завершено\n" );
}
else
printf( "Не удается подписать файл\n" );
}
}
else
printf( "Не удается сохранить ключ 3DES\n" );
}
else
printf( "Не удается экспортировать ключ 3DES\n" );
CryptDestroyKey( hKey );
CryptDestroyHash( hHash );
}
else
printf( "Не удается создать ключ 3DES\n" );
}
else
puts( "Не удается создать хэш\n" );
if( hOutFile != INVALID_HANDLE_VALUE ) CloseHandle( hOutFile );
if( hInFile != INVALID_HANDLE_VALUE ) CloseHandle( hInFile );
CryptDestroyKey( hPubKey );
CryptReleaseContext( hProv, 0);
return success;
}
int main()
{
return _EncryptFile( "in.bin", "out.bin") ? 0 : -1;
}


Дешифрование файла


C++:
#include <Windows.h>
#include <WinCrypt.h>
#include "utils.h"
#include <stdio.h>
#pragma comment (lib, "advapi32.lib")
BOOL _DecryptFile( char *_InFile, char *_OutFile)
{
HCRYPTPROV hProv;
HCRYPTKEY hPrivKey;
HCRYPTHASH hHash;
HANDLE hInFile = INVALID_HANDLE_VALUE, hOutFile = INVALID_HANDLE_VALUE;
BOOL success = TRUE;
if( !CryptAcquireContext( &hProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0) ) //получаем контекст
{
printf( "Не удается получить контекст\n" );
return FALSE;
}
if( !CryptGetUserKey( hProv, AT_KEYEXCHANGE, &hPrivKey) ) //достаем приватный ключ пользователя
{
printf( "Не удается получить приватный ключ из контейнера\n" );
CryptReleaseContext( hProv, 0);
return FALSE;
}
if( (hInFile = CreateFileA( _InFile, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE ) //открываем входной файл
{
printf( "Не удается открыть входной файл\n" );
success = FALSE;
}
if( success && (hOutFile = CreateFileA( _OutFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL)) == INVALID_HANDLE_VALUE ) //открываем выходной файл
{
printf("Не удается открыть выходной файл\n");
success = FALSE;
}
if( success ) if( CryptCreateHash( hProv, CALG_MD5, 0, 0, &hHash) ) //создаем хэш
{
EncFileHeader fh;
DWORD dwLen;
if( !ReadFile( hInFile, &fh, sizeof(fh), &dwLen, NULL) )
{
printf( "Ошибка чтения файла\n");
success = FALSE;
}
else
{
HCRYPTKEY hKey;
if( CryptImportKey( hProv, (BYTE *) &fh.kb, sizeof(struct RSA1024KeyExchBLOB), hPrivKey, 0, &hKey) ) //импортируем сессионный ключ
{
unsigned __int64 fOrgSize = fh.fSize, fEncSize;
DWORD dwSzLow, dwSzHigh;
BYTE buf[BUFFER_SIZE];
dwSzLow = GetFileSize( hInFile, &dwSzHigh);
fEncSize = (dwSzHigh << 32) + dwSzLow - sizeof(EncFileHeader) - 1024/8; //размер зашифрованных данных
while( fEncSize )
{
if( !ReadFile( hInFile, buf, fEncSize >= BUFFER_SIZE ? BUFFER_SIZE : (DWORD)fEncSize, &dwLen, NULL) )
{
printf( "Ошибка чтения\n" );
success = FALSE;
break;
}
dwSzLow = dwLen;
if( !CryptDecrypt( hKey, hHash, fEncSize <= BUFFER_SIZE, 0, buf, &dwSzLow) ) //расшифровываем данные
{
printf( "Ошибка дешифрования\n" );
success = FALSE;
break;
}
if( !WriteFile( hOutFile, buf, fOrgSize >= dwSzLow ? dwSzLow : (DWORD) fOrgSize, &dwSzLow, NULL) )
{
printf( "Ошибка записи\n" );
success = FALSE;
break;
}
fEncSize -= dwLen;
fOrgSize -= dwSzLow;
}
if( !fEncSize ) //все нормально отработалось
{
if( ReadFile( hInFile, buf, 1024/8, &dwLen, NULL) && dwLen == 1024/8 ) //читаем подпись
{
if( !CryptVerifySignature( hHash, buf, 1024/8, hPrivKey, NULL, 0) )
{
success = FALSE;
printf( "Ошибка проверки подписи. Возможно файл был поврежден\n" );
}
else
printf( "Файл успешно расшифрован\n" );
}
else
{
printf( "Не найдена сигнатура файла\n" );
success = FALSE;
}
}
CryptDestroyKey( hKey );
}
else
{
printf( "Не удается импортировать ключ шифрования\n" );
success = FALSE;
}
CryptDestroyKey( hPrivKey );
}
CryptDestroyHash(hHash);
}
if( hOutFile != INVALID_HANDLE_VALUE ) CloseHandle( hOutFile );
if( hInFile != INVALID_HANDLE_VALUE ) CloseHandle( hInFile );
CryptDestroyKey( hPrivKey );
CryptReleaseContext( hProv, 0);
return success;
}
int main()
{
return _DecryptFile( "out.bin", "out_b.bin") ? 0 : -1;
}




Заголовочный файл utils.h




#ifndef _UTILS_H_
#define _UTILS_H_
struct RSA1024KeyExchBLOB
{
PUBLICKEYSTRUC publickeystruc;
ALG_ID algid;
BYTE encryptedkey[1024/8];
};
#define BUFFER_SIZE (1<<14)
typedef struct
{
struct RSA1024KeyExchBLOB kb;
unsigned __int64 fSize;
} EncFileHeader;
#endif
 
Статус
Закрыто для дальнейших ответов.