암호화 서비스Cryptographic Services

인터넷과 같은 공용 네트워크에서는 엔터티 간의 보안 통신 수단을 제공하지 않습니다.Public networks such as the Internet do not provide a means of secure communication between entities. 이러한 네트워크를 통한 통신은 권한이 없는 제3자가 읽거나 심지어는 수정하기도 쉽습니다.Communication over such networks is susceptible to being read or even modified by unauthorized third parties. 암호화는 데이터를 볼 수 없도록 보호하며 데이터가 수정되었는지 감지하는 방법을 제공하며 기타 보안상 위험한 채널을 통한 안전한 통신 수단 제공을 지원합니다.Cryptography helps protect data from being viewed, provides ways to detect whether data has been modified, and helps provide a secure means of communication over otherwise nonsecure channels. 예를 들어 데이터를 암호화된 상태로 전송하고 나중에 의도된 당사자가 해독하는 암호화 알고리즘을 사용하여 데이터를 암호화할 수 있습니다.For example, data can be encrypted by using a cryptographic algorithm, transmitted in an encrypted state, and later decrypted by the intended party. 제3자가 암호화된 데이터를 가로채는 경우 해독하기 어렵습니다.If a third party intercepts the encrypted data, it will be difficult to decipher.

.NET Framework에서 System.Security.Cryptography 네임스페이스의 클래스는 고유한 여러 암호화 세부 정보를 관리합니다.In the .NET Framework, the classes in the System.Security.Cryptography namespace manage many details of cryptography for you. 이러한 클래스 중 일부는 관리되지 않는 Microsoft CryptoAPI(암호화 API)에 대한 래퍼이지만, 나머지는 완전하게 관리되는 구현 클래스입니다.Some are wrappers for the unmanaged Microsoft Cryptography API (CryptoAPI), while others are purely managed implementations. 이러한 클래스를 사용하기 위해 암호화 전문가가 될 필요는 없습니다.You do not need to be an expert in cryptography to use these classes. 암호화 알고리즘 클래스 중 하나의 새 인스턴스를 만들 경우 키가 사용 편의를 위해 자동으로 생성되며, 기본 속성은 가능한 한 안전합니다.When you create a new instance of one of the encryption algorithm classes, keys are autogenerated for ease of use, and default properties are as safe and secure as possible.

이 개요에는 암호화 메서드 및 ClickOnce 매니페스트, Suite B 및.NET Framework 3.5에 도입 된 CNG Cryptography Next Generation () 지원을 포함 하 여.NET Framework에서 지 원하는 사례 개요를 제공 합니다.This overview provides a synopsis of the encryption methods and practices supported by the .NET Framework, including the ClickOnce manifests, Suite B, and Cryptography Next Generation (CNG) support introduced in the .NET Framework 3.5.

이 개요는 다음과 같은 단원으로 구성됩니다.This overview contains the following sections:

Microsoft 서비스, 구성 요소 및 애플리케이션에 암호화 보안을 추가할 수 있도록 하는 도구 및 암호화에 대한 자세한 내용은 이 설명서의 Win32 및 COM 개발, 보안 섹션을 참조하세요.For additional information about cryptography and about Microsoft services, components, and tools that enable you to add cryptographic security to your applications, see the Win32 and COM Development, Security section of this documentation.

암호화 기본Cryptographic Primitives

암호화가 사용되는 일반적인 상황에서 두 당사자(Alice와 Bob)는 보안상 위험한 채널을 통해 통신하고 있습니다.In a typical situation where cryptography is used, two parties (Alice and Bob) communicate over a nonsecure channel. Alice와 Bob은 통신을 수신할 수도 있는 다른 사용자가 계속해서 둘 간의 통신을 이해할 수 없도록 하려고 합니다.Alice and Bob want to ensure that their communication remains incomprehensible by anyone who might be listening. 게다가 Alice와 Bob은 원격 위치에 있으므로 Alice는 Bob으로부터 받은 정보가 전송 중 다른 사용자에 의해 수정되지 않았는지 확인해야 합니다.Furthermore, because Alice and Bob are in remote locations, Alice must make sure that the information she receives from Bob has not been modified by anyone during transmission. 또한 그녀는 정보가 Bob을 가장하는 사람이 아니라 실제로 Bob에서 온 것임을 확인해야 합니다.In addition, she must make sure that the information really does originate from Bob and not from someone who is impersonating Bob.

암호화는 다음과 같은 목표를 달성하기 위해 사용됩니다.Cryptography is used to achieve the following goals:

  • 기밀성: 사용자의 id 또는 데이터를 읽지 못하게 보호할 수 있습니다.Confidentiality: To help protect a user's identity or data from being read.

  • 데이터 무결성: 데이터를에서 보호 하기 위해 다음을 변경 합니다.Data integrity: To help protect data from being changed.

  • 인증: 데이터가 특정 당사자 로부터 온 것임을 확인 합니다.Authentication: To ensure that data originates from a particular party.

  • 부인 방지: 특정 파티를 메시지 보낸 사실을 부인 하지 못하도록 합니다.Non-repudiation: To prevent a particular party from denying that they sent a message.

이러한 목표를 달성하기 위해 암호화 기본이라고 알려진 알고리즘과 방법을 결합하여 암호화 체계를 만들 수 있습니다.To achieve these goals, you can use a combination of algorithms and practices known as cryptographic primitives to create a cryptographic scheme. 다음 표는 암호화 기본 및 해당 기능 목록을 보여 줍니다.The following table lists the cryptographic primitives and their uses.

