Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Криптографические цифровые подписи используют алгоритмы открытого ключа для обеспечения целостности данных. Когда вы подписываете данные с помощью цифровой подписи, кто-то другой может проверить подпись и может доказать, что данные, полученные от вас, и не были изменены после его подписания. Дополнительные сведения о цифровых подписях см. в разделе "Службы шифрования".
В этом разделе объясняется, как создавать и проверять цифровые подписи с помощью классов в 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
, если это не так.