Согласно Ваш комментарий Ваш текущий подход заключается в следующем:
В основном я извлечь хэш файла в формате PDF, как это.
private string FileHash(byte[] vGblFilePDF)
{
using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
vGblHash = Convert.ToBase64String(sha1.ComputeHash(vGblFilePDF));
}
return vGblHash;
}
тогда я отправить его на поставщика trought WS, добавив только идентификационный номер, то провайдер отправить меня обратно (после идентификации) подписанный хэш, которым я должен вставить в PDF.
Этот подход в корне неверен, вы уже начинаете с вычисления неправильного хэша!
Прежде всего, вы должны: подготовить свой PDF; во время этого этапа подготовки вы добавляете определенные структуры в PDF, которые помещают PDF как содержащий подпись и резервируют раздел для последующей вставки контейнера подписи; все за исключением того зарезервированной секции затем должны быть хэшированными:
![Basic structure of a signed PDF](https://i.stack.imgur.com/DkekJ.png)
(Для некоторых слоев и указателей на дополнительные литературе см. this answer)
После этого полномасштабной PKCS # 7/CMS с подписями для этого хеша документа должен быть создан и вставлен в этот зарезервированный раздел.
Это то, что большая часть кода подписи IText (здесь, в Java) делает для вас:
PdfReader reader = new PdfReader(src);
FileOutputStream os = new FileOutputStream(dest);
PdfStamper stamper = PdfStamper.createSignature(reader, os, '\0');
// Creating the appearance
PdfSignatureAppearance appearance = stamper.getSignatureAppearance();
appearance.setReason(reason);
appearance.setLocation(location);
appearance.setVisibleSignature(new Rectangle(36, 748, 144, 780), 1, "sig");
// Creating the signature
ExternalDigest digest = new BouncyCastleDigest();
ExternalSignature signature = ...;
MakeSignature.signDetached(appearance, digest, signature, chain, null, null, null, 0, subfilter);
(взято из C2_01_SignHelloWorld.java эквивалентно C2_01_SignHelloWorld.cs)
Вы просто должны предоставить ExternalSignature
/IExternalSignature
реализация связи с вашим провайдером:
public interface IExternalSignature {
/**
* Returns the hash algorithm.
* @return the hash algorithm (e.g. "SHA-1", "SHA-256,...")
*/
String GetHashAlgorithm();
/**
* Returns the encryption algorithm used for signing.
* @return the encryption algorithm ("RSA" or "DSA")
*/
String GetEncryptionAlgorithm();
/**
* Signs it using the encryption algorithm in combination with
* the digest algorithm.
* @param message the message you want to be hashed and signed
* @return a signed message digest
* @throws GeneralSecurityException
*/
byte[] Sign(byte[] message);
}
Вы сохранили оригинальные 'PdfStamper' и' SignatureAppearanc é'? Без, по крайней мере, ключевых частей вашего кода, вам сложно помочь. – mkl
Это то, что провайдер запрашивает только хэш. Нет подписи Внешний вид, ничего. В основном я извлекаю хэш файла PDF так. [КОД] частная строка FileHash (байт [] vGblFilePDF) { \t использованием (SHA1CryptoServiceProvider SHA1 = новый SHA1CryptoServiceProvider()) { \t \t \t vGblHash = Convert.ToBase64String (sha1.ComputeHash (vGblFilePDF)); \t} \t return vGblHash; } [/ CODE] Затем я отправляю его провайдеру, получив WS, добавив только идентификационный номер, затем поставщик отправит мне обратно (после идентификации) подписанный хеш, который мне нужно вставить в pdf. Я знаю, что чего-то не хватает. С уважением. – Gabriel