암호화 기본Cryptographic primitive 사용Use
비밀 키 암호화(대칭 암호화)Secret-key encryption (symmetric cryptography) 데이터에서 변환을 수행하여 제3자가 읽지 못하게 합니다.Performs a transformation on data to keep it from being read by third parties. 이 유형의 암호화는 공유된 하나의 비밀 키를 사용하여 데이터를 암호화하고 해독합니다.This type of encryption uses a single shared, secret key to encrypt and decrypt data.
공개 키 암호화(비대칭 암호화)Public-key encryption (asymmetric cryptography) 데이터에서 변환을 수행하여 제3자가 읽지 못하게 합니다.Performs a transformation on data to keep it from being read by third parties. 이 유형의 암호화는 퍼블릭/프라이빗 키 쌍을 사용하여 데이터를 암호화하고 해독합니다.This type of encryption uses a public/private key pair to encrypt and decrypt data.
암호화 서명Cryptographic signing 특정 당사자에 고유한 디지털 서명을 만들어 데이터가 해당 당사자로부터 온 것임을 확인할 수 있도록 지원합니다.Helps verify that data originates from a specific party by creating a digital signature that is unique to that party. 또한 이 프로세스는 해시 함수도 사용합니다.This process also uses hash functions.
암호화 해시Cryptographic hashes 데이터를 임의 길이에서 고정 길이의 바이트 시퀀스로 매핑합니다.Maps data from any length to a fixed-length byte sequence. 해시는 통계적으로 고유합니다. 서로 다른 2바이트 시퀀스는 같은 값으로 해시하지 않습니다.Hashes are statistically unique; a different two-byte sequence will not hash to the same value.

맨 위로 이동Back to top

비밀 키 암호화Secret-Key Encryption

비밀 키 암호화 알고리즘은 하나의 비밀 키를 사용하여 데이터를 암호화하고 해독합니다.Secret-key encryption algorithms use a single secret key to encrypt and decrypt data. 키를 가진 사람은 누구나 키를 사용하여 데이터를 해독하거나 자신의 데이터를 암호화한 다음 출처를 가장할 수 있으므로 권한이 없는 다른 사용자가 키에 액세스할 수 없도록 보호해야 합니다.You must secure the key from access by unauthorized agents, because any party that has the key can use it to decrypt your data or encrypt their own data, claiming it originated from you.

또한 비밀 키 암호화는 동일한 키가 암호화 및 해독에 사용되므로 대칭 암호화라고도 합니다.Secret-key encryption is also referred to as symmetric encryption because the same key is used for encryption and decryption. 비밀 키 암호화 알고리즘은 공개 키 알고리즘과 비교하여 매우 빠르며, 대규모 데이터 스트림에 대해 암호화 변환을 수행하는 데 매우 적합합니다.Secret-key encryption algorithms are very fast (compared with public-key algorithms) and are well suited for performing cryptographic transformations on large streams of data. RSA와 같은 비대칭 암호화 알고리즘은 암호화할 수 있는 데이터 양에 있어 수학적으로 제한됩니다.Asymmetric encryption algorithms such as RSA are limited mathematically in how much data they can encrypt. 일반적으로 대칭 암호화 알고리즘에는 이러한 문제가 없습니다.Symmetric encryption algorithms do not generally have those problems.

블록 암호라고 하는 비밀 키 알고리즘의 유형은 한 번에 한 데이터 블록을 암호화하는 데 사용합니다.A type of secret-key algorithm called a block cipher is used to encrypt one block of data at a time. DES(데이터 암호화 표준), TripleDES 및 AES(Advanced Encryption Standard)와 같은 블록 암호는 n 바이트의 입력 블록을 암호화된 바이트의 출력 블록으로 암호화하여 변환합니다.Block ciphers such as Data Encryption Standard (DES), TripleDES, and Advanced Encryption Standard (AES) cryptographically transform an input block of n bytes into an output block of encrypted bytes. 바이트 시퀀스를 암호화하거나 해독하려는 경우 작업을 블록 단위로 수행해야 합니다.If you want to encrypt or decrypt a sequence of bytes, you have to do it block by block. n 이 작기(DES 및 TripleDES의 경우 8바이트, AES의 경우 16바이트[기본값], 24바이트 또는 32바이트) 때문에 n 보다 큰 데이터 값은 한 번에 한 블록씩 암호화되어야 합니다.Because n is small (8 bytes for DES and TripleDES; 16 bytes [the default], 24 bytes, or 32 bytes for AES), data values that are larger than n have to be encrypted one block at a time. n 보다 작은 데이터 값은 처리하려면 n 으로 확장해야 합니다.Data values that are smaller than n have to be expanded to n in order to be processed.

블록 암호의 한 가지 간단한 형태는 ECB(Electronic CodeBook) 모드라고 합니다.One simple form of block cipher is called the electronic codebook (ECB) mode. ECB 모드는 첫 번째 일반 텍스트 블록을 초기화하는 데 초기화 벡터를 사용하지 않으므로 안전하지 않은 것으로 간주됩니다.ECB mode is not considered secure, because it does not use an initialization vector to initialize the first plaintext block. 비밀 키 k가 주어진 경우 초기화 벡터를 사용하지 않는 단순 블록 암호는 일반 텍스트의 동일한 입력 블록을 암호 텍스트의 동일한 출력 블록으로 암호화합니다.For a given secret key k, a simple block cipher that does not use an initialization vector will encrypt the same input block of plaintext into the same output block of ciphertext. 따라서 입력 일반 텍스트 스트림에 중복된 블록이 있는 경우 출력 암호 텍스트 스트림에도 중복된 블록이 생성됩니다.Therefore, if you have duplicate blocks in your input plaintext stream, you will have duplicate blocks in your output ciphertext stream. 이러한 중복 출력 블록을 통해 권한이 없는 사용자가 취약한 암호화 알고리즘이 사용되었다는 사실과 가능한 공격 방식을 알게 됩니다.These duplicate output blocks alert unauthorized users to the weak encryption used the algorithms that might have been employed, and the possible modes of attack. 따라서 ECB 암호화 모드는 분석에 매우 취약하므로 키가 노출될 수 있습니다.The ECB cipher mode is therefore quite vulnerable to analysis, and ultimately, key discovery.

