Статус: Новичок
Группы: Участники
Зарегистрирован: 15.12.2015(UTC) Сообщений: 3
Поблагодарили: 1 раз в 1 постах
|
Всем спасибо! Во всём разобралась: данные для SALT и PASSWORD надо было в виде структуры вводить. Всё отлично работает! Код:#include "stdafx.h"
#include <iostream>
#include <vector>
#include <windows.h>
#include <Wincrypt.h>
#include <malloc.h>
#include <stdio.h>
#include "WinCryptEx.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
HCRYPTPROV hCryptProv = 0;
HCRYPTHASH hHash = 0;
HCRYPTKEY hKey = 0;
HCRYPTKEY hDerivedKey = 0;
char salt_value_data[] = "sflprt49fhi2";
char password_value[] = "123456";
DWORD dwIterationsCount = 2500;
DWORD dwMode = 0;
BYTE pbIV[8] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x00 };
BYTE szCipheroid[39] = {szOID_Gost28147_89_CryptoPro_A_ParamSet};
BYTE pbData[8] = {'A','B','C','D','E','F','G','H'};
DWORD cbData = sizeof(pbData);
CRYPT_DATA_BLOB blobSalt = { sizeof(salt_value_data), (BYTE*)salt_value_data};
CRYPT_DATA_BLOB blobPassword = { sizeof(password_value) , (BYTE*)password_value };
printf("Data:\n");
for( int i = 0; i < cbData; i++)
{
printf( "%02x", pbData[i] );
}
printf( "\n" );
//-------CryptAcquireContext------
if( CryptAcquireContext( &hCryptProv, NULL, NULL, PROV_GOST_2012_256, CRYPT_VERIFYCONTEXT) ){
if( hCryptProv == NULL )
printf("Not true!!! \n");
printf("CryptAcquireContext complete. \n");
}
else{
printf("Acquisition of context failed. %x \n", GetLastError());
exit(1);
}
//-------CryptCreateHash------
if( CryptCreateHash( hCryptProv, CALG_PBKDF2_2012_256, 0, 0, &hHash) ){
printf("An empty hash object has been created. \n");
}
else{
printf("Error during CryptCreateHash! %x \n", GetLastError());
exit(1);
}
//-------CryptSetHashParam------SALT------
if( !CryptSetHashParam( hHash, HP_PBKDF2_SALT, (BYTE*)&blobSalt, 0) ){
printf("CryptSetHashParam failed to set SALT. %x \n", GetLastError());
exit(1);
}
//-------CryptSetHashParam------PASSWORD------
if( !CryptSetHashParam( hHash, HP_PBKDF2_PASSWORD, (BYTE*)&blobPassword, 0) ){
printf("CryptSetHashParam failed to set PASSWORD. %x \n", GetLastError());
exit(1);
}
//-------CryptSetHashParam------COUNT------
if( !CryptSetHashParam( hHash, HP_PBKDF2_COUNT, (BYTE*)&dwIterationsCount, 0) ){
printf("CryptSetHashParam failed to set COUNT. %x \n", GetLastError());
exit(1);
}
//-------CryptDeriveKey------
if( CryptDeriveKey( hCryptProv, CALG_G28147, hHash, CRYPT_EXPORTABLE, &hKey) ){
printf("The key has been derived. \n");
}
else{
printf("Error during CryptDeriveKey! %x \n", GetLastError());
exit(1);
}
//-------CryptSetKeyParam------KP_IV------
if( !CryptSetKeyParam( hKey, KP_IV, (BYTE*)pbIV, 0) ){
printf("Error during CryptGetKeyParam KP_IV. %x \n", GetLastError());
}
//-------CryptSetKeyParam------KP_MODE------
dwMode = CRYPT_MODE_CFB;
if( !CryptSetKeyParam( hKey, KP_MODE, (BYTE*)&dwMode, 0) ){
printf("Error during CryptGetKeyParam KP_MODE. %x \n", GetLastError());
}
//-------CryptSetKeyParam------KP_CIPHEROID------
if( !CryptSetKeyParam( hKey, KP_CIPHEROID, (BYTE*)szCipheroid, 0) ){
printf("CryptSetKeyParam failed to set KP_CIPHEROID. %x \n", GetLastError());
exit(1);
}
printf( "CryptSetKeyParam succeeded. \n");
//-------CryptEncrypt------
CryptEncrypt( hKey, NULL, TRUE, 0, pbData, &cbData, cbData );
printf("Encrypted:\n");
for( int i=0; i<cbData; i++ ){
printf( "%02x", pbData[i] );
}
printf("\n");
//-------CryptSetKeyParam------KP_IV------
if( !CryptSetKeyParam( hKey, KP_IV, (BYTE*)pbIV, 0) ){
printf("Error during CryptGetKeyParam KP_IV. %x \n", GetLastError());
}
//-------CryptDecrypt------
CryptDecrypt( hKey, NULL, TRUE, 0, pbData, &cbData );
printf("Decrypted:\n");
for( int i=0; i<cbData; i++ ){
printf("%02x",pbData[i]);
}
printf("\n");
for( int i=0; i<cbData; i++){
printf("%c",pbData[i]);
}
printf("\n");
if(hHash)
CryptDestroyHash(hHash);
if(hKey)
CryptDestroyKey(hKey);
if(hCryptProv)
CryptReleaseContext(hCryptProv,0);
printf("The program to derive a key completed without error. \n");
return 0;
}
Отредактировано пользователем 24 декабря 2015 г. 17:08:29(UTC)
| Причина: Не указана
|
1 пользователь поблагодарил Eteri за этот пост.
|
|