
20.10.2011, 11:57
|
Прохожий
|
|
Регистрация: 06.05.2009
Сообщения: 16
Репутация: 10
|
|
Подробнее
Есть такой код:
PHP код:
Private Sub sign(ByVal SrcFile As String, ByVal 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(Sender: TObject);
var Store: Olevariant; //хранилище
Signer: OleVariant; //дата для подписи
SignedData: OleVariant; //подписыватель
Utils:OleVariant; //утилиты для подписи
fso: OleVariant; //файлы
Crt : Olevariant; //сертификат
Crts: Olevariant; //все сертификаты хранилища
count: longint; //кол-во сертификатов
sign: OleVariant; //подписанный файл
output: OleVariant; //Выходные данные
input: string; //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(Signer, false,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)
|