기본 클래스 라이브러리에 제공되는 블록 암호 클래스에서는 CBC(Cipher Block Chaining)라는 기본 체인 모드를 사용하며, 필요에 따라 이 기본 모드를 변경할 수 있습니다.The block cipher classes that are provided in the base class library use a default chaining mode called cipher-block chaining (CBC), although you can change this default if you want.

CBC 암호화에서는 IV(Initialization Vector)를 사용하여 일반 텍스트의 첫 번째 블록을 암호화함으로써 ECB 암호화와 관련된 문제를 해결합니다.CBC ciphers overcome the problems associated with ECB ciphers by using an initialization vector (IV) to encrypt the first block of plaintext. 일반 텍스트의 각 후속 블록은 암호화되기 전에 이전 암호 텍스트 블록과 배타적 비트 OR(XOR) 연산을 수행합니다.Each subsequent block of plaintext undergoes a bitwise exclusive OR (XOR) operation with the previous ciphertext block before it is encrypted. 따라서 각 암호 텍스트 블록은 이전 모든 블록에 종속됩니다.Each ciphertext block is therefore dependent on all previous blocks. 이 시스템을 사용하는 경우 권한이 없는 사용자에게 알려질 수 있는 일반적인 메시지 헤더를 사용해서는 키를 리버스 엔지니어링할 수 없습니다.When this system is used, common message headers that might be known to an unauthorized user cannot be used to reverse-engineer a key.

CBC 암호화로 암호화된 데이터를 손상시킬 수 있는 한 가지 방법은 가능한 모든 키에 대해 철저한 검색을 수행하는 것입니다.One way to compromise data that is encrypted with a CBC cipher is to perform an exhaustive search of every possible key. 암호화 수행에 사용된 키의 크기에 따라 가장 빠른 컴퓨터를 사용해도 이러한 철저한 검색에는 많은 시간이 걸리므로 이 방법은 실제로 불가능합니다.Depending on the size of the key that is used to perform encryption, this kind of search is very time-consuming using even the fastest computers and is therefore infeasible. 키 크기가 클수록 해독이 더 어려워집니다.Larger key sizes are more difficult to decipher. 이론적으로 암호화를 통해 악의적 사용자가 암호화된 데이터를 검색할 수 없도록 할 수는 있지만, 그러면 비용이 증가합니다.Although encryption does not make it theoretically impossible for an adversary to retrieve the encrypted data, it does raise the cost of doing this. 며칠 동안만 유용한 데이터를 검색하기 위해 3개월에 걸쳐 철저한 검색을 수행한다면 철저한 검색 방법은 실용적이지 않습니다.If it takes three months to perform an exhaustive search to retrieve data that is meaningful only for a few days, the exhaustive search method is impractical.

비밀 키 암호화의 단점은 두 당사자가 키 및 IV에 대해 동의하고 해당 값을 통신했다고 추정하는 것입니다.The disadvantage of secret-key encryption is that it presumes two parties have agreed on a key and IV, and communicated their values. IV는 비밀로 간주되지 않으며 메시지와 함께 일반 텍스트로 전송할 수 있습니다.The IV is not considered a secret and can be transmitted in plaintext with the message. 그러나 키는 권한이 없는 사용자에게 비밀로 유지되어야 합니다.However, the key must be kept secret from unauthorized users. 이러한 문제 때문에 비밀 키 암호화는 키와 IV의 값을 비밀리에 교환하는 공개 키 암호화와 함께 사용되는 경우가 많습니다.Because of these problems, secret-key encryption is often used together with public-key encryption to privately communicate the values of the key and IV.

Alice와 bob은 안전 하지 않은 채널을 통해 통신 하려는 두 당사자가 가정 같이 비밀 키 암호화를 사용할 수 있습니다. Alice와 bob은 특정 키와 IV를 사용 하 여 하나의 특정 알고리즘 (예: AES)을 사용 하도록 동의 합니다.Assuming that Alice and Bob are two parties who want to communicate over a nonsecure channel, they might use secret-key encryption as follows: Alice and Bob agree to use one particular algorithm (AES, for example) with a particular key and IV. Alice는 메시지를 작성 하 고를 메시지를 보낼 네트워크 스트림 (아마도 명명 된 파이프 또는 네트워크 메일)를 만듭니다.Alice composes a message and creates a network stream (perhaps a named pipe or network email) on which to send the message. 그런 다음 키와 IV를 사용하여 텍스트를 암호화하고 인트라넷을 통해 Bob에게 암호화된 메시지와 IV를 전송합니다.Next, she encrypts the text using the key and IV, and sends the encrypted message and IV to Bob over the intranet. Bob은 암호화된 텍스트를 수신하고 IV와 미리 동의한 키를 사용하여 텍스트를 해독합니다.Bob receives the encrypted text and decrypts it by using the IV and previously agreed upon key. 악의적 사용자가 이러한 전송을 중간에 가로채도 키를 알 수 없으므로 원본 메시지를 복구할 수 없습니다.If the transmission is intercepted, the interceptor cannot recover the original message, because he does not know the key. 이 시나리오에서는 키만 비밀로 유지하면 됩니다.In this scenario, only the key must remain secret. 실제 시나리오에서는 Alice 또는 Bob 중 한 사람이 비밀 키를 생성하고 공개 키(비대칭) 암호화를 사용하여 비밀(대칭) 키를 상대방에게 전송합니다.In a real world scenario, either Alice or Bob generates a secret key and uses public-key (asymmetric) encryption to transfer the secret (symmetric) key to the other party. 공개 키 암호화에 대한 자세한 내용은 다음 섹션을 참조하세요.For more information about public-key encryption, see the next section.

