Udostępnij za pośrednictwem


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 sharedParameterselement , hashi signedHash są udostępniane przez zdalną stronę. Strona zdalna podpisała przy hash użyciu algorytmu SHA256 w celu utworzenia podpisu signedHashcyfrowego . 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ż