Тема: CAPICOM + delphi
Показать сообщение отдельно
  #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)
Ответить с цитированием