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

Уведомление

Icon
Error

4 Страницы123>»
Опции
К последнему сообщению К первому непрочитанному
Offline AndrewVLGAFC  
#1 Оставлено : 17 апреля 2016 г. 3:26:21(UTC)
AndrewVLGAFC

Статус: Активный участник

Группы: Участники
Зарегистрирован: 29.03.2016(UTC)
Сообщений: 33

Сказал(а) «Спасибо»: 1 раз
Здравствуйте.

Видимо избитая тема
но.

такой вот код

Код:

var
  hProv: HCRYPTPROV;
  hSesKey: HCRYPTKEY;
  s:string;
  count:Byte;
  dwFlags:word;
   Hash: HCRYPTHASH;
  Stream:TMemoryStream;
  p:string;
   Key: HCRYPTKEY;
   DataLen:integer;
   BufLen:integer;
   outt:TMemoryStream;
   Password:string;
begin

  CryptAcquireContext(@hProv,nil,nil ,PROV_GOST_2001_DH ,CRYPT_VERIFYCONTEXT);
  Stream:=TMemoryStream.Create;

  Password:='123';
  CryptCreateHash(hProv,CALG_GR3411,0,0,@Hash);
  CryptHashData(Hash,@Password[1],Length(Password),0);
//  CryptGenKey(hProv,CALG_G28147, 0,@Key);
  CryptDeriveKey(hProv,CALG_G28147,Hash,0,@Key);
  Stream.Clear;

  Stream.LoadFromFile('c:\z\1.txt');
  DataLen:=Stream.Size;
  BufLen:=Stream.Size;
  CryptEncrypt(Key,0,true,0,nil,@BufLen,0);
  Stream.SetSize(BufLen);
  CryptEncrypt(Key,0,true,0,PByte(Stream.Memory),@DataLen,BufLen);
//  SetLength(Str,BufLen);
  Stream.Seek(0,soFromBeginning);
  Stream.SaveToFile('c:\z\1.enc');
//  Stream.ReadBuffer(Pointer(Str)^,BufLen);
//  mmOut.Text:=Str;
  CryptDestroyKey(Key);
  CryptDestroyHash(Hash);

  ///////////////////////////////////////////////////
   CryptCreateHash(hProv,CALG_GR3411,0,0,@Hash);
  CryptHashData(Hash,@Password[1],Length(Password),0);
  CryptDeriveKey(hProv,CALG_G28147,Hash,CRYPT_EXPORTABLE,@Key);
  DataLen:=Stream.Size;
  CryptDecrypt(Key,0,true,0,PByte(Stream.Memory),@DataLen);
//  SetLength(Str,DataLen);
  Stream.Seek(0,soFromBeginning);
  Stream.SaveToFile('c:\z\1.dec');

  CryptDestroyKey(Key);
  CryptDestroyHash(Hash);



зашифрованные данные есть.

а вот в расшифрованном виде первые 7 символов некорретны. все остальные расшифрованы.


Зы. подскажите как в данный код вставить шифрование с использованием сертификата, а не пароля
Offline Андрей Писарев  
#2 Оставлено : 17 апреля 2016 г. 9:00:31(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2044 раз в 1585 постах
Автор: AndrewVLGAFC Перейти к цитате
Здравствуйте.

Видимо избитая тема
но.


Поиск по форуму - даст ответ про IV.

Насчет шифрования с сертификатом - что мешает начать с просмотра SDK\MSDN или CPDN?

Опять же, поиском по форуму, найдутся исходники и на Delphi.

Отредактировано пользователем 17 апреля 2016 г. 9:01:13(UTC)  | Причина: link

Техническую поддержку оказываем тут
Наша база знаний
Offline AndrewVLGAFC  
#3 Оставлено : 17 апреля 2016 г. 15:49:41(UTC)
AndrewVLGAFC

Статус: Активный участник

Группы: Участники
Зарегистрирован: 29.03.2016(UTC)
Сообщений: 33

Сказал(а) «Спасибо»: 1 раз
сваял такую конструкцию

Код:

var
    EncryptAlgorithm : CRYPT_ALGORITHM_IDENTIFIER;
    EncryptParams: CRYPT_ENCRYPT_MESSAGE_PARA;
    DecryptParams: CRYPT_DECRYPT_MESSAGE_PARA;
  hProv: HCRYPTPROV;
  Stream,outstream,decrypted:TMemoryStream;
  cbEncryptedBlob,cbDecryptedMessage:Dword;
