密碼編譯簽章

密碼編譯數位簽章會使用公開金鑰演算法來提供資料完整性。 當您使用數位簽章簽署資料時,其他人可以確認簽章,並可以證明資料是來自您,而且在您簽署它之後沒有遭到竄改。 如需有關數位簽章的詳細資訊,請參閱 The signature is valid

本主題說明如何使用 System.Security.Cryptography 命名空間中的類別產生及驗證數位簽章。

產生簽章

數位簽章通常適用於代表較大資料的雜湊值。 下列範例會將數位簽章套用到雜湊值。 首先,會建立 RSA 類別的新執行個體,來產生公開/私密金鑰組。 接著, RSA 會傳遞至 RSAPKCS1SignatureFormatter 類別的新執行個體。 如此會將私密金鑰轉移給 RSAPKCS1SignatureFormatter,它會實際執行數位簽署。 在您可以簽署雜湊碼之前,必須先指定要使用的雜湊演算法。 此範例使用 SHA256 演算法。 最後,會呼叫 CreateSignature 方法來執行簽章。

Imports System.Security.Cryptography
Imports System.Text

Module Program
    Sub Main()

        Dim alg As SHA256 = SHA256.Create()

        Dim data As Byte() = Encoding.UTF8.GetBytes("Hello, from the .NET Docs!")
        Dim hash As Byte() = alg.ComputeHash(data)

        Dim sharedParameters As RSAParameters
        Dim signedHash As Byte()

        ' Generate signature
        Using rsa As RSA = RSA.Create()
            sharedParameters = rsa.ExportParameters(True)
            Dim rsaFormatter As New RSAPKCS1SignatureFormatter(rsa)
            rsaFormatter.SetHashAlgorithm(NameOf(SHA256))

            signedHash = rsaFormatter.CreateSignature(hash)
        End Using

        ' The sharedParameters, hash, and signedHash are used to later verify the signature.
    End Sub
End Module
using System.Security.Cryptography;
using System.Text;

using SHA256 alg = SHA256.Create();

byte[] data = Encoding.ASCII.GetBytes("Hello, from the .NET Docs!");
byte[] hash = alg.ComputeHash(data);

RSAParameters sharedParameters;
byte[] signedHash;

// Generate signature
using (RSA rsa = RSA.Create())
{
    sharedParameters = rsa.ExportParameters(false);

    RSAPKCS1SignatureFormatter rsaFormatter = new(rsa);
    rsaFormatter.SetHashAlgorithm(nameof(SHA256));

    signedHash = rsaFormatter.CreateSignature(hash);
}

// The sharedParameters, hash, and signedHash are used to later verify the signature.

驗證簽章

若要驗證資料是由特定合作對象簽署,您必須擁有下列資訊:

  • 簽章資料之合作對象的公開金鑰。
  • 數位簽章。
  • 已簽署的資料。
  • 簽署人使用的雜湊演算法。

若要驗證 RSAPKCS1SignatureFormatter 類別所簽署的簽章,請使用 RSAPKCS1SignatureDeformatter 類別。 必須提供 RSAPKCS1SignatureDeformatter 類別簽署者的公開金鑰。 針對 RSA,您至少需要 RSAParameters.ModulusRSAParameters.Exponent 的值才棱指定公開金鑰。 達成此目的的其中一個方法,是在簽章建立期間呼叫 RSA.ExportParameters,然後在驗證程序期間呼叫 RSA.ImportParameters。 產生公開/私密金鑰組的合作對象應該提供這些值。 先建立 RSA 物件來保存將會驗證簽章的公開金鑰,然後初始化 RSAParameters 結構,到指定公開金鑰的模數和指數值。

下列程式碼顯示如何共用 RSAParameters 結構。 RSA 負責建立簽章匯出其參數。 然後,參數會匯入負責驗證簽章的新 RSA 執行個體中。

RSA 執行個體會接著傳遞給 RSAPKCS1SignatureDeformatter 的建構函式以傳送金鑰。

下列範例將說明此程序。 在此範例中,假設 sharedParametershashsignedHash 是由遠端合作對象所提供。 遠端合作對象已使用 SHA256 演算法簽署 hash 來產生數位簽章 signedHashRSAPKCS1SignatureDeformatter.VerifySignature 方法會驗證數位簽章是否有效,且已用來簽署 hash

Imports System.Security.Cryptography
Imports System.Text

Module Program
    Sub Main()

        Dim alg As SHA256 = SHA256.Create()

        Dim data As Byte() = Encoding.UTF8.GetBytes("Hello, from the .NET Docs!")
        Dim hash As Byte() = alg.ComputeHash(data)

        Dim sharedParameters As RSAParameters
        Dim signedHash As Byte()

        ' Generate signature
        Using rsa As RSA = RSA.Create()
            sharedParameters = rsa.ExportParameters(True)
            Dim rsaFormatter As New RSAPKCS1SignatureFormatter(rsa)
            rsaFormatter.SetHashAlgorithm(NameOf(SHA256))

            signedHash = rsaFormatter.CreateSignature(hash)
        End Using

        ' Verify signature
        Using rsa As RSA = RSA.Create()
            rsa.ImportParameters(sharedParameters)

            Dim rsaDeformatter As New RSAPKCS1SignatureDeformatter(rsa)
            rsaDeformatter.SetHashAlgorithm(NameOf(SHA256))

            If rsaDeformatter.VerifySignature(hash, signedHash) Then
                Console.WriteLine("The signature is valid.")
            Else
                Console.WriteLine("The signature is not valid.")
            End If
        End Using
    End Sub
End Module
using System.Security.Cryptography;
using System.Text;

using SHA256 alg = SHA256.Create();

byte[] data = Encoding.ASCII.GetBytes("Hello, from the .NET Docs!");
byte[] hash = alg.ComputeHash(data);

RSAParameters sharedParameters;
byte[] signedHash;

// Generate signature
using (RSA rsa = RSA.Create())
{
    sharedParameters = rsa.ExportParameters(false);

    RSAPKCS1SignatureFormatter rsaFormatter = new(rsa);
    rsaFormatter.SetHashAlgorithm(nameof(SHA256));

    signedHash = rsaFormatter.CreateSignature(hash);
}

// Verify signature
using (RSA rsa = RSA.Create())
{
    rsa.ImportParameters(sharedParameters);

    RSAPKCS1SignatureDeformatter rsaDeformatter = new(rsa);
    rsaDeformatter.SetHashAlgorithm(nameof(SHA256));

    if (rsaDeformatter.VerifySignature(hash, signedHash))
    {
        Console.WriteLine("The signature is valid.");
    }
    else
    {
        Console.WriteLine("The signature is not valid.");
    }
}

如果簽章有效,此程式碼片段會顯示 "The signature is valid",否則會顯示 "The signature is not valid"。

另請參閱