키 링의 대부분의 키는 일종의 엔트로피를 포함하며 "CBC 모드 암호화 + HMAC 유효성 검사" 또는 "GCM 암호화 + 유효성 검사"라는 알고리즘 정보를 포함합니다. 이러한 경우 포함된 엔트로피를 이 키에 대한 마스터 키 지정 자료(또는 KM)라고 하며, 키 파생 함수를 수행하여 실제 암호화 작업에 사용할 키를 파생합니다.
비고
키는 추상이며 사용자 지정 구현은 아래와 같이 작동하지 않을 수 있습니다. 키가 기본 제공 팩터리 중 하나를 사용하는 대신 자체 구현 IAuthenticatedEncryptor 을 제공하는 경우 이 섹션에 설명된 메커니즘은 더 이상 적용되지 않습니다.
추가 인증된 데이터 및 하위 키 파생
이 인터페이스는 IAuthenticatedEncryptor 모든 인증된 암호화 작업의 핵심 인터페이스 역할을 합니다. 해당 Encrypt 메서드는 일반 텍스트와 additionalAuthenticatedData(AAD)의 두 버퍼를 사용합니다. 일반 텍스트 콘텐츠는 호출 IDataProtector.Protect을 변경하지 않고 흐르지만 AAD는 시스템에 의해 생성되고 다음 세 가지 구성 요소로 구성됩니다.
이 버전의 데이터 보호 시스템을 식별하는 32비트 매직 헤더 09 F0 C9 F0입니다.
128비트 키 ID입니다.
이 작업을 수행하는 용도 체인에서 형성된
IDataProtector가변 길이 문자열입니다.
AAD는 세 가지 구성 요소 모두의 튜플에 대해 고유하기 때문에 모든 암호화 작업에서 KM 자체를 사용하는 대신 KM에서 새 키를 파생하는 데 사용할 수 있습니다. 호출할 IAuthenticatedEncryptor.Encrypt때마다 다음 키 파생 프로세스가 수행됩니다.
( K_E, K_H ) = SP800_108_CTR_HMACSHA512(K_M, AAD, contextHeader || keyModifier)
여기서는 다음 매개 변수를 사용하여 카운터 모드(NIST SP800-108, Sec. 5.1 참조)에서 NIST SP800-108 KDF를 호출합니다.
KDK(키 파생 키) =
K_MPRF = HMACSHA512
label = 추가 인증된 데이터
context = contextHeader || keyModifier
컨텍스트 헤더는 길이가 가변적이며, 이는 K_E 및 K_H을 파생하는 알고리즘의 고유한 특징을 나타내는 지문으로 사용됩니다. 키 한정자는 각 호출 Encrypt 에 대해 임의로 생성되는 128비트 문자열이며 KDF에 대한 다른 모든 입력이 일정하더라도 KE 및 KH가 이 특정 인증 암호화 작업에 대해 고유할 확률이 매우 높은지 확인하는 역할을 합니다.
CBC 모드 암호화 + HMAC 유효성 검사 작업의 | K_E | 경우 대칭 블록 암호 키의 길이이며 | K_H | HMAC 루틴의 다이제스트 크기입니다. GCM 암호화 + 유효성 검사 작업의 경우 . | K_H | = 0
CBC 모드 암호화 + HMAC 유효성 검사
위의 메커니즘을 통해 생성된 후에 K_E 는 임의 초기화 벡터를 생성하고 대칭 블록 암호 알고리즘을 실행하여 일반 텍스트를 암호화합니다. 초기화 벡터 및 암호 텍스트는 MAC을 생성하기 위해 키 K_H 로 초기화된 HMAC 루틴을 통해 실행됩니다. 이 프로세스와 반환 값은 아래 그래픽으로 표시됩니다.
output:= keyModifier || iv || E_cbc (K_E,iv,data) || HMAC(K_H, iv || E_cbc (K_E,iv,data))
비고
구현은 호출자에게 반환하기 전에 출력 앞에 매직 헤더 및 키 ID를 추가할 것입니다. 매직 헤더 및 키 ID는 암시적으로 AAD의 일부이며 키 한정자가 KDF에 대한 입력으로 공급되기 때문에 최종 반환 페이로드의 모든 단일 바이트가 MAC에서 인증됨을 의미합니다.
Galois/카운터 모드 암호화 + 유효성 검사
위의 메커니즘을 통해 생성된 후에 K_E 는 임의의 96비트 nonce를 생성하고 대칭 블록 암호 알고리즘을 실행하여 일반 텍스트를 암호화하고 128비트 인증 태그를 생성합니다.
output := keyModifier || nonce || E_gcm (K_E,nonce,data) || authTag
비고
GCM은 기본적으로 AAD 개념을 지원하지만 AAD 매개 변수에 대해 빈 문자열을 GCM에 전달하도록 선택하여 원래 KDF에만 AAD를 공급하고 있습니다. 그 이유는 두 가지입니다. 첫째, 민첩성을 지원하기 위해 암호화 키로 직접 사용하고 K_M 싶지 않습니다. 또한 GCM은 입력에 매우 엄격한 고유성 요구 사항을 적용합니다. GCM 암호화 루틴이 동일한(키, nonce) 쌍을 가진 두 개 이상의 고유 입력 데이터 집합에서 호출될 확률은 2^-32를 초과해서는 안 됩니다.
K_E을(를) 고정하면 2^-32 제한에 걸리기 전에 최대 2^32개의 암호화 작업만 수행할 수 있습니다. 이는 매우 많은 수의 작업처럼 보일 수 있지만 트래픽이 많은 웹 서버는 이러한 키의 정상적인 수명 내에 불과 며칠 만에 40억 개의 요청을 통과할 수 있습니다. 2^-32 확률 제한을 준수하기 위해 128비트 키 한정자와 96비트 nonce를 계속 사용하여 지정된 K_M모든 항목에 대해 사용 가능한 작업 수를 근본적으로 확장합니다. 디자인의 편의를 위해 CBC와 GCM 작업 간에 KDF 코드 경로를 공유하고 AAD가 이미 KDF에서 고려되므로 GCM 루틴으로 전달할 필요가 없습니다.
ASP.NET Core