C#でPDF電子署名の有効性を検証する

PDF文書の重要なセキュリティメカニズムとして、電子署名は文書のソースを検証するだけでなく、送信中に文書の内容が改ざんされていないことも保証します。したがって、PDFファイルの電子署名を適切に検証する方法を知ることは、文書の完全性と信頼性を保証する鍵となります。

この記事では、**PDF署名の有効性を検証し、PDF文書が変更されているかどうかを検証するために**、無料のNETライブラリを使用する方法に焦点を当てます。
* [C#でPDFのデジタル署名を検証する](#cでpdfのデジタル署名を検証する)
* [C#で署名付きPDFが変更されたかどうかを検出する](#cで署名付きpdfが変更されたかどうかを検出する)

## 無料の.NET PDFライブラリをインストールします
タスクを達成するために、無料のライブラリ[**Free Spire.PDF for .NET**](https://www.e-iceblue.com/Introduce/free-pdf-component.html)を使用する必要があります。[NuGet](http://www.nuget.org/packages/FreeSpire.PDF/)経由で直接インストールすることもできますし、以下のリンクから製品パッケージをダウンロードし、手動でdllをリファレンスとして追加することもできます。

https://www.e-iceblue.com/Download/download-pdf-for-net-free.html


## C#でPDFのデジタル署名を検証する
Free Spire.PDF は PDF ドキュメント内のデジタル署名を表現するために **`PdfSignature`** クラスを提供します。署名の有効性を検証するには、**`VerifySignature()`** メソッドを使用します。

**主なステップ:**
1\.	**`PdfDocument`** オブジェクトを作成し、**`LoadFromFile()`** メソッドを使用してPDFファイルを読み込みます。
2\. PDFファイル内のフォームを取得し、フォームフィールドのコレクションを取得します。
3.	すべてのフィールドを繰り返し処理し、現在のフィールドが署名フィールド（**`PdfSignatureFieldWidget`** クラス）であるかどうかを判断します。
4.	署名フィールドであれば、**`PdfSignatureFieldWidget.Signature`** プロパティを通してPDF署名を取得します。
5.	PDF署名の有効性をチェックするために **`PdfSignature.VerifySignature()`** メソッドを呼び出します。
6.	結果を出力します。

**サンプルC#コード:**
```c#
using Spire.Pdf;
using Spire.Pdf.Security;
using Spire.Pdf.Widget;

namespace VerifySignature
{
    class Program
    {
        static void Main(string[] args)
        {

            // PDFファイルを読み込む
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("PDFSignature.pdf");

            // PDFファイル内のフォームフィールドの集合を取得する
            PdfFormWidget pdfFormWidget = (PdfFormWidget)pdf.Form;
            PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.FieldsWidget;

            //すべてのフィールドを反復処理する
            for (int i = 0; i < pdfFormFieldWidgetCollection.Count; i++)
            {
                //署名フィールドの取得
                if (pdfFormFieldWidgetCollection[i] is PdfSignatureFieldWidget)
                {
                    PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget)pdfFormFieldWidgetCollection[i];

                    // PDF署名を取得する
                    PdfSignature signature = signatureFieldWidget.Signature;

                    //署名の有効性を検証する
                    bool valid = signature.VerifySignature();
                    if (valid)
                    {
                        Console.WriteLine("有効な署名");
                    }
                    else
                    {
                        Console.WriteLine("無効な署名");
                    }
                }
            }
        }
    }
}
```
**結果:**
![VerifyPDFSignature.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/4db26f27-71ef-ee12-cecd-198d59607736.png)



## C#で署名付きPDFが変更されたかどうかを検出する
PDF文書が変更されているかどうかを検証することは、間接的に電子署名の有効性を検証することにもなります。署名後に文書の内容が変更された場合、PDF署名は無効になります。**`PdfSignature`** クラスの **`VerifyDocModified()`** メソッドを使用することで、PDF文書の完全性を素早く検証することができます。

**主なステップ:**
1.	**`PdfDocument`** オブジェクトを作成し、**`LoadFromFile()`** メソッドを使用してPDFファイルを読み込みます。
2.	PDFファイル内のフォームを取得し、フォームフィールドのコレクションを取得します。
3.	すべてのフィールドを繰り返し処理し、現在のフィールドが署名フィールド（**`PdfSignatureFieldWidget`**クラス）であるかどうかを判断します。
4.	署名フィールドであれば、**`PdfSignatureField.WidgetSignature`** プロパティを通してPDF署名を取得します。
5.	**`PdfSignature.VerifyDocModified()`** メソッドを呼び出して、署名後にドキュメントが変更されたかどうかを検証します。
6.	結果を出力します。

**サンプルC#コード:**
```c#
using Spire.Pdf;
using Spire.Pdf.Security;
using Spire.Pdf.Widget;

namespace CheckSignature
{
    class Program
    {
        static void Main(string[] args)
        {

            // PDFファイルを読み込む
            PdfDocument pdf = new PdfDocument();
            pdf.LoadFromFile("PDFSignature.pdf");

            // PDFファイル内のフォームフィールドの集合を取得する
            PdfFormWidget pdfFormWidget = (PdfFormWidget)pdf.Form;
            PdfFormFieldWidgetCollection pdfFormFieldWidgetCollection = pdfFormWidget.FieldsWidget;

            //すべてのフィールドを反復処理する
            for (int i = 0; i < pdfFormFieldWidgetCollection.Count; i++)
            {
                //署名フィールドの取得
                if (pdfFormFieldWidgetCollection[i] is PdfSignatureFieldWidget)
                {
                    PdfSignatureFieldWidget signatureFieldWidget = (PdfSignatureFieldWidget)pdfFormFieldWidgetCollection[i];

                    // PDF署名を取得する
                    PdfSignature signature = signatureFieldWidget.Signature;

                    //署名後に文書が変更されたかどうかを検出する
                    bool modified = signature.VerifyDocModified();
                    if (modified)
                    {
                        Console.WriteLine("文書が変更された。");
                    }
                    else
                    {
                        Console.WriteLine("文書は変更されていない。");
                    }
                }
            }
        }
    }
}
```

**結果:**
![VeryDocModified.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2811193/542cac42-9e38-1357-21b3-9e45d36702eb.png)



これらの手順とサンプルコードにより、PDF文書の完全性と電子署名の有効性を保証することができます、 これにより、重要な文書を扱う際にさらなるセキュリティを提供することができます。

### こちらも参照：
*[C#でPDFに電子署名を追加する](https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/PDF-Protection-Create-Digital-Signature-in-PDF-with-C-VB.NET.html) 
[C#でPDFの電子署名の証明書を取得する](https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/Get-and-Verify-Digital-Signature-in-PDF-with-C-Code.html#3)
[C# で PDF 文書を暗号化 ・ 復号化](https://www.e-iceblue.com/Tutorials/Spire.PDF/Spire.PDF-Program-Guide/Security/C-Encrypt-and-Decrypt-PDF-file.html)*