다음을 통해 공유


암호화 서명

암호화 디지털 서명은 공용 키 알고리즘을 사용하여 데이터 무결성을 제공합니다. 디지털 서명을 사용하여 데이터에 서명하면 다른 사용자가 데이터를 수신할 때 사용자의 서명을 확인하여 서명 후 테이터가 변경되지 않았음을 확인할 수 있습니다. 디지털 서명에 대한 자세한 내용은 암호화 서비스를 참조하십시오.

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

  • 서명 생성

  • 서명 확인

서명 생성

디지털 서명은 대개 보다 큰 데이터를 나타내는 해시 값에 적용됩니다. 다음 예제에서는 해시 값에 디지털 서명을 적용합니다. 먼저 RSACryptoServiceProvider 클래스의 새 인스턴스가 만들어져 공개/개인 키 쌍을 생성합니다. 그런 다음 RSAPKCS1SignatureFormatter 클래스의 새 인스턴스에 RSACryptoServiceProvider가 전달됩니다. 이 경우 실제로 디지털 서명을 수행하는 RSAPKCS1SignatureFormatter에 개인 키가 전송됩니다. 해시 코드에 서명하려면 먼저 사용할 해시 알고리즘을 지정해야 합니다. 이 예제에서는 SHA1 알고리즘을 사용합니다. 마지막으로, RSAPKCS1SignatureFormatter.CreateSignature 메서드가 호출되어 서명을 수행합니다.

Imports System
Imports System.Security.Cryptography

Module Module1
    Sub Main()
        'The hash value to sign.
        Dim HashValue As Byte() = {59, 4, 248, 102, 77, 97, 142, 201, 210, 12, 224, 93, 25, 41, 100, 197, 213, 134, 130, 135}

        'The value to hold the signed value.
        Dim SignedHashValue() As Byte

        'Generate a public/private key pair.
        Dim RSA As New RSACryptoServiceProvider()

        'Create an RSAPKCS1SignatureFormatter object and pass it 
        'the RSACryptoServiceProvider to transfer the private key.
        Dim RSAFormatter As New RSAPKCS1SignatureFormatter(RSA)

        'Set the hash algorithm to SHA1.
        RSAFormatter.SetHashAlgorithm("SHA1")

        'Create a signature for HashValue and assign it to 
        'SignedHashValue.
        SignedHashValue = RSAFormatter.CreateSignature(HashValue)
    End Sub
End Module

using System;
using System.Security.Cryptography;
class Class1
{
   static void Main()
   {
      //The hash value to sign.
      byte[] HashValue = {59,4,248,102,77,97,142,201,210,12,224,93,25,41,100,197,213,134,130,135};

      //The value to hold the signed value.
      byte[] SignedHashValue;

      //Generate a public/private key pair.
      RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();

      //Create an RSAPKCS1SignatureFormatter object and pass it the 
      //RSACryptoServiceProvider to transfer the private key.
      RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);

      //Set the hash algorithm to SHA1.
      RSAFormatter.SetHashAlgorithm("SHA1");

      //Create a signature for HashValue and assign it to 
      //SignedHashValue.
      SignedHashValue = RSAFormatter.CreateSignature(HashValue);
   }
}

XML 파일 서명

.NET Framework에서는 XML에 서명하는 데 사용할 수 있는 System.Security.Cryptography.XML 네임스페이스를 제공합니다. XML이 특정 소스에서 온 것임을 확인하려면 XML에 서명해야 합니다. 예를 들어, XML을 사용하는 주식 시세 서비스를 사용하는 경우 XML에 서명이 있으면 해당 XML의 소스를 확인할 수 있습니다.

이 네임스페이스의 클래스는 World Wide Web 컨소시엄의 XML-Signature Syntax and Processing 권장 사항을 따릅니다.

맨 위로 이동

서명 확인

특정인이 데이터에 서명했는지 확인하려면 다음 정보가 있어야 합니다.

  • 데이터에 서명한 사람의 공개 키

  • 디지털 서명

  • 서명된 데이터

  • 서명자가 사용한 해시 알고리즘

RSAPKCS1SignatureFormatter 클래스로 수행한 서명을 확인하려면 RSAPKCS1SignatureDeformatter 클래스를 사용합니다. RSAPKCS1SignatureDeformatter 클래스에는 서명자의 공개 키를 제공해야 합니다. 공개 키를 지정하려면 모듈러스 및 지수 값이 있어야 합니다. 이 값은 공개/개인 키 쌍을 생성한 사람이 제공해야 합니다. 먼저 RSACryptoServiceProvider 개체를 만들어 서명을 확인할 공개 키를 저장한 다음 해당 공개 키를 지정하는 모듈러스 및 지수 값으로 RSAParameters 구조체를 초기화합니다.

다음 코드에서는 RSAParameters 구조체를 만드는 방법을 보여 줍니다. Modulus 속성은 ModulusData라는 바이트 배열의 값으로 설정되고 Exponent 속성은 ExponentData라는 바이트 배열의 값으로 설정됩니다.

Dim RSAKeyInfo As RSAParameters
RSAKeyInfo.Modulus = ModulusData
RSAKeyInfo.Exponent = ExponentData
RSAParameters RSAKeyInfo;
RSAKeyInfo.Modulus = ModulusData;
RSAKeyInfo.Exponent = ExponentData;

RSAParameters 개체를 만든 후에는 RSACryptoServiceProvider 클래스의 새 인스턴스를 RSAParameters에 지정된 값으로 초기화할 수 있습니다. 키를 전송하기 위해 RSACryptoServiceProviderRSAPKCS1SignatureDeformatter의 생성자에 전달됩니다.

다음 예제에서는 이 프로세스를 보여 줍니다. 이 예제에서 HashValue와 SignedHashValue는 원격 사용자가 제공하는 바이트 배열입니다. 원격측에서 SHA1 알고리즘을 사용하여 HashValue에 서명하고 디지털 서명 SignedHashValue를 생성했습니다.

RSAPKCS1SignatureDeformatter.VerifySignature 메서드는 디지털 서명이 올바른지, 그리고 HashValue 서명에 사용되었는지 확인합니다.

Dim RSA As New RSACryptoServiceProvider()
RSA.ImportParameters(RSAKeyInfo)
Dim RSADeformatter As New RSAPKCS1SignatureDeformatter(RSA)
RSADeformatter.SetHashAlgorithm("SHA1")
If RSADeformatter.VerifySignature(HashValue, SignedHashValue) Then
   Console.WriteLine("The signature is valid.")
Else
   Console.WriteLine("The signture is not valid.")
End If
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.ImportParameters(RSAKeyInfo);
RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);
RSADeformatter.SetHashAlgorithm("SHA1");
if(RSADeformatter.VerifySignature(HashValue, SignedHashValue))
{
   Console.WriteLine("The signature is valid.");
}
else
{
   Console.WriteLine("The signature is not valid.");
}

이 코드에서는 서명이 유효하면 "The signature is valid"라는 메시지를 표시하고 그렇지 않으면 "The signature is not valid"라는 메시지를 표시합니다.

맨 위로 이동

참고 항목

개념

암호화 서비스

기타 리소스

암호화 작업