begin
  Stream:=TMemoryStream.Create;
    Stream.LoadFromFile('c:\hp\1.txt');
    CryptAcquireContext(@hProv,nil,nil ,PROV_GOST_2001_DH ,CRYPT_VERIFYCONTEXT);
    FillChar( EncryptAlgorithm, SizeOf( CRYPT_ALGORITHM_IDENTIFIER ), #0 );
    EncryptAlgorithm.pszObjId := szOID_CP_GOST_28147;


    FillChar( EncryptParams, SizeOf( CRYPT_ENCRYPT_MESSAGE_PARA ), #0 );

    EncryptParams.cbSize :=  sizeof(CRYPT_ENCRYPT_MESSAGE_PARA);
    EncryptParams.dwMsgEncodingType := MY_ENCODING_TYPE;
    EncryptParams.hCryptProv := hProv;
    EncryptParams.ContentEncryptionAlgorithm := EncryptAlgorithm;

// Âûçîâ ôóíêöèè CryptEncryptMessage.
    if not (CryptEncryptMessage(
        @EncryptParams,
        1,
        @self.pCertContext,
        Stream.Memory,
        Stream.Size,
        nil,
        cbEncryptedBlob)) then
        begin
          Application.MessageBox('error','');
        end;

    outstream:=TMemoryStream.Create;
    outstream.Size:=cbEncryptedBlob;

    if not (CryptEncryptMessage(
        @EncryptParams,
        1,
        @self.pCertContext,
        Stream.Memory,
        Stream.Size,
        outstream.Memory,
        cbEncryptedBlob)) then
        begin
          Application.MessageBox('error','');
        end;

    outstream.SaveToFile('c:\hp\1.enc');
    outstream.Position:=0;

    // hðàñøèôðîâûâàåì


    FillChar( DecryptParams, SizeOf( CRYPT_DECRYPT_MESSAGE_PARA ), #0 );

    DecryptParams.cbSize :=  sizeof(CRYPT_DECRYPT_MESSAGE_PARA);
    DecryptParams.dwMsgAndCertEncodingType  := MY_ENCODING_TYPE;
     decryptParams.cCertStore := 1;
    decryptParams.rghCertStore := @self.hCertStore;


    decrypted:=TMemoryStream.Create;
   if not(CryptDecryptMessage(
        @decryptParams,
        outstream.Memory,
        outstream.Size,
        nil,
        @cbDecryptedMessage,
        nil)) then
   begin
       Application.MessageBox('error','');
   end;

   decrypted.Size:=cbDecryptedMessage;



// Âûçîâ ôóíêöèè CryptDecryptMessage äëÿ ðàñøèôðîâàíèÿ äàííûõ.
    if not (CryptDecryptMessage(
        @decryptParams,
        outstream.Memory,
        outstream.Size,
        decrypted.Memory,
        @cbDecryptedMessage,
        nil)) then
   begin
        Application.MessageBox('error','');
   end;
   decrypted.Position:=0;
   decrypted.SaveToFile('c:\hp\1.dec');



по мотивам http://cpdn.cryptopro.ru...ryptMessagesExample.html

файл для шифрования 69 байт.
первый CryptEncryptMessage возвращает cbEncryptedBlob равный 1705. второй вызов уже 714. и видно в сохраненном файле,что есть в нем что-то лишнее. примерно с 704 позиции идет повторяющийся мусор.

а при первом вызове CryptDecryptMessage cbDecryptedMessage равен 75. при втором 69. что в принципе равно оригинальному файлы. но ведь мы выходному расшифрованному потоку устанавливаем размер после первого вызова CryptDecryptMessage. те 75.

что не так?

зы. вот тут вот https://www.cryptopro.ru....aspx?g=posts&t=9205
вы в другую сторону посылали ) а задача по сути такая же. зашифровать файл сертификатом получателя

Отредактировано пользователем 17 апреля 2016 г. 15:59:39(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#4 Оставлено : 17 апреля 2016 г. 17:01:13(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2044 раз в 1585 постах
С "704 позиции" ? Не видно... без файла сложно сказать.
Почему "мусор"?
Смотреть результаты необходимо специализированными утилитами (ASN.1 Editor\View\dumpasn1).

В указанном посте посылал к поточным функциям, к ним многие приходят, когда нужно шифровать большие файлы.
Техническую поддержку оказываем тут
Наша база знаний
Offline AndrewVLGAFC  
#5 Оставлено : 17 апреля 2016 г. 17:26:34(UTC)
AndrewVLGAFC

Статус: Активный участник

Группы: Участники
Зарегистрирован: 29.03.2016(UTC)
Сообщений: 33

Сказал(а) «Спасибо»: 1 раз
вот собственно что получилось

hp.rar (1kb) загружен 17 раз(а).
Offline AndrewVLGAFC  
#6 Оставлено : 17 апреля 2016 г. 17:50:26(UTC)
AndrewVLGAFC

Статус: Активный участник

Группы: Участники
Зарегистрирован: 29.03.2016(UTC)
Сообщений: 33

Сказал(а) «Спасибо»: 1 раз
Автор: Андрей * Перейти к цитате
С "704 позиции" ? Не видно... без файла сложно сказать.
Почему "мусор"?
Смотреть результаты необходимо специализированными утилитами (ASN.1 Editor\View\dumpasn1).

В указанном посте посылал к поточным функциям, к ним многие приходят, когда нужно шифровать большие файлы.



на закодированный файл говорит Datalength is too large


а вот если после второго вызова CryptEncryptMessage сделать

Код:
    outstream.Size:=cbEncryptedBlob;
    outstream.Position:=0;


то тогда эдитор все видит что внутри. осталось понять, почему cbEncryptedBlob после первого и второгор вызова отличаются

Отредактировано пользователем 17 апреля 2016 г. 17:53:34(UTC)  | Причина: Не указана

Offline Андрей Писарев  
#7 Оставлено : 17 апреля 2016 г. 19:27:52(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2044 раз в 1585 постах

Эта конференция требует регистрации перед тем как вы сможете увидеть скрытые сообщения.




CryptDecryptMessage



Цитата:

pcbDecrypted [in, out, optional]

A pointer to a DWORD that specifies the size, in bytes, of the buffer pointed to by the pbDecrypted parameter. When the function returns, this variable contains the size, in bytes, of the decrypted message copied to pbDecrypted.
Техническую поддержку оказываем тут
Наша база знаний
thanks 6 пользователей поблагодарили Андрей * за этот пост.
AndrewVLGAFC оставлено 17.04.2016(UTC), a13xg0 оставлено 03.01.2018(UTC), d.martynov оставлено 10.03.2018(UTC), kemaev_andrey оставлено 29.03.2018(UTC), vitalislep оставлено 19.12.2019(UTC), Lesav оставлено 01.10.2023(UTC)
Offline AndrewVLGAFC  
#8 Оставлено : 17 апреля 2016 г. 21:40:57(UTC)
AndrewVLGAFC

Статус: Активный участник

Группы: Участники
Зарегистрирован: 29.03.2016(UTC)
Сообщений: 33

Сказал(а) «Спасибо»: 1 раз
сочинил очередной "опус"


по мотивам http://cpdn.cryptopro.ru...example_EncryptFile.html

если правильно понял, что зашифровано с использованием открытого ключа сертификата.

единственное если сделать вызов
CryptAcquireContextA(@hProv,nil,nil,PROV_GOST_2001_DH,PROV_RSA_FULL);
с последним параметром CRYPT_VERIFYCONTEXT - ошибка на CryptGetUserKey ключ не существует
а если CRYPT_NEWKEYSET - ошибка на CryptImportPublicKeyInfoEx - 0х57 параметр задан неверно

а вот с PROV_RSA_FULL отработало без ошибок.

Теперь я так понимаю надо разобраться с http://cpdn.cryptopro.ru...example_decryptFile.html

и будет у меня счастье шифрования на открытом ключе сертификата и расшифрование на закрытом ключе? или я в данном случае что-то опять попутал?
Offline Андрей Писарев  
#9 Оставлено : 17 апреля 2016 г. 22:07:38(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2044 раз в 1585 постах
Цитата:
CryptAcquireContextA(@hProv,nil,nil,PROV_GOST_2001_DH,PROV_RSA_FULL);


Два вопроса:
1) CryptAcquireContext - за что отвечает и какие параметры должны быть
2) PROV_RSA_FULL с чего вдруг
Техническую поддержку оказываем тут
Наша база знаний
Offline AndrewVLGAFC  
#10 Оставлено : 18 апреля 2016 г. 0:54:03(UTC)
AndrewVLGAFC

Статус: Активный участник

Группы: Участники
Зарегистрирован: 29.03.2016(UTC)
Сообщений: 33

Сказал(а) «Спасибо»: 1 раз
на да ) точно. в примере было так

Код:

if(CryptAcquireContext(
        &hProv, 
        "Sender", 
        NULL, 
        PROV_GOST_2001_DH, 
        0)) 


у себя написал так

Код:

CryptAcquireContext(@hProv,nil,nil,PROV_GOST_2001_DH,0);
 


возможно недопонимаю значение второго параметра

для зашифрованного файла ASN.1 Editor говорит Datalength is too large


Перевел из примера на C++ расшифровку
получилось такое




тут получил на строке

Код:
if (CryptImportKey(hProv,pbKeyBlobSimple.Memory,71,hAgreeKey,0,@hSessionKey)) then


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