.NET Framework는 비밀 키 암호화 알고리즘을 구현 하는 다음 클래스를 제공 합니다.The .NET Framework provides the following classes that implement secret-key encryption algorithms:

맨 위로 이동Back to top

공개 키 암호화Public-Key Encryption

퍼블릭 키 암호화에서는 권한이 없는 사용자에게 비밀로 유지되어야 하는 프라이빗 키와 모든 사람에게 퍼블릭될 수 있는 퍼블릭 키를 사용합니다.Public-key encryption uses a private key that must be kept secret from unauthorized users and a public key that can be made public to anyone. 퍼블릭 키와 프라이빗 키는 수학적으로 연결되어 있습니다. 퍼블릭 키로 암호화된 데이터는 해당 프라이빗 키로만 해독할 수 있으며, 프라이빗 키로 서명된 데이터는 해당 퍼블릭 키로만 확인할 수 있습니다.The public key and the private key are mathematically linked; data that is encrypted with the public key can be decrypted only with the private key, and data that is signed with the private key can be verified only with the public key. 퍼블릭 키는 모든 사람이 사용할 수 있습니다. 퍼블릭 키는 프라이빗 키의 보유자에게 보낼 데이터를 암호화하는 데 사용됩니다.The public key can be made available to anyone; it is used for encrypting data to be sent to the keeper of the private key. 공개 키 암호화 알고리즘은 데이터를 암호화하는 데 필요한 키와 해독하는 데 필요한 키가 서로 다르므로 비대칭 알고리즘이라고도 합니다.Public-key cryptographic algorithms are also known as asymmetric algorithms because one key is required to encrypt data, and another key is required to decrypt data. 기본적인 암호화 규칙은 키 재사용을 금지하며, 두 키가 모두 각 통신 세션에 고유해야 합니다.A basic cryptographic rule prohibits key reuse, and both keys should be unique for each communication session. 그러나 실제로는, 일반적으로 비대칭 키가 수명이 깁니다.However, in practice, asymmetric keys are generally long-lived.

두 당사자 (Alice와 Bob)는 공개 키 암호화를 다음과 같이 사용 될 수 있습니다. 먼저 alice가 공개/개인 키 쌍을 생성합니다.Two parties (Alice and Bob) might use public-key encryption as follows: First, Alice generates a public/private key pair. Bob은 Alice에게 암호화된 메시지를 보내려는 경우 Alice의 공개 키를 묻습니다.If Bob wants to send Alice an encrypted message, he asks her for her public key. Alice는 안전하지 않은 네트워크를 통해 Bob에게 공개 키를 보내고 Bob은 이 키를 사용하여 메시지를 암호화합니다.Alice sends Bob her public key over a nonsecure network, and Bob uses this key to encrypt a message. Bob은 암호화된 메시지를 Alice에게 보내고 Alice는 자신의 프라이빗 키를 사용하여 메시지를 해독합니다.Bob sends the encrypted message to Alice, and she decrypts it by using her private key. Bob이 공용 네트워크와 같은 안전하지 않은 채널을 통해 Alice의 키를 받은 경우 Bob은 메시지 가로채기(man-in-the-middle) 공격에 노출될 수 있습니다.If Bob received Alice's key over a nonsecure channel, such as a public network, Bob is open to a man-in-the-middle attack. 따라서 Bob은 자신이 공개 키의 정확한 복사본을 가졌는지 Alice에게 확인해야 합니다.Therefore, Bob must verify with Alice that he has a correct copy of her public key.

Alice의 공개 키를 전송하는 동안 권한이 없는 제3자가 키를 가로챌 수 있습니다.During the transmission of Alice's public key, an unauthorized agent might intercept the key. 또한 동일한 제3자가 Bob으로부터 암호화된 메시지를 가로챌 수도 있습니다.Furthermore, the same agent might intercept the encrypted message from Bob. 그러나 제3자는 공개 키를 사용하여 메시지를 해독할 수 없습니다.However, the agent cannot decrypt the message with the public key. 전송되지 않은 Alice의 프라이빗 키를 사용해서만 메시지를 해독할 수 있습니다.The message can be decrypted only with Alice's private key, which has not been transmitted. Alice는 Bob에게 보내는 회신 메시지를 암호화하는 데 자신의 프라이빗 키를 사용하지 않습니다. 퍼블릭 키를 가진 사람이 해당 메시지를 해독할 수 있기 때문입니다.Alice does not use her private key to encrypt a reply message to Bob, because anyone with the public key could decrypt the message. Alice가 Bob에게 메시지를 다시 보내려는 경우 Bob에게 그의 공개 키를 묻고 해당 공개 키를 사용하여 메시지를 암호화합니다.If Alice wants to send a message back to Bob, she asks Bob for his public key and encrypts her message using that public key. 그러면 Bob은 자신의 연결된 프라이빗 키를 사용하여 메시지를 해독합니다.Bob then decrypts the message using his associated private key.

