다음을 통해 공유


암호화 서명

암호화 디지털 서명은 공개 키 알고리즘을 사용하여 데이터 무결성을 제공합니다. 디지털 서명을 사용하여 데이터에 서명하는 경우 다른 사용자가 서명을 확인할 수 있으며, 사용자가 서명한 후 데이터가 사용자로부터 시작되었으며 변경되지 않았다는 것을 증명할 수 있습니다. 디지털 서명에 대한 자세한 내용은 Cryptographic Services를 참조하세요.

이 항목에서는 네임스페이스의 클래스를 사용하여 디지털 서명을 생성하고 확인하는 방법을 설명합니다 System.Security.Cryptography .

서명 생성

디지털 서명은 일반적으로 더 큰 데이터를 나타내는 해시 값에 적용됩니다. 다음 예제에서는 해시 값에 디지털 서명을 적용합니다. 먼저 공개/프라이빗 키 쌍을 RSA 생성하기 위해 클래스의 새 인스턴스가 만들어집니다. 다음으로 RSARSAPKCS1SignatureFormatter 클래스의 새로운 인스턴스로 전달됩니다. 그러면 프라이빗 키가 실제로 디지털 서명을 수행하는 프라이빗 키 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.ModulusRSAParameters.Exponent 값이 필요합니다. 이 작업을 수행하는 한 가지 방법은 서명을 만드는 동안 호출 RSA.ExportParameters 한 다음 확인 프로세스 중에 호출 RSA.ImportParameters 하는 것입니다. 공개/프라이빗 키 쌍을 생성한 당사자는 이러한 값을 제공해야 합니다. 먼저 서명을 확인할 공개 키를 보유하는 개체를 만든 RSA 다음, 공개 키를 지정하는 모듈러스 및 지수 값으로 구조를 초기화 RSAParameters 합니다.

다음 코드는 구조체의 공유를 보여 주는 코드입니다 RSAParameters . 서명을 생성하는 책임이 있는 RSA가 해당 매개 변수를 내보냅니다. 그런 다음, 서명을 확인하는 역할을 하는 새 RSA 인스턴스로 매개 변수를 가져옵니다.

인스턴스는 키를 전송하기 위해 RSA의 생성자에 RSAPKCS1SignatureDeformatter로 전달됩니다.

다음 예제에서는 이 프로세스를 보여 줍니다. 이 예제에서는 원격 당사자가 제공하는 것을 sharedParametershashsignedHash 상상해 보십시오. 원격 당사자가 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"를 표시합니다.

참고하십시오