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

Уведомление

Icon
Error

4 Страницы<1234>
Опции
К последнему сообщению К первому непрочитанному
Offline Zester  
#11 Оставлено : 1 августа 2012 г. 16:35:02(UTC)
Zester

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

Группы: Участники
Зарегистрирован: 20.06.2012(UTC)
Сообщений: 30
Мужчина
Чехия
Откуда: Москва

Сказал «Спасибо»: 4 раз
Поблагодарили: 4 раз в 2 постах
Андрей * написал:
Подпись не верна [2148077575] :Неправильное значение хеша

Хеш вложенных данных:
31A6C136A8182709C91174CFFFF4178A8DF42B54F3559B45BC0EF8319B45967A
а хеш от файла:
10E3C383BDC8A58D16588B8558B252C52B9F3F7419AFE3BB7E6844F5BEA27C1C

значит имеет место быть неправильное считывание данных (т.е. ЭЦП создается не на оригинал)

Получается, что проблема при преобразовывании в WideString ?
Offline Андрей Писарев  
#12 Оставлено : 1 августа 2012 г. 16:36:33(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2051 раз в 1591 постах
Zester написал:
Андрей * написал:
Подпись не верна [2148077575] :Неправильное значение хеша

Хеш вложенных данных:
31A6C136A8182709C91174CFFFF4178A8DF42B54F3559B45BC0EF8319B45967A
а хеш от файла:
10E3C383BDC8A58D16588B8558B252C52B9F3F7419AFE3BB7E6844F5BEA27C1C

значит имеет место быть неправильное считывание данных (т.е. ЭЦП создается не на оригинал)

Получается, что проблема при преобразовывании в WideString ?


нет, сейчас проверил в XE2 update 3
перекомпилировалось все и работает, КриптоАРМ проверяет...


скомпилируй с моим CAPICOM_TLB.pas

еще:
FormCreate(Sender: TObject);
begin
CoInitialize(nil);

есть ?



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

Вложение(я):
CAPICOM_TLB.pas (140kb) загружен 78 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Техническую поддержку оказываем тут
Наша база знаний
Offline Zester  
#13 Оставлено : 1 августа 2012 г. 17:14:48(UTC)
Zester

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

Группы: Участники
Зарегистрирован: 20.06.2012(UTC)
Сообщений: 30
Мужчина
Чехия
Откуда: Москва

Сказал «Спасибо»: 4 раз
Поблагодарили: 4 раз в 2 постах
Андрей * написал:

еще:
FormCreate(Sender: TObject);
begin
CoInitialize(nil);

есть ?


Есть

Андрей * написал:
скомпилируй с моим CAPICOM_TLB.pas

скомпилировал теперь с твоим CAPICOM_TLB.pas

Андрей * написал:
перекомпилировалось все и работает, КриптоАРМ проверяет...

у меня прежняя ошибка:
Статус завершения операции: Одна или несколько подписей некорректна или нет доверия.
Длительность выполнения операции: 0:00:00.42
Входной файл: D:\FileCryptoSigner\1\req_42990fb2-2c12-4c3a-b6f2-5fe4f8a45adc.xml.sig
Описание ошибки:
Одна или несколько подписей некорректна или нет доверия

Вот мой текущий код:
Код:
// **********************************************cFXML
// Создание цифровой подписи Андрей КАПИКОМ
procedure TMainForm.BitBtn2Click(Sender: TObject);
var
  filStream: TFileStream;
  Buffer: WideString;
  oStore: CAPICOM_TLB.IStore;
  oSignedData: CAPICOM_TLB.ISignedData;
  oSigner: CAPICOM_TLB.ISigner2;
  oCertificates: CAPICOM_TLB.ICertificates2;
  oCer1: CAPICOM_TLB.ICertificates;
  oAttribute: CAPICOM_TLB.IAttribute;
begin
  // Чтение файла
  try
    filStream := TFileStream.Create(EditSignedFile.Text, fmOpenRead or fmShareDenyWrite );
    SetLength(Buffer, filStream.Size);
    filStream.ReadBuffer(Pointer(Buffer)^, filStream.Size);
  finally
    filStream.Free;
  end;

  // Создать COM-объекты
  try
    oStore := CoStore.Create;
    oSignedData := CoSignedData.Create;
    //oSigner := CoSigner.Create;
    oSigner := CreateComObject(CLASS_Signer) as CAPICOM_TLB.ISigner2;

    oStore.Open(CAPICOM_CURRENT_USER_STORE,'My', CAPICOM_STORE_OPEN_READ_ONLY);
    oAttribute := CoAttribute.Create;
    oAttribute.Name := CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
    oAttribute.Value := now;  // в UTC нужно...
    oSigner.AuthenticatedAttributes.Add(oAttribute);
 	except
    on oErr: Exception do
    begin
    ShowMessage('Для подписи запроса электронно-цифровой подписью необходимо наличие установленного компонента Microsoft CAPICOM на вашей рабочей станции.'+chr(13)+
                  'Пожалуйста, обратитесь к системному администратору.'+Chr(13)+
                  Trim(oErr.Message));
    exit;
    end;
	end;

  // Содержимое
  oSignedData.Content := Buffer;

  // Выбрать сертификат
  try
    oCertificates := oStore.Certificates;
    //oCertificates := ICertificates2(IDisPatch(oStore.Certificates));
    oCer1 := oCertificates.Select('Выбор сертификата', 'Пожалуйста, выберите сертификат для подписи.', FALSE);
    oSigner.Certificate := CAPICOM_TLB.ICertificate2(IDisPatch(oCer1.Item[1]));
  except
    on oErr: Exception do
    begin
      ShowMessage('Сертификат не найден. Пожалуйста, обратитесь к системному администратору.!' + Chr(13) +
                  Trim(oErr.Message));
  		Exit;
    end;
  end;

  // Создание ЭЦП
  Buffer := oSignedData.Sign(oSigner, TRUE, CAPICOM_ENCODE_BINARY);

  // Запись ЭЦП в файл:
  try
    filStream := TFileStream.Create(EditSignFile.Text, fmCreate );
    filStream.WriteBuffer(Pointer(Buffer)^, SysStringByteLen(PWideChar(Buffer)));
  finally
    filStream.Free;
  end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  CoInitialize(nil);