이 시나리오에서 Alice와 Bob은 공개 키(비대칭) 암호화를 사용하여 비밀(대칭) 키를 전송하고 나머지 세션에 비밀 키 암호화를 사용합니다.In this scenario, Alice and Bob use public-key (asymmetric) encryption to transfer a secret (symmetric) key and use secret-key encryption for the remainder of their session.

다음은 공개 키와 비밀 키 암호화 알고리즘을 비교한 목록입니다.The following list offers comparisons between public-key and secret-key cryptographic algorithms:

  • 공개 키 암호화 알고리즘에서는 고정 버퍼 크기를 사용하는 반면 비밀 키 암호화 알고리즘에서는 가변 길이 버퍼를 사용합니다.Public-key cryptographic algorithms use a fixed buffer size, whereas secret-key cryptographic algorithms use a variable-length buffer.

  • 공개 키 알고리즘에서는 적은 양의 데이터만 암호화할 수 있으므로 비밀 키 알고리즘과 같이 데이터를 스트림으로 결합하는 데 사용할 수는 없습니다.Public-key algorithms cannot be used to chain data together into streams the way secret-key algorithms can, because only small amounts of data can be encrypted. 따라서 비대칭 작업에서는 대칭 작업에서와 동일한 스트리밍 모델을 사용하지 않습니다.Therefore, asymmetric operations do not use the same streaming model as symmetric operations.

  • 공개 키 암호화는 비밀 키 암호화보다 키 공간(키에 사용할 수 있는 값의 범위)이 훨씬 큽니다.Public-key encryption has a much larger keyspace (range of possible values for the key) than secret-key encryption. 따라서 공개 키 암호화는 가능한 모든 키를 시도하는 철저한 공격에 덜 취약합니다.Therefore, public-key encryption is less susceptible to exhaustive attacks that try every possible key.

  • 보낸 사람의 ID를 확인할 방법이 몇 가지 있다면 공개 키는 보호할 필요가 없으므로 손쉽게 배포할 수 있습니다.Public keys are easy to distribute because they do not have to be secured, provided that some way exists to verify the identity of the sender.

  • 디지털 서명을 생성하는 데 일부 공개 키 알고리즘(예: RSA 및 DSA 단, Diffie-Hellman 제외)을 사용하면 데이터를 보낸 사람의 ID를 확인할 수 있습니다.Some public-key algorithms (such as RSA and DSA, but not Diffie-Hellman) can be used to create digital signatures to verify the identity of the sender of data.

  • 공개 키 알고리즘은 비밀 키 알고리즘과 비교하면 매우 느리므로 대규모 데이터를 암호화할 때는 적합하지 않습니다.Public-key algorithms are very slow compared with secret-key algorithms, and are not designed to encrypt large amounts of data. 공개 키 알고리즘은 매우 적은 양의 데이터를 전송하는 데만 유용합니다.Public-key algorithms are useful only for transferring very small amounts of data. 일반적으로 공개 키 암호화는 비밀 키 알고리즘에서 사용하는 키 및 IV를 암호화하는 데 사용합니다.Typically, public-key encryption is used to encrypt a key and IV to be used by a secret-key algorithm. 키 및 IV가 전송되면 비밀 키 암호화가 나머지 세션에서 사용됩니다.After the key and IV are transferred, secret-key encryption is used for the remainder of the session.

.NET Framework는 공개 키 암호화 알고리즘을 구현 하는 다음 클래스를 제공 합니다.The .NET Framework provides the following classes that implement public-key encryption algorithms:

RSA는 암호화 및 서명에서 모두 사용할 수 있지만, DSA는 서명에만 사용할 수 있고 Diffie-Hellman은 키 생성에만 사용할 수 있습니다.RSA allows both encryption and signing, but DSA can be used only for signing, and Diffie-Hellman can be used only for key generation. 일반적으로 퍼블릭 키 알고리즘은 비밀 키 알고리즘보다 용도가 제한됩니다.In general, public-key algorithms are more limited in their uses than private-key algorithms.

맨 위로 이동Back to top

디지털 서명Digital Signatures

