Podpisy kryptograficzne
Kryptograficzne podpisy cyfrowe używają algorytmów kluczy publicznych w celu zapewnienia integralności danych. Gdy podpisujesz dane przy użyciu podpisu cyfrowego, ktoś inny może zweryfikować podpis i udowodnić, że dane pochodzą od Ciebie i nie zostały zmienione po jego podpisaniu. Aby uzyskać więcej informacji na temat podpisów cyfrowych, zobacz Usługi kryptograficzne.
W tym temacie opisano sposób generowania i weryfikowania podpisów cyfrowych przy użyciu klas w System.Security.Cryptography przestrzeni nazw.
Generowanie podpisu
Podpisy cyfrowe są zwykle stosowane do wartości skrótów reprezentujących większe dane. Poniższy przykład stosuje podpis cyfrowy do wartości skrótu. Najpierw jest tworzone nowe wystąpienie RSA klasy w celu wygenerowania pary kluczy publicznych/prywatnych. Następnie element RSA jest przekazywany do nowego wystąpienia RSAPKCS1SignatureFormatter klasy. Spowoduje to przeniesienie klucza prywatnego do RSAPKCS1SignatureFormatterelementu , który faktycznie wykonuje podpisywanie cyfrowe. Aby można było podpisać kod skrótu, należy określić algorytm skrótu do użycia. W tym przykładzie użyto algorytmu SHA256
. Na koniec metoda jest wywoływana CreateSignature w celu przeprowadzenia podpisywania.
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.
Weryfikowanie podpisu
Aby sprawdzić, czy dane zostały podpisane przez określoną firmę, musisz mieć następujące informacje:
- Klucz publiczny strony, która podpisała dane.
- Podpis cyfrowy.
- Dane, które zostały podpisane.
- Algorytm skrótu używany przez sygnatariusza.
Aby zweryfikować podpis podpisany przez klasę RSAPKCS1SignatureFormatter , użyj RSAPKCS1SignatureDeformatter klasy . Klasa RSAPKCS1SignatureDeformatter musi być podana jako klucz publiczny obiektu podpisjącego. W przypadku rsA należy określić klucz publiczny przy minimalnym wartościach RSAParameters.Modulus i RSAParameters.Exponent . Jednym ze sposobów osiągnięcia tego celu jest wywołanie RSA.ExportParameters podczas tworzenia podpisu, a następnie wywołanie RSA.ImportParameters podczas procesu weryfikacji. Strona, która wygenerowała parę kluczy publicznych/prywatnych, powinna podać te wartości. Najpierw utwórz RSA obiekt do przechowywania klucza publicznego, który zweryfikuje podpis, a następnie zainicjuj RSAParameters strukturę modulu i wartości wykładnicze, które określają klucz publiczny.
Poniższy kod przedstawia udostępnianie RSAParameters struktury. Odpowiedzialny RSA
za utworzenie podpisu eksportuje jego parametry. Parametry są następnie importowane do nowego RSA
wystąpienia, które jest odpowiedzialne za weryfikowanie podpisu.
Wystąpienie RSA jest z kolei przekazywane do konstruktora obiektu RSAPKCS1SignatureDeformatter w celu przeniesienia klucza.
Poniższy przykład ilustruje ten proces. W tym przykładzie załóżmy, że sharedParameters
element , hash
i signedHash
są udostępniane przez zdalną stronę. Strona zdalna podpisała przy hash
użyciu algorytmu SHA256
w celu utworzenia podpisu signedHash
cyfrowego . Metoda RSAPKCS1SignatureDeformatter.VerifySignature sprawdza, czy podpis cyfrowy jest prawidłowy i został użyty do podpisania 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.");
}
}
Ten fragment kodu wyświetla wartość "The signature is valid
", jeśli podpis jest prawidłowy i "The signature is not valid
", jeśli tak nie jest.
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla