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

Уведомление

Icon
Error

3 Страницы<123
Опции
К последнему сообщению К первому непрочитанному
Online Андрей Писарев  
#21 Оставлено : 17 июля 2012 г. 15:40:12(UTC)
Андрей *

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

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

Сказал «Спасибо»: 555 раз
Поблагодарили: 2252 раз в 1757 постах
SDK
EncryptFile


не смотрел?

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

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

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

Смотрел....По нему сейчас код начал переписывать (в части получения векторов). Нашел Восьмерку свою мистическую (Длина ветора инициализации). Я только не понимаю - нельзя что ли этот вектор сбрасывать как-нибудь постоянно на дефолтное значение перед каждой процедурой Шифрации и дешифрации?

Вот так получилась процедура шифрации и сохранения вектора в файл:

Код:
Var
hProv: HCRYPTPROV;
Hash: HCRYPTHASH;
Key: HCRYPTKEY;
DataLen,BuffLen: DWORD;
Str, Pass: string;
CrMes, Res,Vector: TMemoryStream;
buf: array [0..511] of byte;
Param: Cardinal;
VecSizeIV: PByte;
dwCount: Byte;
dwIV: Dword; //Длина вектора инициализации
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);
// Создание случайного сессионного ключа блочного шифрования.
CryptGenKey(hProv,CALG_G28147,CRYPT_EXPORTABLE,Key);
// Определение размера вектора инициализации сессионного ключа.
CryptGetKeyParam(Key,KP_IV,nil,&dwIV,0);
// Определение вектора инициализации сессионного ключа.
CryptGetKeyParam(Key,KP_IV,VecSizeIV,&dwIV,0);
Vector:=TMemoryStream.Create;
Vector.Write(VecSizeIV,dwIV);
Vector.SaveToFile(ExtractFilePath(application.ExeName) +'Вектор инициализации.txt');  //Сохраняю вектор в файл
FreeAndNil(Vector);
//Задаю пароль_
Pass:='шифрация/дешифрация';
//инициализирую  дескриптор нового объекта функции хэширования потока данных.
CryptCreateHash(hProv,CALG_GR3411,0,0,Hash);
//Передаю  данные указанному объекту функции хэширования.
CryptHashData(Hash,PByte(Pass),Length(Pass),0);
CryptSetHashParam(Hash,HP_HASHVAL,@buf,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,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);


Так получение вектора и расшифровка:


Код:
Var
hProv: HCRYPTPROV;
Hash: HCRYPTHASH;
Key: HCRYPTKEY;
DataLen,BuffLen: DWORD;
Str, Pass: string;
EnCrMes, CryptStream,Vector: TMemoryStream;
buf: array  [0..511] of byte;
Param: Cardinal;
VecSizeIV: PByte;
dwCount: Byte;
dwIV: Dword; //Длина вектора инициализации
begin
CryptStream:=TMemoryStream.Create;
CryptStream.LoadFromFile(ExtractFilePath(application.ExeName) +'БК ШИФР.txt');
CryptStream.Seek(0,soFromBeginning);
//Подключаюсь к провайдеру_
CryptAcquireContextA(hProv,nil,nil,PROV_GOST_2001_DH,CRYPT_VERIFYCONTEXT);
// Создание случайного сессионного ключа блочного шифрования.
CryptGenKey(hProv,CALG_G28147,CRYPT_EXPORTABLE,Key);
//Читаю вектор инициализации из файла.
Vector:=TMemoryStream.Create;
Vector.LoadFromFile(ExtractFilePath(application.ExeName) +'Вектор инициализации.txt');
VecSizeIV:=Vector.Memory;
dwIV:=Vector.Size;
ShowMessage(IntToStr(dwIV));
//выставляю вектор инициализации.
// Установка вектора инициализации - без него первые 8 байт
    // расшифруются неправильно.
CryptSetKeyParam(Key,KP_IV,VecSizeIV,0);
//Задаю пароль_
Pass:='шифрация/дешифрация';
//инициализирую  дескриптор нового объекта функции хэширования потока данных.
CryptCreateHash(hProv,CALG_GR3411,0,0,Hash);
//Передаю  данные указанному объекту функции хэширования.
CryptHashData(Hash,PByte(Pass),Length(Pass),0);
//Произвожу криптографические ключи сессии на основе значения хеш-функции, вычисленной по паролям.
CryptDeriveKey(hProv,CALG_G28147,Hash,CRYPT_EXPORTABLE,Key);
CryptSetHashParam(Hash,HP_HASHVAL,@buf,0);
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);




Ну и один хрен краказябры не уходят((((( сейчас еще попробую до кучи все ключи в файлы экспортировать и с них при расшифровке все считывать

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

RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
3 Страницы<123
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.