加密签名
加密数字签名使用公钥算法提供数据完整性。 如果使用数字签名对数据进行签名,则其他人可验证该签名,并且可证明这些数据确实是你发出的,并且在你签名之后未被更改。 有关数字签名的详细信息,请参阅 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.Modulus 和 RSAParameters.Exponent 的值来指定公钥。 实现此目的的一种方法是在签名创建期间调用 RSA.ExportParameters,然后在验证过程中调用 RSA.ImportParameters。 生成公钥/私钥对的一方应提供这些值。 首先创建 RSA 对象以保存将验证签名的公钥,然后将 RSAParameters 结构初始化为指定该公钥的模数值和指数值。
下面的代码显示 RSAParameters 结构的共享。 负责创建签名的 RSA
将导出其参数。 然后,这些参数将导入到负责验证签名的新 RSA
实例中。
然后将 RSA 实例传递到 RSAPKCS1SignatureDeformatter 的构造函数以传输密钥。
下面的示例阐释此过程。 在本示例中,假设 sharedParameters
、hash
和 signedHash
是由远程方提供的。 远程方已使用 SHA256
算法对 hash
进行签名,从而生成数字签名 signedHash
。 RSAPKCS1SignatureDeformatter.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
”。