Статус: Новичок
Группы: Участники
Зарегистрирован: 30.05.2013(UTC) Сообщений: 4
|
Здравствуйте. Пытаюсь сделать подпись файла с помощью CAPICOM. Постоянно получаю одну и ту же подпись, независимо от содержимого файла. Проверяю подпись КриптоАРМом, естественно подпись некорректная. Подскажите что не так с моем коде. Цитата: procedure TForm2.Button1Click(Sender: TObject); var MyStore, Certificates, SigData, Signer, Certificate, TimeAttribute : Variant; Buffer: AnsiString; SignText : AnsiString; StreamRead, StreamWrite: TFileStream; Size: LongInt; begin StreamRead := TFileStream.Create('d:\q.txt', fmOpenRead); StreamWrite := TFileStream.Create('d:\q.txt.sig', fmCreate); try MyStore := CreateOLEObject('CAPICOM.Store'); MyStore.Open(2, 'My', 0); Certificates := MyStore.Certificates; Certificates := Certificates.Select('Спискок сертификатов', 'Выберите сертификат для подписи документа:'); SigData := CreateOLEObject('CAPICOM.SignedData'); Signer := CreateOLEObject('CAPICOM.Signer'); TimeAttribute := CreateOleObject('CAPICOM.Attribute'); TimeAttribute.Name := 0; TimeAttribute.Value := NOW(); Signer.AuthenticatedAttributes.Add(TimeAttribute); Signer.Options := 0; Certificate := Certificates.Item[1]; Signer.Certificate := Certificate; SetLength(Buffer, StreamRead.Size); StreamRead.Read(Buffer[1], StreamRead.Size); SigData.Content := Buffer; SignText := SigData.Sign(Signer, True, 0); StreamWrite.Write(SignText[1], Length(SignText)); finally if not VarIsNull(Signer) then Signer := Unassigned; if not VarIsNull(SigData) then SigData := Unassigned; if not VarIsNull(MyStore) then MyStore := Unassigned; if Assigned(StreamRead) then StreamRead.Free; if Assigned(StreamWrite) then StreamWrite.Free; end; end;
Отредактировано пользователем 30 мая 2013 г. 16:06:55(UTC)
| Причина: Не указана Вложение(я): q.rar (2kb) загружен 21 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
Здесь: Buffer: AnsiString; |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 30.05.2013(UTC) Сообщений: 4
|
Автор: Андрей * Здесь: Buffer: AnsiString; Пробовал по всякому и string и ansistring и pchar и ansichar? результат одинаковый
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
а WideString не пробовали? |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
+ чтение файла. + и поиск на форуме по "SysAllocStringByteLen" выдаст работающий код.
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
Посмотрите целиком тему. Ссылка |
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 10.12.2008(UTC) Сообщений: 924 Откуда: Крипто-Про Поблагодарили: 99 раз в 95 постах
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 30.05.2013(UTC) Сообщений: 4
|
Спасибо за ссылки. Посмотрел код, он работает, но только для двоичной подписи, но это не важно, мне ка раз такая по итогу и нужна. Исправил свой код аналогично тому что в теме по ссылке. Вот что вышло: Цитата: procedure TForm2.Button1Click(Sender: TObject); var MyStore, Certificates, SigData, Signer, Certificate, TimeAttribute : Variant; filStream: TFileStream; Buffer: WideString; begin // Чтение файла filStream := TFileStream.Create('d:\q.txt', fmOpenRead or fmShareDenyWrite); try Pointer(Buffer) := SysAllocStringByteLen(nil, filStream.Size); filStream.ReadBuffer(Pointer(Buffer)^, filStream.Size); finally FreeAndNil(filStream); end;
MyStore := CreateOLEObject('CAPICOM.Store'); SigData := CreateOLEObject('CAPICOM.SignedData'); Signer := CreateOLEObject('CAPICOM.Signer');
MyStore.Open(2, 'My', 0);
TimeAttribute := CreateOleObject('CAPICOM.Attribute'); TimeAttribute.Name := 0; TimeAttribute.Value := now; Signer.AuthenticatedAttributes.Add(TimeAttribute);
SigData.Content := Buffer;
Certificates := MyStore.Certificates; Certificates := Certificates.Select('Спискок сертификатов', 'Выберите сертификат для подписи документа:'); Certificate := Certificates.Item[1]; Signer.Certificate := Certificate;
Buffer := SigData.Sign(Signer, True, 1);
// Запись ЭЦП в файл: try filStream := TFileStream.Create('d:\q.txt.sig', fmCreate ); filStream.WriteBuffer(Pointer(Buffer)^, SysStringByteLen(PWideChar(Buffer))); finally filStream.Free; end;
if not VarIsNull(TimeAttribute) then TimeAttribute := Unassigned; if not VarIsNull(Signer) then Signer := Unassigned; if not VarIsNull(SigData) then SigData := Unassigned; if not VarIsNull(MyStore) then MyStore := Unassigned; end;
Только мой код при проверки в КриптоАРМе выдает вот такую ошибку: Цитата: Статус завершения операции: Ошибка. Длительность выполнения операции: 0:00:01.16 Входной файл: D:\q.txt.sig Описание ошибки: Ошибка сохранения сообщения (0x80004005)
Произошла ошибка при загрузке сообщения. Вероятно, сообщение имеет некорректный формат. (0x80004005)
Произошла ошибка при загрузке подписанных данных
Произошла ошибка при добавлении данных в сообщение
В ASN1 встречен неожиданный конец данных. (0x80093102)
Почему не хотит работать с тем капикомом, который рарегистрирован у меня? И еще такой вопрос. Получается, что если размер файла не четный, то последний байт просто отбрасывается? Да и еще. Если отключить вставку времени и создать две подписи моей программой и кодом по ссылке, подписи отличаются последними 63 байтами. А в КриптоАРМе подпись вообще другая Отредактировано пользователем 31 мая 2013 г. 9:25:53(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
0. Никогда не ловил проблем с "четный\нечетный" размер. КриптоАРМ всегда проверял ЭЦП. 1. Подписи каждый раз разные. Это нормально.2. КриптоАРМ может добавлять свои подписанные атрибуты (OID: комментарий, название файла и т.д.) 3. Если поискать по форуму, то я приводил OID-ы от КриптоАРМ |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,719 Сказал «Спасибо»: 500 раз Поблагодарили: 2054 раз в 1594 постах
|
1.2.643.2.45.1.1.1 - Комментарий к ЭЦП 1.2.643.2.45.1.1.2 - Наименование ресурса (файла) 1.2.643.2.45.1.1.3 - Использование ЭЦП (согласовано, подписано, исправлено и т.д. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close