Поделиться через


Криптографические подписи

Криптографические цифровые подписи используют алгоритмы открытого ключа для обеспечения целостности данных. Когда вы подписываете данные с помощью цифровой подписи, кто-то другой может проверить подпись и может доказать, что данные, полученные от вас, и не были изменены после его подписания. Дополнительные сведения о цифровых подписях см. в разделе "Службы шифрования".

В этом разделе объясняется, как создавать и проверять цифровые подписи с помощью классов в 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 предоставляется удаленной стороной. Удаленная сторона подписала hash с помощью алгоритма SHA256 для создания цифровой подписи 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, если это не так.

См. также