加密签名

加密数字签名使用公钥算法提供数据完整性。 如果使用数字签名对数据进行签名,则其他人可验证该签名,并且可证明这些数据确实是你发出的,并且在你签名之后未被更改。 有关数字签名的详细信息,请参阅 Cryptographic Services

本主题说明如何使用 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”。

另请参阅