Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Геворг  
#1 Оставлено : 23 сентября 2016 г. 18:06:47(UTC)
Геворг

Статус: Новичок

Группы: Участники
Зарегистрирован: 15.09.2016(UTC)
Сообщений: 1
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 2 раз
В чем собственно проблема. Я считываю с файла текст и шифрую, после пытаюсь расшифровать. И почему то он сжоовает начало строки.
То есть:
Исходная строка: Hello, it is test number one!
Закодированная строка: ?+??hA???<{-????7f??$??
Расшифрованная строка: ґЗQЎkч!t is test nuber one!


Код:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <Windows.h>
#include <WinCrypt.h>


#define BLOCK_LENGTH 4096 // Размер буфера 4 КБ
#define CALG_G28147 26142 // Алгоритм шифрования

HCRYPTPROV hProv;		//Дескриптор криптопровайдера
HCRYPTKEY hSessionKey;		//Дескриптор сессионного ключа
HCRYPTKEY hDuplicateKey;	//Дескриптор дубликата сессионного ключа
DWORD hProvType = (DWORD)80;

int main()
{
	BYTE pbContent[BLOCK_LENGTH] = { 0 };	// Указатель на содержимое исходного файла
	DWORD cbContent = 0;					// Длина содержимого
	DWORD bufLen = sizeof(pbContent);
	char pin[] = "sys";


	if (CryptAcquireContext(
		&hProv,																	
		(LPCWSTR)L"Cache",
		(LPCWSTR)L"Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider",
		hProvType,
		CRYPT_SILENT))
	{
		CryptSetProvParam(hProv, PP_SIGNATURE_PIN, (LPBYTE)pin, 0);
	}
	else 
	{
		printf("\nError AcquireContext\n");
		return 1;
	}

	if (!CryptGenKey(hProv, CALG_G28147, CRYPT_ENCRYPT | CRYPT_DECRYPT, &hSessionKey))
	{
		printf("Session key does not generated.\n");
	}


	FILE * file = fopen("test.txt", "r");
	if (!file){
		printf("Unable to open file");
		return 1;
	}

	FILE * Encrypt = fopen("encrypt.bin", "wb");
	if (!Encrypt){
		printf("Unable to open Encrypt file");
		return 1;
	}

	do
	{
		if (!CryptDuplicateKey(hSessionKey, NULL, 0, &hDuplicateKey))
		{
			printf("The session key does not duplicated.\n");
		}
		memset(pbContent, 0, sizeof(pbContent));
		cbContent = (DWORD)fread(pbContent, 1, BLOCK_LENGTH , file);
		pbContent[cbContent] = '\0';

		printf("String: %s   syze is %d\n", pbContent, cbContent);

		if (cbContent)
		{
			BOOL bFinal = feof(file);
			// Зашифрованные прочитанного блока на сессионном ключе.
			if (CryptEncrypt(hDuplicateKey, 0, bFinal, 0, (BYTE*)pbContent, &cbContent, bufLen))
			{
				// Запись зашифрованного блока в файл.
				if (!fwrite(pbContent, 1, cbContent, Encrypt))
				{
					printf("The encrypted content can not be written to the 'encrypt.bin'\n");
				}
			}
			else
			{
				printf("Encryption failed.");
			}
			if (CryptDecrypt(hSessionKey, 0, bFinal, 0, (BYTE*)pbContent, &cbContent)) printf("\nDecrypt is: %s\n", pbContent);
		}
		else
		{
			printf("Problem reading the file 'test.txt'\n");
		}
		CryptDestroyKey(hDuplicateKey);
	} while (!feof(file));

	fclose(Encrypt);
	fclose(file);
	CryptDestroyKey(hSessionKey);
	getchar();
	return 0;
}


Файл с кодом - Source.zip (2kb) загружен 3 раз(а).

Отредактировано пользователем 23 сентября 2016 г. 19:55:48(UTC)  | Причина: Не указана

Online Андрей Писарев  
#2 Оставлено : 23 сентября 2016 г. 20:52:15(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2053 раз в 1593 постах
Здравствуйте.

Вы смотрели пример в SDK?
IV нужно использовать.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Геворг оставлено 27.09.2016(UTC)
Online Андрей Писарев  
#3 Оставлено : 23 сентября 2016 г. 20:57:20(UTC)
Андрей *

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 12,719
Мужчина
Российская Федерация

Сказал «Спасибо»: 500 раз
Поблагодарили: 2053 раз в 1593 постах
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Геворг оставлено 27.09.2016(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.