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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline DimKaKiber  
#1 Оставлено : 16 июля 2012 г. 16:32:14(UTC)
DimKaKiber

Статус: Участник

Группы: Участники
Зарегистрирован: 12.07.2012(UTC)
Сообщений: 16
Откуда: Томск

Проблема заключается в том, что при расшифровке некоторой строки первые символы остаются в зашифрованном виде, а остальные же расшифровываются нормально.
Версия КриптоПро: 3.6.5360 КС1
Алгоритм Хеширования: 34.11.94
Алгоритм шифрования: 28147-89 (параметры по умолчанию).

При помощи криптографических средств ОС Windows шафрование/дешифрование происходит нормально, т. е. получаю некий зашифрованный текст при шифрации, а при расшифровке получаю текст идентичный с оригиналом.

При использовании в качестве провайдера КриптоПро: 3.6.5360 КС1 получаю нечто следующее:
Цитата:
€ХтХЭ|Йрных обезьян в жопу сунули банан..

Далее приведу код шифрования и дешифрации, который я реализую. Реализация происходит без использования ключевых контейнеров (самый примитив, в общем):
Шифрация:
Код:
Var
hProv: HCRYPTPROV;
Hash: HCRYPTHASH;
Key: HCRYPTKEY;
DataLen,BuffLen: DWORD;
Str, Pass: string;
CrMes, Res: TMemoryStream;
buf: array [0..511] of byte;
begin
CrMes:=TMemoryStream.Create;
Res:=TMemoryStream.Create;
CrMes.LoadFromFile(ExtractFilePath(application.ExeName) +'ОРИГИНАЛ.txt');
CrMes.Seek(0,soFromBeginning);
//Подключаюсь к провайдеру_
CryptAcquireContextA(hProv,nil,nil,PROV_GOST_2001_DH,CRYPT_VERIFYCONTEXT);
//Задаю пароль_
Pass:='шифрация/дешифрация';
//инициализирую  дескриптор нового объекта функции хэширования потока данных.
CryptCreateHash(hProv,CALG_GR3411,0,0,Hash);
//Передаю  данные указанному объекту функции хэширования.
CryptHashData(Hash,PByte(Pass),Length(Pass),0);
//Произвожу криптографические ключи сессии на основе значения хеш-функции, вычисленной по паролям.
CryptDeriveKey(hProv,CALG_G28147,Hash,CRYPT_EXPORTABLE,Key);
DataLen:=CrMes.Read(buf,CrMes.Size);
//Шифрую.
BuffLen:=CrMes.Read(buf,CrMes.Size);
CrMes.Seek(0,soFromBeginning);
//CryptEncrypt(Key,0,True,0,@buf,BuffLen,0);
CryptEncrypt(Key,0,CrMes.Position < CrMes.Size,0,@buf,DataLen,512);
Res.Write(buf,DataLen);
Res.Seek(0,soFromBeginning);
Res.SaveToFile(ExtractFilePath(application.ExeName) +'БК Шифр.txt');
//Освобождаю память и ресурсы.
FreeAndNil(Res);
FreeAndNil(CrMes);
CryptDestroyKey(Key);
CryptDestroyHash(Hash);
CryptReleaseContext(hProv,0);


Дешифрация:
Код:
hProv: HCRYPTPROV;
Hash: HCRYPTHASH;
Key: HCRYPTKEY;
DataLen,BuffLen: DWORD;
Str, Pass: string;
EnCrMes, CryptStream: TMemoryStream;
buf: array  [0..511] of byte;
begin
CryptStream:=TMemoryStream.Create;
CryptStream.LoadFromFile(ExtractFilePath(application.ExeName) +'БК ШИФР.txt');
CryptStream.Seek(0,soFromBeginning);
//Подключаюсь к провайдеру_
CryptAcquireContextA(hProv,nil,nil,PROV_GOST_2001_DH,CRYPT_VERIFYCONTEXT);
//Задаю пароль_
Pass:='шифрация/дешифрация';
//инициализирую  дескриптор нового объекта функции хэширования потока данных.
CryptCreateHash(hProv,CALG_GR3411,0,0,Hash);
//Передаю  данные указанному объекту функции хэширования.
CryptHashData(Hash,PByte(Pass),Length(Pass),0);
//Произвожу криптографические ключи сессии на основе значения хеш-функции, вычисленной по паролям.
CryptDeriveKey(hProv,CALG_G28147,Hash,CRYPT_EXPORTABLE,Key);
DataLen:=CryptStream.Read(buf,CryptStream.Size);
CryptStream.Seek(0,soFromBeginning);
CryptDecrypt(Key,0,CryptStream.Position < CryptStream.Size,0,@buf,DataLen);
EnCrMes:=TMemoryStream.Create;
EnCrMes.Write(buf,DataLen);
EnCrMes.Seek(0,soFromBeginning);
EnCrMes.SaveToFile(ExtractFilePath(application.ExeName) +'БК РасШифр.txt');
//Освобождаю память и ресурсы.
FreeAndNil(EnCrMes);
FreeAndNil(CryptStream);
CryptDestroyKey(Key);
CryptDestroyHash(Hash);
CryptReleaseContext(hProv,0);


