이 문서에서는 표준 키 파생 함수를 사용하여 키를 파생하는 방법과 대칭 및 비대칭 키를 사용하여 콘텐츠를 암호화하는 방법을 보여 줍니다.
대칭 키
비밀 키 암호화라고도 하는 대칭 키 암호화를 사용하려면 암호화에 사용되는 키도 암호 해독에 사용해야 합니다. SymmetricKeyAlgorithmProvider 클래스를 사용하여 대칭 알고리즘을 지정하고 키를 만들거나 가져올 수 있습니다. CryptographicEngine 클래스에서 정적 메서드를 사용하여 알고리즘 및 키를 사용하여 데이터를 암호화하고 암호 해독할 수 있습니다.
대칭 키 암호화는 일반적으로 블록 암호 및 블록 암호 모드를 사용합니다. 블록 암호는 고정 크기 블록에서 작동하는 대칭 암호화 함수입니다. 암호화하려는 메시지가 블록 길이보다 긴 경우 블록 암호 모드를 사용해야 합니다. 블록 암호 모드는 블록 암호화를 사용하여 빌드된 대칭 암호화 함수입니다. 일반 텍스트를 일련의 고정 크기 블록으로 암호화합니다. 앱에 대해 지원되는 모드는 다음과 같습니다.
- ECB(전자 코드북) 모드는 메시지의 각 블록을 개별적으로 암호화합니다. 보안 암호화 모드로 간주되지 않습니다.
- CBC(암호 블록 체인) 모드는 이전 암호 텍스트 블록을 사용하여 현재 블록을 난독 처리합니다. 첫 번째 블록에 사용할 값을 결정해야 합니다. 이 값을 IV(초기화 벡터)라고 합니다.
- CCM(CBC-MAC카운터) 모드는 CBC 블록 암호 모드와 MAC(메시지 인증 코드)을 결합합니다.
- GCM(Galois 카운터 모드) 모드는 카운터 암호화 모드와 Galois 인증 모드를 결합합니다.
CBC와 같은 일부 모드에서는 첫 번째 암호 텍스트 블록에 IV(초기화 벡터)를 사용해야 합니다. 다음은 일반적인 초기화 벡터입니다. CryptographicEngine.Encrypt를 호출할 때 IV를 지정합니다. 대부분의 경우 IV를 동일한 키로 다시 사용하지 않는 것이 중요합니다.
- 고정된 방법은 암호화할 모든 메시지에 동일한 IV를 사용합니다. 이렇게 하면 정보가 누출되고 사용하지 않는 것이 좋습니다.
- 카운터는 각 블록에 대해 IV를 증분합니다.
- 임의는 의사 난이도 IV를 만듭니다. CryptographicBuffer.GenerateRandom을 사용하여 IV를 만들 수 있습니다.
- Nonce-Generated 암호화할 각 메시지에 고유한 번호를 사용합니다. 일반적으로 nonce는 수정된 메시지 또는 트랜잭션 식별자입니다. nonce를 비밀로 유지할 필요는 없지만 동일한 키로 다시 사용해서는 안 됩니다.
대부분의 모드에서는 일반 텍스트의 길이가 블록 크기의 정확한 배수여야 합니다. 이렇게 하려면 일반적으로 적절한 길이를 얻기 위해 일반 텍스트를 패딩해야 합니다.
블록 암호화는 고정 크기 데이터 블록을 암호화하지만 스트림 암호는 일반 텍스트 비트를 의사 비트 스트림(키 스트림이라고 함)과 결합하여 암호 텍스트를 생성하는 대칭 암호화 함수입니다. OTF(출력 피드백 모드) 및 CTR(카운터 모드)과 같은 일부 블록 암호 모드는 블록 암호화를 스트림 암호로 효과적으로 전환합니다. 그러나 RC4와 같은 실제 스트림 암호화는 일반적으로 블록 암호화 모드가 달성할 수 있는 것보다 더 빠른 속도로 작동합니다.
다음 예제에서는 SymmetricKeyAlgorithmProvider 클래스를 사용하여 대칭 키를 만들고 이를 사용하여 데이터를 암호화하고 해독하는 방법을 보여 있습니다.
비대칭 키
공개 키 암호화라고도 하는 비대칭 키 암호화는 공개 키와 프라이빗 키를 사용하여 암호화 및 암호 해독을 수행합니다. 키는 다르지만 수학적으로 관련이 있습니다. 일반적으로 프라이빗 키는 비밀로 유지되며 공개 키가 이해 관계자에게 배포되고 데이터를 암호화하는 데 사용되는 동안 데이터 암호 해독에 사용됩니다. 비대칭 암호화는 데이터 서명에도 유용합니다.
비대칭 암호화는 대칭 암호화보다 훨씬 느리기 때문에 대량의 데이터를 직접 암호화하는 데 거의 사용되지 않습니다. 대신 일반적으로 다음과 같은 방식으로 키를 암호화하는 데 사용됩니다.
- Alice는 Bob이 암호화된 메시지만 보내야 합니다.
- Alice는 프라이빗/공개 키 쌍을 만들고, 프라이빗 키를 비밀로 유지하고, 공개 키를 게시합니다.
- Bob에게 Alice에게 보내고 싶은 메시지가 있습니다.
- Bob은 대칭 키를 만듭니다.
- Bob은 새 대칭 키를 사용하여 Alice에게 메시지를 암호화합니다.
- Bob은 Alice의 공개 키를 사용하여 대칭 키를 암호화합니다.
- Bob은 암호화된 메시지와 암호화된 대칭 키를 Alice(Enveloped)에게 보냅니다.
- Alice는 프라이빗/퍼블릭 쌍의 프라이빗 키를 사용하여 Bob의 대칭 키를 해독합니다.
- Alice는 Bob의 대칭 키를 사용하여 메시지의 암호를 해독합니다.
AsymmetricKeyAlgorithmProvider 개체를 사용하여 비대칭 알고리즘 또는 서명 알고리즘을 지정하거나, 임시 키 쌍을 만들거나 가져오거나, 키 쌍의 공개 키 부분을 가져올 수 있습니다.
키 파생하기
공유 비밀에서 추가 키를 파생해야 하는 경우가 많습니다. KeyDerivationAlgorithmProvider 클래스와 KeyDerivationParameters 클래스에서 다음 특수 메서드 중 하나를 사용하여 키를 파생시킬 수 있습니다.
| 객체 | 설명 |
|---|---|
| BuildForPbkdf2 | 암호 기반 키 파생 함수 2(PBKDF2)에서 사용할 KeyDerivationParameters 개체를 만듭니다. |
| BuildForSP800108 | 카운터 모드, HMAC(해시 기반 메시지 인증 코드) 키 파생 함수에서 사용할 KeyDerivationParameters 개체를 만듭니다. |
| BuildForSP80056a | SP800-56A 키 파생 함수에서 사용할 KeyDerivationParameters 개체를 만듭니다. |
Windows developer