Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.10.2011, 18:00
Coder2k8 Coder2k8 вне форума
Прохожий
 
Регистрация: 06.05.2009
Сообщения: 16
Репутация: 10
По умолчанию CAPICOM + delphi

Доброго времени суток. Есть задача подписать текстовый файл, с присоедененной подписью pksc7. Раньше пользовался скриптом на VB, сейчас возникла необходимость переписать все на делфи либо в отдельное приложение либо в COM-объект.
Сделать это все могу и сам (наверно), но все надо сделать в кратчайшие сроки. Возможно кто этим занимался. Был бы признателен либо за исходный код, либо за подробное описание. Использование capicom не критично, можно и через cryptoAPI.
Зарание спасибо
Ответить с цитированием
  #2  
Старый 19.10.2011, 18:05
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Я не спец в этом, но может поможет.
__________________
Грамотно поставленный вопрос содержит не менее 50% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
  #3  
Старый 19.10.2011, 18:32
Coder2k8 Coder2k8 вне форума
Прохожий
 
Регистрация: 06.05.2009
Сообщения: 16
Репутация: 10
По умолчанию

Спасибо, читал. Не совсем то, что нужно. Так как про саму подпись очень мало инфы, и проект, который должен подписывать - не подписывает. А судя по коду он подписывает detached, то есть отдельной подписью
Ответить с цитированием
  #4  
Старый 20.10.2011, 11:09
Coder2k8 Coder2k8 вне форума
Прохожий
 
Регистрация: 06.05.2009
Сообщения: 16
Репутация: 10
По умолчанию

Возникла маленькая проблема. нужно прочитать файл как двоичную строку (bynaryString) и перевести её в ByteArray;
Подскажите, пожалуйста, как это сделать?
Ответить с цитированием
  #5  
Старый 20.10.2011, 11:57
Coder2k8 Coder2k8 вне форума
Прохожий
 
Регистрация: 06.05.2009
Сообщения: 16
Репутация: 10
По умолчанию Подробнее

Есть такой код:
PHP код:
Private Sub sign(ByVal SrcFile As StringByVal DestFile As String)

         
' Читаем исходный файл
         Dim inputData As Byte() = My.Computer.FileSystem.ReadAllBytes(SrcFile)

         ' 
Если файл сдоержит нечетное кол-во байт нас ожидают проблемы.
         
' дополняем прочитанный документ пробелом
         If ((inputData.Length Mod 2) = 1) Then
             System.Array.Resize(inputData, inputData.Length + 1)
             inputData(inputData.Length - 1) = 32 ' 
Space character
         End 
If

         
' Выбираем сертификат для подписи, искать будем в личный сертификатах текущего пользователя системы
         Dim Store As CAPICOM.Store = New CAPICOM.Store
         Store.Open(CAPICOM.CAPICOM_STORE_LOCATION.CAPICOM_CURRENT_USER_STORE, "My", CAPICOM.CAPICOM_STORE_OPEN_MODE.CAPICOM_STORE_OPEN_READ_ONLY)

         Dim Certificates As CAPICOM.Certificates = Store.Certificates.Find(CAPICOM.CAPICOM_CERTIFICATE_FIND_TYPE.CAPICOM_CERTIFICATE_FIND_KEY_USAGE, CAPICOM.CAPICOM_KEY_USAGE.CAPICOM_DIGITAL_SIGNATURE_KEY_USAGE)
         If (Certificates.Count = 0) Then
             MessageBox.Show("Нет сертификатов для подписи")
             Return
         End If

         Dim SelectedCerts As CAPICOM.Certificates

         ' 
Показываем пользователю диалог для выбора сертификата для подписи
         
Try
             
SelectedCerts Certificates.Select("Выбор сертификата""Выберите сертификат для создания подписи")
         Catch
             
MessageBox.Show("Нет сертификатов для подписи")
             Return
         
End Try

         
' Сертификат, при помощи которого будет производиться подписание
         Dim Signer As CAPICOM.Signer = New CAPICOM.Signer
         Signer.Certificate = SelectedCerts.Item(1)

         ' 
Начинаем подписывать
         Dim SignedData 
As CAPICOM.SignedData = New CAPICOM.SignedData

         
' Устанавливаем данные
         Dim utils As CAPICOM.Utilities = New CAPICOM.Utilities
         Dim inputString As String = utils.ByteArrayToBinaryString(inputData)
         SignedData.Content = inputString

         ' 
Собственно подписьЧтобы не наступить на грабли с нечетным кол-вом байт
         
' Требуем выдачу сообщения в виде строки в Base64 виде
         Dim outputData = SignedData.Sign(Signer, False, CAPICOM.CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64)

         ' 
Декодируем Base64 методомкоторый ничего не потеряет.
         
Dim result() As Byte
         result 
System.Convert.FromBase64String(outputData)

         
' Сохраняем результат в файл
         My.Computer.FileSystem.WriteAllBytes(DestFile, result, False)

         MessageBox.Show("Message Signed")

     End Sub 

Нужно перевести его на делфи.
Уже имеется:
PHP код:
procedure TForm1.Button1Click(SenderTObject);
 var 
StoreOlevariant//хранилище
     
SignerOleVariant//дата для подписи
     
SignedDataOleVariant//подписыватель
     
Utils:OleVariant//утилиты для подписи
     
fsoOleVariant//файлы
     
Crt Olevariant;    //сертификат
     
CrtsOlevariant;    //все сертификаты хранилища
     
countlongint;      //кол-во сертификатов
     
signOleVariant;    //подписанный файл
     
outputOleVariant//Выходные данные
     
inputstring//array of Byte; //Входные данные
begin
  Store
:=CreateOleObject('CAPICOM.store');
  
Signer:=CreateOleObject('Capicom.signer');
  
SignedData:=CreateOleObject('Capicom.SignedData');
  
Utils:=CreateOleObject('CAPICOM.Utilities');
  
fso := CreateOleObject('Scripting.FileSystemObject');

  
Store.Open(2);              //открываем хранилище сертификатов текущего пользователя
  
Crts:=Store.Certificates;   //получаем все сертификаты из этого хранилища
  
count:=crts.Count;          //считаем их

  
input:= edit1.text;//fso.OpenTextFile('c:/test/cody.xml', 1);  //читаем файл

                  
Memo1.Lines.Add(IntToStr(Crts.count));

  
Crt := crts.item[2];                    //Выбор первого сертификата
  
Signer.Certificate := Crt;                             //Установка ранее выбранного сертификата в параметр
  
Signer.Options := 0;                    //установка параметра подписи (CAPICOM_CERTIFICATE_INCLUDE_CHAIN_EXCEPT_ROOT)

  
Memo1.Lines.Add(Crt.serialnumber);      //добавляем в мемо серийный номер сетификата
  
Memo1.Lines.Add(Crt.SubjectName);       //и его владельца

  
SignedData.Content:= input;

  
sign := SignedData.sign(Signerfalse,0);

  try
    
Memo1.Lines.Add(sign);
  
except
    memo1
.Lines.Add('error!')
  
end;

  
output := utils.Base64Decode(sign);

  try
    
Memo1.Lines.Add('------------------');
    
Memo1.Lines.Add(output);
  
except
    Memo1
.Lines.Add('error');
  
end

Подписывает, но на входе должна быть не просто строка а двоичнаяСтрока (binaryString)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:11.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter