암호화 디지털 서명은 공개 키 알고리즘을 사용하여 데이터 무결성을 제공합니다. 디지털 서명을 사용하여 데이터에 서명하는 경우 다른 사용자가 서명을 확인할 수 있으며, 사용자가 서명한 후 데이터가 사용자로부터 시작되었으며 변경되지 않았다는 것을 증명할 수 있습니다. 디지털 서명에 대한 자세한 내용은 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.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
"를 표시합니다.
참고하십시오
.NET