end;

на выходе файл req_42990fb2-2c12-4c3a-b6f2-5fe4f8a45adc.xml.sig

Отредактировано пользователем 1 августа 2012 г. 17:21:38(UTC)  | Причина: Не указана

Вложение(я):
req_42990fb2-2c12-4c3a-b6f2-5fe4f8a45adc.xml.sig (2kb) загружен 11 раз(а).
req_42990fb2-2c12-4c3a-b6f2-5fe4f8a45adc.xml (4kb) загружен 13 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Zester  
#14 Оставлено : 1 августа 2012 г. 17:17:00(UTC)
Zester

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

Группы: Участники
Зарегистрирован: 20.06.2012(UTC)
Сообщений: 30
Мужчина
Чехия
Откуда: Москва

Сказал «Спасибо»: 4 раз
Поблагодарили: 4 раз в 2 постах
Андрей * написал:
скомпилируй с моим CAPICOM_TLB.pas

Мой бывший CAPICOM_TLB гораздо толще 277 410 байт
Вложение(я):
MY_CAPICOM_TLB.pas (271kb) загружен 16 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Zester  
#15 Оставлено : 1 августа 2012 г. 17:27:04(UTC)
Zester

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

Группы: Участники
Зарегистрирован: 20.06.2012(UTC)
Сообщений: 30
Мужчина
Чехия
Откуда: Москва

Сказал «Спасибо»: 4 раз
Поблагодарили: 4 раз в 2 постах
Вот, мой capicom.dll
Вложение(я):
capicom.dll (496kb) загружен 18 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Андрей Писарев  
#16 Оставлено : 1 августа 2012 г. 17:35:46(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2051 раз в 1591 постах
Zester написал:
Андрей * написал:
скомпилируй с моим CAPICOM_TLB.pas

Мой бывший CAPICOM_TLB гораздо толще 277 410 байт


я знаю...



Цитата:
у меня прежняя ошибка:
Статус завершения операции: Одна или несколько подписей некорректна или нет доверия.
Длительность выполнения операции: 0:00:00.42
Входной файл: D:\FileCryptoSigner\1\req_42990fb2-2c12-4c3a-b6f2-5fe4f8a45adc.xml.sig
Описание ошибки:
Одна или несколько подписей некорректна или нет доверия

ну так щелкни в КриптоАРМ-е - статус ЭЦП - неправильная подпись, так?

