암호화 키

이 문서는 표준 키 파생 함수를 사용하여 키를 파생하는 방법과 대칭 및 비대칭 키를 사용하여 콘텐츠를 암호화하는 방법을 보여 줍니다.

대칭 키

비밀 키 암호화라고도 불리는 대칭 키 암호화를 사용하려면, 암호 해독에 암호화에 사용되는 키도 사용해야 합니다. 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 개체를 만듭니다.