Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|