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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline Alex_Y  
#1 Оставлено : 30 мая 2013 г. 16:00:23(UTC)
Alex_Y

Статус: Новичок

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

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Андрей Писарев  
#2 Оставлено : 30 мая 2013 г. 16:25:07(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Здесь: Buffer: AnsiString;
Техническую поддержку оказываем тут
Наша база знаний
Offline Alex_Y  
#3 Оставлено : 30 мая 2013 г. 16:33:59(UTC)
Alex_Y

Статус: Новичок

Группы: Участники
Зарегистрирован: 30.05.2013(UTC)
Сообщений: 4
Российская Федерация

Автор: Андрей * Перейти к цитате
Здесь: Buffer: AnsiString;

Пробовал по всякому и string и ansistring и pchar и ansichar? результат одинаковый Brick wall
Offline Андрей Писарев  
#4 Оставлено : 30 мая 2013 г. 16:35:34(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
а WideString не пробовали?
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#5 Оставлено : 30 мая 2013 г. 16:40:24(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
+ чтение файла.
+ и поиск на форуме по "SysAllocStringByteLen" выдаст работающий код.

Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#6 Оставлено : 30 мая 2013 г. 16:42:22(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
Посмотрите целиком тему.
Ссылка
Техническую поддержку оказываем тут
Наша база знаний
Offline Новожилова Елена  
#7 Оставлено : 30 мая 2013 г. 17:01:16(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Созданная при помощи CAPICOM отделенная подпись у вас проверится в cryptcp скорее всего только в том случае, если исходный файл будет в кодировке UCS2 LE. См. http://www.cryptopro.ru/...etsya-v-kriptoarmcryptcp
Offline Alex_Y  
#8 Оставлено : 31 мая 2013 г. 8:21:31(UTC)
Alex_Y

Статус: Новичок

Группы: Участники
Зарегистрирован: 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 байтами. А в КриптоАРМе подпись вообще другая Eh?

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

Offline Андрей Писарев  
#9 Оставлено : 31 мая 2013 г. 9:33:56(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
0. Никогда не ловил проблем с "четный\нечетный" размер. КриптоАРМ всегда проверял ЭЦП.
1. Подписи каждый раз разные. Это нормально.
2. КриптоАРМ может добавлять свои подписанные атрибуты (OID: комментарий, название файла и т.д.)
3. Если поискать по форуму, то я приводил OID-ы от КриптоАРМ
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей Писарев  
#10 Оставлено : 31 мая 2013 г. 9:36:31(UTC)
Андрей *

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

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

Сказал «Спасибо»: 494 раз
Поблагодарили: 2035 раз в 1579 постах
1.2.643.2.45.1.1.1 - Комментарий к ЭЦП
1.2.643.2.45.1.1.2 - Наименование ресурса (файла)
1.2.643.2.45.1.1.3 - Использование ЭЦП (согласовано, подписано, исправлено и т.д.
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.