Очень нужно, чтобы происходило все равильно, т. к. шифроваться в моей системе могут и строки длиной всего 2-3 символа, что при нынешнем положении дел никак не осуществимо(((
Offline Андрей Писарев  
#2 Оставлено : 16 июля 2012 г. 16:37:37(UTC)
Андрей *

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

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

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
а вектор инициализации никак не должен участвовать?

Отредактировано пользователем 16 июля 2012 г. 16:41:21(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline DimKaKiber  
#3 Оставлено : 16 июля 2012 г. 16:38:48(UTC)
DimKaKiber

Статус: Участник

Группы: Участники
Зарегистрирован: 12.07.2012(UTC)
Сообщений: 16
Откуда: Томск

Да должен наверное) Только как (честно признаюсь) это реализовать не могу додуматься....
Offline Андрей Писарев  
#4 Оставлено : 16 июля 2012 г. 16:43:16(UTC)
Андрей *

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

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

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
DimKaKiber написал:
Да должен наверное) Только как (честно признаюсь) это реализовать не могу додуматься....




и SDK значит не особо нужен... так?


а что мешает использовать высокоуровневые функции?

Отредактировано пользователем 16 июля 2012 г. 16:45:38(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline DimKaKiber  
#5 Оставлено : 16 июля 2012 г. 16:52:49(UTC)
DimKaKiber

Статус: Участник

Группы: Участники
Зарегистрирован: 12.07.2012(UTC)
Сообщений: 16
Откуда: Томск

Пока задача - разобраться с этими функциями.
SDK нужен, но только либо не вижу именно как в моем случае установить этот вектор, либо плохо разобрался.
Спрашивать до того, как попытаюсь разобраться и покопать в коде не привык, да и неинтересно так.....Спрашиваю только от того, что уже не могу выдать вариант решения какой-либо.
Offline DimKaKiber  
#6 Оставлено : 16 июля 2012 г. 17:21:51(UTC)
DimKaKiber

Статус: Участник

Группы: Участники
Зарегистрирован: 12.07.2012(UTC)
Сообщений: 16
Откуда: Томск

Если правильно понял, то после процедур шифрации, дешифрации надо изобразить примерно такое:

Код:
CryptSetKeyParam(Key,KP_IV,@buf,0);


Но эффекта положительного все равно никакого......
Offline Андрей Писарев  
#7 Оставлено : 16 июля 2012 г. 17:49:00(UTC)
Андрей *

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

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

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
DimKaKiber написал:
Если правильно понял, то после процедур шифрации, дешифрации надо изобразить примерно такое:

Код:
CryptSetKeyParam(Key,KP_IV,@buf,0);


Но эффекта положительного все равно никакого......


Может ДО ?
Техническую поддержку оказываем тут
Наша база знаний
Offline DimKaKiber  
#8 Оставлено : 17 июля 2012 г. 9:17:27(UTC)
DimKaKiber

Статус: Участник

Группы: Участники
Зарегистрирован: 12.07.2012(UTC)
Сообщений: 16
Откуда: Томск

Что до, что после эффект один:)

Ладно - далее нашел пример - Пример на установку и получение сессионного ключа, где выставляются вектора инициализации....Получилось примерно так:

Код:
//Подключаюсь к провайдеру_
CryptAcquireContextA(hProv,nil,nil,PROV_GOST_2001_DH,CRYPT_VERIFYCONTEXT);
//  Генерация восьми байтов случайных данных в pbRandomData.
CryptGenRandom(hProv,8,@Buf);
// Создание случайного сессионного ключа блочного шифрования.
CryptGenKey(hProv,CALG_G28147,CRYPT_EXPORTABLE,Key);
// Чтение режима шифрования.
DataLen := 16;
CryptGetKeyParam(Key,KP_MODE,@buf,DataLen,0);
// Чтение вектора инициализации.
//  Получение длины вектора инициализации.
CryptGetKeyParam(Key,KP_IV,@buf,DataLen,0);
// Получение IV - вектора инициализации.
CryptGetKeyParam(Key,KP_IV,@buf,DataLen,0);
//  Переустановка вектора инициализации.
CryptSetKeyParam(Key,KP_IV,@Buf,0);
// Чтение нового вектора инициализации.
//  Получение длины нового вектора инициализации.
CryptGetKeyParam(Key,KP_IV,@buf,DataLen,0);
// Получение IV - вектора инициализации.
CryptGetKeyParam(Key,KP_IV,@buf,DataLen,0);


Но краказябры на месте первых 8 байт при расшифровке никуда не делись

Отредактировано пользователем 17 июля 2012 г. 11:29:45(UTC)  | Причина: Не указана

Offline DimKaKiber  
#9 Оставлено : 17 июля 2012 г. 13:31:30(UTC)
DimKaKiber

Статус: Участник

Группы: Участники
Зарегистрирован: 12.07.2012(UTC)
Сообщений: 16
Откуда: Томск

В общем - тыкните хоть носом где и что неправильно - буду сам разбираться......Только надо с местом корректировки определиться - идеи иссякли(((
Offline Максим Коллегин  
#10 Оставлено : 17 июля 2012 г. 13:36:09(UTC)
Максим Коллегин

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

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,399
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 719 раз в 623 постах
Перед шифрованием IV сохранить, перед расшифрованием - восстановить.
Знания в базе знаний, поддержка в техподдержке
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.