Статус: Участник
Группы: Участники
Зарегистрирован: 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 символа, что при нынешнем положении дел никак не осуществимо(((
|