공개 키 알고리즘은 디지털 서명을 만드는 데도 사용할 수 있습니다.Public-key algorithms can also be used to form digital signatures. 디지털 서명은 보낸 사람의 공개 키를 신뢰하는 경우 보낸 사람의 ID를 인증하고, 데이터 무결성 보호를 지원합니다.Digital signatures authenticate the identity of a sender (if you trust the sender's public key) and help protect the integrity of data. Alice의 데이터를 받는 사람은 Alice가 생성한 공개 키를 사용하여 해당 디지털 서명을 Alice의 데이터 및 공개 키와 비교함으로써 Alice가 해당 데이터를 보냈는지 확인할 수 있습니다.Using a public key generated by Alice, the recipient of Alice's data can verify that Alice sent it by comparing the digital signature to Alice's data and Alice's public key.

공개 키 암호화를 사용하여 메시지에 디지털 서명을 추가하기 위해 Alice는 먼저 메시지에 해시 알고리즘을 적용하여 메시지 다이제스트를 만듭니다.To use public-key cryptography to digitally sign a message, Alice first applies a hash algorithm to the message to create a message digest. 이 메시지 다이제스트는 데이터의 압축된 고유 표현입니다.The message digest is a compact and unique representation of data. 그런 다음 Alice는 자신의 프라이빗 키를 사용하여 메시지 다이제스트를 암호화하고 자신의 개인 서명을 만듭니다.Alice then encrypts the message digest with her private key to create her personal signature. Bob은 메시지와 서명을 받으면 Alice의 공개 키를 사용하여 서명을 해독하고 메시지 다이제스트를 복구하고 Alice가 사용한 것과 동일한 해시 알고리즘을 사용하여 메시지를 해시합니다.Upon receiving the message and signature, Bob decrypts the signature using Alice's public key to recover the message digest and hashes the message using the same hash algorithm that Alice used. Bob이 계산한 메시지 다이제스트가 Alice로부터 받은 메시지 다이제스트와 정확히 일치하면 Bob은 해당 메시지가 프라이빗 키의 소유자로부터 왔으며 데이터가 수정되지 않았음을 확인할 수 있습니다.If the message digest that Bob computes exactly matches the message digest received from Alice, Bob is assured that the message came from the possessor of the private key and that the data has not been modified. Bob이 프라이빗 키의 소유자가 Alice임을 신뢰하는 경우 해당 메시지를 Alice가 보냈음을 알게 됩니다.If Bob trusts that Alice is the possessor of the private key, he knows that the message came from Alice.

참고

보낸 사람의 공개 키는 공개된 정보이고 일반적으로 디지털 서명 형식에 포함되므로 누구나 서명을 확인할 수 있습니다.A signature can be verified by anyone because the sender's public key is common knowledge and is typically included in the digital signature format. 이 방법이 메시지의 기밀성을 유지하지는 않으므로 메시지의 기밀을 위해서는 메시지에 대한 암호화도 수행해야 합니다.This method does not retain the secrecy of the message; for the message to be secret, it must also be encrypted.

.NET Framework는 디지털 서명 알고리즘을 구현 하는 다음 클래스를 제공 합니다.The .NET Framework provides the following classes that implement digital signature algorithms:

맨 위로 이동Back to top

해시 값Hash Values

해시 알고리즘은 임의 길이의 이진 값을 해시 값으로 알려진 고정된 길이의 더욱 작은 이진 값에 매핑합니다.Hash algorithms map binary values of an arbitrary length to smaller binary values of a fixed length, known as hash values. 해시 값은 데이터 부분을 숫자로 나타낸 값입니다.A hash value is a numerical representation of a piece of data. 일반 텍스트 단락을 해시하고 단락의 한 문자만 변경해도 그다음 해시는 다른 값을 생성합니다.If you hash a paragraph of plaintext and change even one letter of the paragraph, a subsequent hash will produce a different value. 해시가 강력하게 암호화되면 해당 값이 크게 변경됩니다.If the hash is cryptographically strong, its value will change significantly. 예를 들어 메시지 중 1비트만 변경되어도 강력한 해시 함수는 50%까지 다른 출력을 생성할 수 있습니다.For example, if a single bit of a message is changed, a strong hash function may produce an output that differs by 50 percent. 여러 입력 값이 동일한 출력 값으로 해시될 수 있습니다.Many input values may hash to the same output value. 그러나 동일한 값으로 해시되는 두 개의 고유한 입력을 찾는 것은 계산상 불가능합니다.However, it is computationally infeasible to find two distinct inputs that hash to the same value.

두 당사자, Alice와 Bob은 해시 함수를 사용하여 메시지 무결성을 보장할 수 있습니다.Two parties (Alice and Bob) could use a hash function to ensure message integrity. 이를 위해 메시지에 서명할 해시 알고리즘을 선택합니다.They would select a hash algorithm to sign their messages. Alice는 메시지를 작성한 후 선택한 알고리즘을 사용하여 해당 메시지의 해시를 만듭니다.Alice would write a message, and then create a hash of that message by using the selected algorithm. 그런 다음 아래 방법 중 하나를 따릅니다.They would then follow one of the following methods:

  • Alice는 일반 텍스트 메시지와 해시된 메시지(디지털 서명)를 Bob에게 보냅니다.Alice sends the plaintext message and the hashed message (digital signature) to Bob. Bob은 메시지를 받아 해시하고 자신의 해시 값과 Alice로부터 받은 해시 값을 비교합니다.Bob receives and hashes the message and compares his hash value to the hash value that he received from Alice. 해시 값이 동일하면 메시지가 변경되지 않은 것입니다.If the hash values are identical, the message was not altered. 값이 동일하지 않으면 Alice가 메시지를 작성한 후 해당 메시지가 변경된 것입니다.If the values are not identical, the message was altered after Alice wrote it.

    하지만 이 방법이 보낸 사람의 신뢰성을 보장하지는 않습니다.Unfortunately, this method does not establish the authenticity of the sender. 다른 사람이 Alice를 가장하여 Bob에게 메시지를 보낼 수도 있습니다.Anyone can impersonate Alice and send a message to Bob. Alice와 Bob이 동일한 해시 알고리즘을 사용하여 메시지에 서명할 수 있는데 이때 Bob은 메시지와 해당 서명이 일치한다는 사실만 확인하면 됩니다.They can use the same hash algorithm to sign their message, and all Bob can determine is that the message matches its signature. 이는 메시지 가로채기(man-in-the-middle) 공격의 한 가지 형태입니다.This is one form of a man-in-the-middle attack. 자세한 내용은 세대 CNG (Cryptography Next) 보안 통신 예제합니다.For more information, see Cryptography Next Generation (CNG) Secure Communication Example.

  • Alice가 비보안 공용 채널을 통해 Bob에게 일반 텍스트 메시지를 보냅니다.Alice sends the plaintext message to Bob over a nonsecure public channel. 그리고 보안 개인 채널을 통해 Bob에게 해시된 메시지를 보냅니다.She sends the hashed message to Bob over a secure private channel. Bob은 일반 텍스트 메시지를 받아 해시하고, 이 해시를 개인 채널로 교환된 해시와 비교합니다.Bob receives the plaintext message, hashes it, and compares the hash to the privately exchanged hash. 해시가 일치하면 Bob은 다음 두 가지 사실을 알게 됩니다.If the hashes match, Bob knows two things:

    • 메시지가 변경되지 않았습니다.The message was not altered.

    • 메시지를 보낸 사람(Alice)이 인증되었습니다.The sender of the message (Alice) is authentic.

    이 시스템이 작동되려면 Alice가 Bob을 제외한 모든 사람에게 원본 해시 값을 숨겨야 합니다.For this system to work, Alice must hide her original hash value from all parties except Bob.

  • Alice가 비보안 공용 채널을 통해 Bob에게 일반 텍스트 메시지를 보내고 공개적으로 볼 수 있는 자신의 웹 사이트에 해시된 메시지를 게시합니다.Alice sends the plaintext message to Bob over a nonsecure public channel and places the hashed message on her publicly viewable Web site.

    이 방법을 사용하면 아무도 해시 값을 수정할 수 없으므로 메시지 변조를 방지할 수 있습니다.This method prevents message tampering by preventing anyone from modifying the hash value. 메시지와 해당 해시를 아무나 읽을 수 있지만, 해시 값은 Alice만 변경할 수 있습니다.Although the message and its hash can be read by anyone, the hash value can be changed only by Alice. Alice를 가장하려는 공격자는 Alice의 웹 사이트에 액세스할 수 있어야 합니다.An attacker who wants to impersonate Alice would require access to Alice's Web site.

이러한 방법 중 어떠한 방법을 사용해도 일반 텍스트로 전송되는 Alice의 메시지를 다른 사람이 읽지 못하게 할 수는 없습니다.None of the previous methods will prevent someone from reading Alice's messages, because they are transmitted in plaintext. 일반적으로 완벽한 보안을 구현하려면 디지털 서명(메시지 서명)과 암호화가 필요합니다.Full security typically requires digital signatures (message signing) and encryption.

.NET Framework는 해시 알고리즘을 구현 하는 다음 클래스를 제공 합니다.The .NET Framework provides the following classes that implement hashing algorithms:

참고

1996년에 MD5 디자인 결함이 발견되었으므로 대신 SHA-1을 사용하는 것이 좋습니다.MD5 design flaws were discovered in 1996, and SHA-1 was recommended instead. 2004년에 결함이 추가로 발견되어 MD5 알고리즘은 더 이상 안전한 것으로 간주되지 않습니다.In 2004, additional flaws were discovered, and the MD5 algorithm is no longer considered secure. SHA-1 알고리즘에서도 보안 결함이 발견되었으므로 이제는 SHA-2를 대신 사용하는 것이 좋습니다.The SHA-1 algorithm has also been found to be insecure, and SHA-2 is now recommended instead.

맨 위로 이동Back to top

난수 생성Random Number Generation

난수 생성은 여러 암호화 작업에 필수적입니다.Random number generation is integral to many cryptographic operations. 예를 들어 암호화 키는 재현이 불가능하도록 가능한 한 무작위적이어야 합니다.For example, cryptographic keys need to be as random as possible so that it is infeasible to reproduce them. 암호화 난수 생성기는 계산상 1/2 이상의 확률로 예측할 수 없는 출력을 생성해야 합니다.Cryptographic random number generators must generate output that is computationally infeasible to predict with a probability that is better than one half. 따라서 어떠한 다음 출력 비트 예측 방법도 임의 추측보다 더 잘 예측할 수 없어야 합니다.Therefore, any method of predicting the next output bit must not perform better than random guessing. .NET Framework의 클래스는 난수 생성기를 사용 하 여 암호화 키를 생성 합니다.The classes in the .NET Framework use random number generators to generate cryptographic keys.

RNGCryptoServiceProvider 클래스는 난수 생성기 알고리즘을 구현한 것입니다.The RNGCryptoServiceProvider class is an implementation of a random number generator algorithm.

맨 위로 이동Back to top

ClickOnce 매니페스트ClickOnce Manifests

.NET Framework 3.5에서는 다음과 같은 암호화 클래스 가져오고 사용 하 여 배포 된 응용 프로그램 매니페스트 서명에 대 한 정보를 확인할 수 있습니다 ClickOnce 기술을:In the .NET Framework 3.5, the following cryptography classes let you obtain and verify information about manifest signatures for applications that are deployed using ClickOnce technology:

또한 다음 클래스는 특정 서명 정보를 제공합니다.In addition, the following classes provide specific signature information:

맨 위로 이동Back to top

Suite B 지원Suite B Support

.NET Framework 3.5에서 NSA National Security Agency ()를 게시 하는 암호화 알고리즘의 Suite B 집합을 지원 합니다.The .NET Framework 3.5 supports the Suite B set of cryptographic algorithms published by the National Security Agency (NSA). Suite B에 대한 자세한 내용은 NSA Suite B Cryptography Fact Sheet를 참조하세요.For more information about Suite B, see the NSA Suite B Cryptography Fact Sheet.

다음 알고리즘이 포함되어 있습니다.The following algorithms are included:

  • 암호화의 경우 키 크기가 128, 192 및 256비트인 AES(Advanced Encryption Standard) 알고리즘Advanced Encryption Standard (AES) algorithm with key sizes of 128, 192, , and 256 bits for encryption.

  • 해시의 경우 SHA(Secure Hash Algorithm)-1, SHA-256, SHA-384 및 SHA-512.Secure Hash Algorithms SHA-1, SHA-256, SHA-384, and SHA-512 for hashing. 일반적으로 마지막 세 알고리즘을 함께 묶어 SHA-2라고 합니다.(The last three are generally grouped together and referred to as SHA-2.)

  • 서명의 경우 256비트, 384비트 및 521비트 소수법 곡선을 사용하는 ECDSA(Elliptic Curve Digital Signature Algorithm).Elliptic Curve Digital Signature Algorithm (ECDSA), using curves of 256-bit, 384-bit, and 521-bit prime moduli for signing. NSA 문서에서는 이러한 곡선을 구체적으로 정의하여 P-256, P-384 및 P-521로 호칭합니다.The NSA documentation specifically defines these curves, and calls them P-256, P-384, and P-521. 이 알고리즘은 ECDsaCng 클래스에서 제공합니다.This algorithm is provided by the ECDsaCng class. 이를 통해 프라이빗 키로 서명하고 퍼블릭 키로 서명을 확인할 수 있습니다.It enables you to sign with a private key and verify the signature with a public key.

  • 키 교환 및 비밀 계약의 경우 256비트, 384비트 및 521비트 소수법 곡선을 사용하는 ECDH(Elliptic Curve Diffie-Hellman) 알고리즘.Elliptic Curve Diffie-Hellman (ECDH) algorithm, using curves of 256-bit, 384-bit, and 521-bit prime moduli for the key exchange and secret agreement. 이 알고리즘은 ECDiffieHellmanCng 클래스에서 제공합니다.This algorithm is provided by the ECDiffieHellmanCng class.

AES, SHA-256, SHA-384 및 SHA-512 구현에 대한 FIPS(Federal Information Processing Standard) 인증 구현의 관리 코드 래퍼는 새로운 AesCryptoServiceProvider, SHA256CryptoServiceProvider, SHA384CryptoServiceProviderSHA512CryptoServiceProvider 클래스에서 사용할 수 있습니다.Managed code wrappers for the Federal Information Processing Standard (FIPS) certified implementations of the AES, SHA-256, SHA-384, and SHA-512 implementations are available in the new AesCryptoServiceProvider, SHA256CryptoServiceProvider, SHA384CryptoServiceProvider, and SHA512CryptoServiceProvider classes.

맨 위로 이동Back to top

CNG(Cryptography Next Generation) 클래스Cryptography Next Generation (CNG) Classes

CNG(Cryptography Next Generation) 클래스는 네이티브 CNG 함수 관련 관리 래퍼를 제공합니다.The Cryptography Next Generation (CNG) classes provide a managed wrapper around the native CNG functions. CNG는 CryptoAPI를 대체합니다. 이러한 클래스의 이름에는 "Cng"가 포함되어 있습니다.(CNG is the replacement for CryptoAPI.) These classes have "Cng" as part of their names. CNG 래퍼 클래스의 핵심은 CNG 키의 스토리지 및 사용을 추상화하는 CngKey 키 컨테이너 클래스입니다.Central to the CNG wrapper classes is the CngKey key container class, which abstracts the storage and use of CNG keys. 이 클래스를 통해 키 쌍 또는 공개 키를 안전하게 저장하고 간단한 문자열 이름을 사용하여 참조할 수 있습니다.This class lets you store a key pair or a public key securely and refer to it by using a simple string name. 타원 곡선 기반 ECDsaCng 서명 클래스 및 ECDiffieHellmanCng 암호화 클래스는 CngKey 개체를 사용할 수 있습니다.The elliptic curve-based ECDsaCng signature class and the ECDiffieHellmanCng encryption class can use CngKey objects.

CngKey 클래스는 키 열기, 생성, 삭제, 내보내기 등의 다양한 추가 작업에 사용됩니다.The CngKey class is used for a variety of additional operations, including opening, creating, deleting, and exporting keys. 또한 네이티브 함수를 직접 호출할 때 사용할 기본 키 핸들에 대한 액세스를 제공합니다.It also provides access to the underlying key handle to use when calling native functions directly.

.NET Framework 3.5에는 다양 한 지원 CNG 클래스는 다음과 같은 포함 됩니다.The .NET Framework 3.5 also includes a variety of supporting CNG classes, such as the following:

  • CngProvider 는 키 저장소 공급자를 유지 관리합니다.CngProvider maintains a key storage provider.

  • CngAlgorithm 은 CNG 알고리즘을 유지 관리합니다.CngAlgorithm maintains a CNG algorithm.

  • CngProperty 는 자주 사용되는 키 속성을 유지 관리합니다.CngProperty maintains frequently used key properties.

맨 위로 이동Back to top

제목Title 설명Description
암호화 모델Cryptography Model 기본 클래스 라이브러리에서 암호화가 구현되는 방식에 대해 설명합니다.Describes how cryptography is implemented in the base class library.
연습: 암호화 응용 프로그램 만들기Walkthrough: Creating a Cryptographic Application 기본 암호화 및 해독 작업을 보여 줍니다.Demonstrates basic encryption and decryption tasks.
암호화 클래스 구성Configuring Cryptography Classes 암호화 클래스에 알고리즘 이름을 매핑하고 암호화 알고리즘에 개체 식별자를 매핑하는 방법에 대해 설명합니다.Describes how to map algorithm names to cryptographic classes and map object identifiers to a cryptographic algorithm.