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