Криптографические подписи
Криптографические цифровые подписи используют алгоритмы открытого ключа для обеспечения целостности данных. Если вы подписываете данные с помощью цифровой подписи, другая сторона может проверить подпись и убедиться в том, что данные поступили от вас и не были изменены после подписывания. Подробнее о цифровых подписях см. в разделе 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.Exponent указание открытого RSAParameters.Modulus ключа. Одним из способов этого является вызов 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
, если это не так.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:Отправить и просмотреть отзыв по