Отредактировано пользователем 1 августа 2012 г. 17:36:40(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#17 Оставлено : 1 августа 2012 г. 17:45:06(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2051 раз в 1591 постах
если вставляю твой вариант:
- не работает ("хеш в ЭЦП не тот")

Код:
 try
    filStream := TFileStream.Create(EditSignedFile.Text, fmOpenRead or fmShareDenyWrite );
    SetLength(Buffer, filStream.Size);
    filStream.ReadBuffer(Pointer(Buffer)^, filStream.Size);
  finally
    filStream.Free;
  end;  



а с этим - работает и ЭЦП проверяется:

Код:
 FileStm:= TFileStream.Create(FN, fmOpenRead  or fmShareDenyWrite );
  try 
    Pointer( Buffer):= SysAllocStringByteLen(nil, FileStm.Size); 
  FileStm.ReadBuffer(Pointer(Buffer)^, FileStm.Size);
  finally 
    FreeAndNil(FileStm);
  end;




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

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
Alexcrool оставлено 29.10.2021(UTC)
Offline Андрей Писарев  
#18 Оставлено : 1 августа 2012 г. 18:32:51(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2051 раз в 1591 постах
в общем: твой код целиком перенес к себе - и ЭЦП перестала быть валидной после создания ...

Техническую поддержку оказываем тут
Наша база знаний
Offline Zester  
#19 Оставлено : 1 августа 2012 г. 19:05:31(UTC)
Zester

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

Группы: Участники
Зарегистрирован: 20.06.2012(UTC)
Сообщений: 30
Мужчина
Чехия
Откуда: Москва

Сказал «Спасибо»: 4 раз
Поблагодарили: 4 раз в 2 постах
Андрей * написал:
в общем: твой код целиком перенес к себе - и ЭЦП перестала быть валидной после создания ...

Да! Ура!
Наконец-то получился работающий код!
В сухом остатке правильно работающий модуль:
Код:

unit MainUnit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.Oleauto,
  CAPICOMUtilitiesUnit, System.Types, IdCoderMIME, IdGlobal,
  CAPICOM_TLB,
  ActiveX,
  System.Win.ComObj;

type
  //TByteArray = array of Byte;
  TMainForm = class(TForm)
    GroupBoxSignedFile: TGroupBox;
    GroupBoxSignFile: TGroupBox;
    EditSignedFile: TEdit;
    EditSignFile: TEdit;
    BitBtn3: TBitBtn;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

// **********************************************cFXML
// Создание цифровой подписи
procedure TMainForm.BitBtn3Click(Sender: TObject);
var
  filStream: TFileStream;
  Buffer: WideString;
  oStore: CAPICOM_TLB.IStore;
  oSignedData: CAPICOM_TLB.ISignedData;
  oSigner: CAPICOM_TLB.ISigner2;
  oCertificates: CAPICOM_TLB.ICertificates2;
  oCer1: CAPICOM_TLB.ICertificates;
  oAttribute: CAPICOM_TLB.IAttribute;
begin
  // Чтение файла
  filStream := TFileStream.Create(EditSignedFile.Text, fmOpenRead  or fmShareDenyWrite);
  try
    Pointer(Buffer) := SysAllocStringByteLen(nil, filStream.Size);
    filStream.ReadBuffer(Pointer(Buffer)^, filStream.Size);
  finally
    FreeAndNil(filStream);
  end;

  // Создать COM-объекты
  try
    oStore := CoStore.Create;
    oSignedData := CoSignedData.Create;
    //oSigner := CoSigner.Create;
    oSigner := CreateComObject(CLASS_Signer) as CAPICOM_TLB.ISigner2;

    // Обратиться к контейнеру
    oStore.Open(CAPICOM_CURRENT_USER_STORE,'My', CAPICOM_STORE_OPEN_READ_ONLY);

    // Нужно поставить галку "Включить время создания подписи"
    oAttribute := CoAttribute.Create;
    oAttribute.Name := CAPICOM_AUTHENTICATED_ATTRIBUTE_SIGNING_TIME;
    oAttribute.Value := now;  // в UTC нужно...
    oSigner.AuthenticatedAttributes.Add(oAttribute);
 	except
    on oErr: Exception do
    begin
    ShowMessage('Для подписи запроса электронно-цифровой подписью необходимо наличие установленного компонента Microsoft CAPICOM на вашей рабочей станции.'+chr(13)+
                  'Пожалуйста, обратитесь к системному администратору.'+Chr(13)+
                  Trim(oErr.Message));
    exit;
    end;
	end;

  // Содержимое
  oSignedData.Content := Buffer;

  // Выбрать сертификат
  try
    oCertificates := oStore.Certificates;
    //oCertificates := ICertificates2(IDisPatch(oStore.Certificates));
    oCer1 := oCertificates.Select('Выбор сертификата', 'Пожалуйста, выберите сертификат для подписи.', FALSE);
    oSigner.Certificate := CAPICOM_TLB.ICertificate2(IDisPatch(oCer1.Item[1]));
  except
    on oErr: Exception do
    begin
      ShowMessage('Сертификат не найден. Пожалуйста, обратитесь к системному администратору.!' + Chr(13) +
                  Trim(oErr.Message));
  		Exit;
    end;
  end;

  // Создание ЭЦП
  Buffer := oSignedData.Sign(oSigner, TRUE, CAPICOM_ENCODE_BINARY);

  // Запись ЭЦП в файл:
  try
    filStream := TFileStream.Create(EditSignFile.Text, fmCreate );
    filStream.WriteBuffer(Pointer(Buffer)^, SysStringByteLen(PWideChar(Buffer)));
  finally
    filStream.Free;
  end;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  CoInitialize(nil);
end;

end.


Большое спасибо за помощь! Часто работа с криптографией похожа на игру в черный ящикBrick wall
Вложение(я):
capicom.dll (496kb) загружен 197 раз(а).
CAPICOM_TLB.pas (140kb) загружен 221 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
thanks 2 пользователей поблагодарили Zester за этот пост.
KonstantinB оставлено 26.04.2019(UTC), Alexcrool оставлено 29.10.2021(UTC)
Offline Андрей Писарев  
#20 Оставлено : 1 августа 2012 г. 19:37:35(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2051 раз в 1591 постах
Zester написал:


Большое спасибо за помощь! Часто работа с криптографией похожа на игру в черный ящикBrick wall


Anxious
Capicom лишь вершина айсберга...

всего-то с десяток "строк кода" ...

Отредактировано пользователем 1 августа 2012 г. 19:45:23(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
KonstantinB оставлено 26.04.2019(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
4 Страницы<1234>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.