次の方法で共有


暗号署名

暗号デジタル署名は、パブリック キー アルゴリズムを使用してデータの整合性を提供します。 デジタル署名を使用してデータに署名すると、第三者が署名を検証し、データが署名者から発信され、署名後に変更されていないことを立証できます。 デジタル署名の詳細については、「暗号サービス」を参照してください。

このトピックでは、System.Security.Cryptography 名前空間のクラスを使用してデジタル署名を生成して検証する方法について説明します。

  • 署名の生成

  • 署名の検査

署名の生成

通常、デジタル署名は大きなデータを表現するハッシュ値に適用されます。 ハッシュ値にデジタル署名を適用する例を次に示します。 まず、公開キーと秘密キーのペアを生成するために RSACryptoServiceProvider クラスの新しいインスタンスを作成します。 次に、RSACryptoServiceProviderRSAPKCS1SignatureFormatter クラスの新しいインスタンスに渡します。 これにより、実際にデジタル署名を実行する RSAPKCS1SignatureFormatter に秘密キーが渡されます。 ハッシュ コードに署名するためには、使用するハッシュ アルゴリズムを指定する必要があります。 この例では SHA1 アルゴリズムを使用します。 最後に、RSAPKCS1SignatureFormatter.CreateSignature メソッドを呼び出して署名を実行します。

Imports System
Imports System.Security.Cryptography

Module Module1
    Sub Main()
        'The hash value to sign.
        Dim HashValue As Byte() = {59, 4, 248, 102, 77, 97, 142, 201, 210, 12, 224, 93, 25, 41, 100, 197, 213, 134, 130, 135}

        'The value to hold the signed value.
        Dim SignedHashValue() As Byte

        'Generate a public/private key pair.
        Dim RSA As New RSACryptoServiceProvider()

        'Create an RSAPKCS1SignatureFormatter object and pass it 
        'the RSACryptoServiceProvider to transfer the private key.
        Dim RSAFormatter As New RSAPKCS1SignatureFormatter(RSA)

        'Set the hash algorithm to SHA1.
        RSAFormatter.SetHashAlgorithm("SHA1")

        'Create a signature for HashValue and assign it to 
        'SignedHashValue.
        SignedHashValue = RSAFormatter.CreateSignature(HashValue)
    End Sub
End Module

using System;
using System.Security.Cryptography;
class Class1
{
   static void Main()
   {
      //The hash value to sign.
      byte[] HashValue = {59,4,248,102,77,97,142,201,210,12,224,93,25,41,100,197,213,134,130,135};

      //The value to hold the signed value.
      byte[] SignedHashValue;

      //Generate a public/private key pair.
      RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

      //Create an RSAPKCS1SignatureFormatter object and pass it the 
      //RSACryptoServiceProvider to transfer the private key.
      RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);

      //Set the hash algorithm to SHA1.
      RSAFormatter.SetHashAlgorithm("SHA1");

      //Create a signature for HashValue and assign it to 
      //SignedHashValue.
      SignedHashValue = RSAFormatter.CreateSignature(HashValue);
   }
}

XML ファイルへの署名

.NET Framework に用意されている System.Security.Cryptography.XML 名前空間を使用すると、XML に署名できます。 XML が特定のソースから送信されたことを検査する必要があるときは、XML に署名を付けることが重要です。 たとえば、XML を使用した株価サービスを利用している場合、その XML に署名が付いていれば、XML のソースを検査できます。

この名前空間に含まれるクラスは、World Wide Web Consortium による勧告『XML Signature Syntax and Processing』に準拠しています。

ページのトップへ

署名の検査

データが特定の人によって署名されたことを検査するには、次の情報が必要です。

  • データに署名した人の公開キー

  • デジタル署名

  • 署名されたデータ

  • 署名者が使用したハッシュ アルゴリズム

RSAPKCS1SignatureFormatter クラスによって作成された署名を検査するには、RSAPKCS1SignatureDeformatter クラスを使用します。 RSAPKCS1SignatureDeformatter クラスには、署名者の公開キーを与える必要があります。 公開キーを指定するには、剰余値と指数部の値が必要になります (これらの値は、公開キーと秘密キーのペアを作成した人が提供する必要があります)。 まず、署名を検査する公開キーを保持するための RSACryptoServiceProvider オブジェクトを作成します。次に、RSAParameters 構造体を初期化して、公開キーを指定する剰余値と指数部の値を設定します。

RSAParameters 構造体の作成を次のコード例に示します。 Modulus プロパティには ModulusData というバイト配列の値が設定され、Exponent プロパティには ExponentData というバイト配列の値が設定されます。

Dim RSAKeyInfo As RSAParameters
RSAKeyInfo.Modulus = ModulusData
RSAKeyInfo.Exponent = ExponentData
RSAParameters RSAKeyInfo;
RSAKeyInfo.Modulus = ModulusData;
RSAKeyInfo.Exponent = ExponentData;

RSAParameters オブジェクトを作成したら、RSACryptoServiceProvider クラスの新しいインスタンスを初期化して、RSAParameters に指定された値を設定できます。 次に、RSAPKCS1SignatureDeformatter のコンストラクターに RSACryptoServiceProvider を渡してキーを転送します。

このプロセスを説明する例を次に示します。 この例では、HashValue と SignedHashValue は離れた場所にいる人から与えられたバイト配列です。 離れた場所にいる人は SHA1 アルゴリズムを使用して HashValue に署名し、デジタル署名 SignedHashValue を生成します。

RSAPKCS1SignatureDeformatter.VerifySignature メソッドは、デジタル署名が有効であること、およびそのデジタル署名を使用して HashValue が署名されたことを検査します。

Dim RSA As New RSACryptoServiceProvider()
RSA.ImportParameters(RSAKeyInfo)
Dim RSADeformatter As New RSAPKCS1SignatureDeformatter(RSA)
RSADeformatter.SetHashAlgorithm("SHA1")
If RSADeformatter.VerifySignature(HashValue, SignedHashValue) Then
   Console.WriteLine("The signature is valid.")
Else
   Console.WriteLine("The signture is not valid.")
End If
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.ImportParameters(RSAKeyInfo);
RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);
RSADeformatter.SetHashAlgorithm("SHA1");
if(RSADeformatter.VerifySignature(HashValue, SignedHashValue))
{
   Console.WriteLine("The signature is valid.");
}
else
{
   Console.WriteLine("The signature is not valid.");
}

上記のコード片は、署名が有効な場合は、"The signature is valid"、署名が無効な場合は、"The signature is not valid" と表示します。

ページのトップへ

参照

概念

暗号サービス

その他の技術情報

暗号タスク