마스크 생성 함수
Mask generation function마스크 생성 함수(MGF)는 해시 함수의 출력이 일정한 크기를 가지지만 가변 길이의 출력을 지원하는 점을 제외하고는 암호화 해시 함수와 유사한 암호화 프리미티브이다.이 점에서 MGF는 일회용 XOR 함수로 간주할 수 있습니다.MGF는 임의의 길이의 입력을 받아들여 임의의 길이의 출력을 생성하도록 처리할 수 있습니다.마스크 생성 함수는 완전히 결정적입니다. 지정된 입력과 원하는 출력 길이에 대해 출력은 항상 동일합니다.
정의.
마스크 생성 함수는 가변길이 및 원하는 출력길이의 옥텟 문자열을 입력으로 받아 원하는 길이의 옥텟 문자열을 출력한다.입력 및 출력 옥텟 문자열의 길이에 제한이 있을 수 있지만 일반적으로 이러한 경계는 매우 큽니다.마스크 생성 함수는 확정적입니다.옥텟 문자열 출력은 입력 옥텟 문자열에 의해 완전히 결정됩니다.마스크 생성 함수의 출력은 의사 난수여야 합니다.즉, 함수에 대한 시드가 불분명한 경우 출력을 진정한 랜덤 [1]문자열과 구별할 수 없습니다.
적용들
마스크 생성 함수는 해시 함수의 일반화로서 해시 함수가 있는 곳이라면 어디에나 유용합니다.단, 고정 사이즈의 해시가 불충분한 경우에는 MGF를 사용하는 것이 좋습니다.예를 들어 패딩 생성, 대칭키 암호화에서의 원타임패드 또는 키스트림 생성, 의사난수 생성기 출력 등이 있습니다.
패딩 방식
마스크 생성 함수는 RSA-OAEP 알고리즘의 패딩 사양의 일부로 처음 제안되었습니다.OAEP 알고리즘에서는 길이가 임의의 크기의 입력 [1]메시지에 비례하는 "데이터 블록"과 같은 크기의 출력을 생성할 수 있는 암호화 해시 함수가 필요했습니다.
난수 생성기
NIST Special Publication 800-90A는[2] 암호화된 보안 난수 생성기의 클래스를 정의합니다. 그 중 하나는 "해시 DRBG"로, 해시 함수를 카운터와 함께 사용하여 요청된 난수 비트 수와 동일한 크기의 요청된 난수 비트를 생성합니다.
예
MGF를 구축하기 위한 가장 일반적이고 간단한 메커니즘은 증가 카운터 값과 함께 해시 함수를 반복적으로 적용하는 것입니다.충분한 양의 출력이 수집될 때까지 카운터를 무한히 증가시켜 새로운 출력 블록을 생성할 수 있습니다.이것은 MGF1에서 사용되는 접근법입니다.
MGF1
MGF1은 RSA [1]Laboraties가 발행하는 공개키 암호 규격 #1에 정의되어 있는 마스크 생성 함수입니다.
옵션들
- hash 함수( stylemathsf {}})는 해시 함수 출력의 옥텟 길이를 나타냅니다.
입력
- 마스크가 생성되는 시드, 옥텟 문자열
- 마스크의 옥텟 단위로 지정된 (( L e n {32 {입니다.
산출량
- mask, 길이 l 또는 "mask too long"의 옥텟 문자열입니다.
순서
- l> ( e) \ l > 인 "mask too long"을 출력하고 중지합니다.
- T를 빈 옥텟 문자열로 .
- 0 ~의다음 절차를 수행합니다.
- 에서 의옥텟 C({4로 합니다.
- Z(\ Z C C의 해시를 옥텟 T(\ T에 연결합니다.
- 마스크로T의을 출력합니다.
코드 예시
다음은 MGF1을 구현하는 Python3 코드입니다.
수입품 해시리브 방어하다 mgf1(씨를 뿌리다: 바이트 수, 길이: 인트, 해시_펑크=해시리브.샤원) -> 바이트 수: HLen = 해시_펑크().다이제스트_사이즈 # https://www.ietf.org/rfc/rfc2437.txt # 1. l > 2^32(hLen)인 경우 "mask too long"을 출력하고 중지합니다. 한다면 길이 > (HLen << > 32): 올리다 값 오류("마스크가 너무 길다") # 2. T를 빈 옥텟 문자열로 합니다. T = b"" # 3. 0 ~\lceil{l / hLen}\rceil-1 의 카운터에 대해서는, 다음의 순서를 실행합니다. 주의: \lceil{l / hLen}\rceil-1은 필요한 반복 횟수입니다. # 단, 원하는 길이에 도달했는지 확인하는 것은 간단합니다. 계산대 = 0 하는 동안에 렌(T) < > 길이: # a. 원시 I2OSP를 사용하여 길이 4의 옥텟 문자열 C로 카운터를 변환: C = I2OSP(카운터, 4) C = 인트.바이트 수(계산대, 4, '크다) # b. 시드 Z와 C의 해시를 옥텟 문자열 T에 연결한다: T = T 해시(Z C) T += 해시_펑크(씨를 뿌리다 + C).다이제스트() 계산대 += 1 # 4. T의 선두1 옥텟을 옥텟 문자열 마스크로 출력합니다. 돌아가다 T[:길이]
MGF1의 출력 예:
Python 3.10.4 (메인, 2022년 4월 16일 16:28:41)[GCC 8.3.0] (Linux) 자세한 내용을 보려면 "help", "copyright", "credits" 또는 "license"를 입력하십시오. >>>부터 mgf1 수입품 mgf1 >>>부터 해시리브 수입품 sha256 >>>mgf1(b"푸", 3).16진수() '1ac907' >>>mgf1(b"푸", 5).16진수() '1ac9075cd4' >>>mgf1(b'바', 5).16진수() 'bc0c655e01' >>>mgf1(b'바', 50).16진수() 'bc0c655e016bc2931d85a2e675181adcef7f581f76df2739da74faac41627be2f715c89e983g0ce80ced9878641cb4876' >>>mgf1(b'바', 50, sha256).16진수() '382576a7841021cc28fc4c0948753fb8312090cea942ea4c4ea4e735d10dc724b'f9f6069f289d61daca0cb814502ef04e1e1'
레퍼런스
- ^ a b c RSA Laboratories. "RFC 2437 PKCS #1".
- ^ National Institute of Standards and Technology. "Recommendation for Random Number Generation Using Deterministic Random Bit Generators" (PDF).