아르곤2

Argon2

아르곤2는 2015년 7월 패스워드 해싱 대회 우승자로 선정된 핵심 파생 기능이다.[1][2] 룩셈부르크 대학알렉스 비류코프, 다니엘 디누, 드미트리 호브라토비치가 설계했다.[3] Argon2의 참조 구현은 Creative Commons CC0 라이선스(즉, 공용 도메인) 또는 Apache License 2.0에 따라 공개되며, 다음과 같은 세 가지 관련 버전을 제공한다.

  • 아르곤2d는 GPU 균열 공격에 대한 저항력을 극대화했다. 암호에 의존하는 순서로 메모리 어레이에 접속해 TMTO(Time-memory-off) 공격 가능성을 줄이지만, 가능한 측면 채널 공격을 도입한다.
  • 아르곤2i는 측면 채널 공격에 저항하도록 최적화되어 있다. 암호에 독립적인 순서로 메모리 어레이에 액세스한다.
  • 아르곤2id는 하이브리드 버전이다. 전반부 패스 오버 메모리에 대한 아르곤2i 접근방식과 후속 패스에 대한 아르곤2d 접근방식에 따른다. RFC는 유형 간의 차이를 모르거나 측면 채널 공격을 실행 가능한 위협으로 간주할 경우 Argon2id를 사용할 것을 권장한다.

세 가지 모드 모두 제어하는 세 가지 파라미터로 사양을 지정할 수 있다.

  • 실행 시간
  • 필요한 기억력
  • 평행도

암호해석

아르곤2d에 적용할 수 있는 공개 암호 분석은 없지만, 아르곤2i 함수에 대해서는 2개의 공표된 공격이 있다. 첫 번째 공격은 이전 버전의 아르곤2i에만 적용되며, 두 번째 공격은 최신 버전(1.3)[5]으로 확장되었다.

첫 번째 공격은 시간 페널티 없이 원하는 공간의 1/4에서 1/5 사이를 이용하여 단일 패스 아르곤2i 함수를 계산하고, 시간 페널티 없이 N/e < N/2.71 공간만을 사용하여 다중 패스 아르곤2i를 계산하는 것이 가능하다는 것을 보여준다.[6] 아르곤2의 저자들에 따르면, 이 공격 벡터는 버전 1.3에서 고정되었다.[7]

번째 공격은 아르곤2i를 매개변수 σ(공간 비용), τ(시간 비용), n==στ과 같은 스레드 카운트의 모든 선택에 대해 복잡성 O(n7/4 log(n)를 갖는 알고리즘으로 계산할 수 있음을 보여준다.[8] 아르곤2의 저자들은 아르곤2i를 3개 이상의 패스로 사용할 경우 이 공격이 효율적이지 않다고 주장한다.[7] 그러나 조엘 알웬과 예레미야 블락티는 공격을 개선했고 공격이 실패하려면 아르곤2i v1.3이 메모리 오버패스 10회 이상이 필요하다는 것을 보여줬다.[5]

알고리즘.

함수 Argon2 입력: 암호 (P): 바이트(0..2-132) 해시염(S): 바이트 (8..2-132) 소금 (암호 해시에 권장되는 16바이트) 병렬 (p):    숫자 (1..2-124) 병렬 처리 정도(: 스레드 수) tagLength (T): 숫자 (4..2-132) 원하는 반환 바이트 수 크기KB (m): 숫자 (8p..2-132) 반복 사용 메모리 양 (t):     번호(1..2-132) 버전 수행 반복 횟수(v): 번호(0x13)  현재 버전은 0x13(19진수) 키(K):            바이트(0..2-132) 옵션(Errata: PDF에 0이 표시됨..32바이트, RFC가 0..2바이트32) 관련 데이터(X): 바이트(0..2-132) 임의 추가 데이터 해시 유형(y):       숫자(0=Argon2d, 1=Argon2i, 2=Argon2id)    출력: 태그: 바이트(tagLength)  생성된 바이트, tagLength 길이 초기 64바이트 블록 H0 생성 모든 입력 매개변수가 연결되고 추가 엔트로피의 소스로 입력된다.     에라타: RFC는 H가0 64비트라고 말하고, PDF는 H가0 64비트라고 말한다.     에라타: RFC는 해시가 H^라고 하고, PDF는 ℋ(그러나 ℋ이 무엇인지 문서화하지는 않는다)라고 말한다. 사실 블레이크2b야.     가변 길이 항목은 그 길이를 32비트 리틀엔디안 정수로 앞에 붙인다. 버퍼 ← tagLength ∥ memoryKB ∥ 반복 버전 ∥ hashType ∥ Length(암호) ∥ 암호 ∥ Length(salt) ∥ salt(key) ∥ Key ∥ Length(관련 데이터) ∥ 관련.데이터 귀무가설 ← Blake2b(버퍼 64)1KB의 블록 //default Blake2b의 해시 크기는 64-bytesCalculate 번호를 4*parallelism kibibytes에 가장 가까운 배수로 memorySizeKB 반올림하여blockCount ← Floor(memorySizeKB, 4*parallelism)비로 편성하다 2차원 1KiB의 블록 배열(평행줄)columnCount 기둥)columnCount ←.lOckCount/병렬 처리;//In은 RFC, columnCount에q를 계산하시오 각 차선(i.e. 연속)의 첫번째와 두번째 블록(즉 칼럼 0과 1)나는 ← 0parallelism-1 각 줄에 Bi[0]← Hash(귀무가설 ∥ 0∥ 나는, 1024)1024-byte 다이제스트 Bi[1]← Hash(귀무가설 ∥ 1∥ 나는, 1024)//Generate1024-byte 다이제스트를 계산하시오 //Generate 남아 있단 말로 불린다.ing각각의 기둥 차선에 나는 parallelism-1에 j← 2columnCount-1에 만약 Argon2i, Argon2d, 또는 Argon2id(섹션 34참조하십시오)i′, j′← GetBlockIndexes(나는, j)//the GetBlockIndexes 기능)Bi[j]정의되지 않G(Bi[j-1], Bi′[j′])//the G해시funct 의존하는 각 연속적인 칼럼 //i'와 j의 지표 //for 하는 각각의 행 //for니 0←.이온is not defined Further passes when iterations > 1 for nIteration ← 2 to iterations do for i ← 0 to parallelism-1 do for each row for j ← 0 to columnCount-1 do //for each subsequent column //i' and j' indexes depend if it's Argon2i, Argon2d, or Argon2id (See section 3.4)            i′, j′ ← GetBlockIndexes(i, j)            if j == 0 then               Bi[0] = Bi[0] xor G(Bi[columnCount-1], Bi′[j′])            else              Bi[j] = Bi[j] xor G(Bi[j-1], Bi′[j′])     Compute final block C as the XOR of the last column of each row    C ← B0[columnCount-1]    for i ← 1 to parallelism-1 do       C ← C xor Bi[columnCount-1]     Compute output tag return Hash(C, tagLength) 

가변 길이 해시함수

아르곤2는 최대 2바이트32 길이의 다이제스트를 생산할 수 있는 해시함수를 사용한다. 이 해시함수는 블레이크2에 내장되어 있다.

함수 해시(메시지, digestSize) 입력: 메시지:         해시될 바이트(0..2-132) 메시지 다이제스트크기:      정수(1..232) 반환할 바이트원하는 출력: 다이제스트:          바이트(digestSize)  결과적으로 생성된 바이트인 다이제스트사이즈 바이트 길이 해시가변 길이 해시함수로 블레이크2b를 사용하여 제작되어 최대 2바이트의32 다이제스트를 생성할 수 있다. 요청된 digestSize은 64-bytes 이하 그때 우리가 직접 만약(;=64<>digestSize) 다음 메시지 바이트로 32비트 작은 메모리 digestSize //concatenate 원하는 해시도 들어 64-bytes(예를 들어 Argon2 블록에 1024바이트)에 Blake2b(digestSize∥ 메시지, digestSize)할 거라면, 우리는 두번 nee의 수를 생성하는 데 Blake2b을 사용한다 Blake2b을 사용한다.드d 64바이트 블록을 사용한 다음  블록에서 32바이트만 사용 전체 블록  계산(각 블록에서 32바이트만 사용함을 알고 있음) r ← Ceil(digestSize/32)-1; r 전체 블록 생성 초기 블록 메시지 V← Blake2b(64∥ 메시지 digestSize)에서, 나는 r에 Vi ← Blake2b(Vi-1, 64)partialBytesNeeded ← digestSize 최종(아마 부분)블록 생성한 일 ← 마친 뒤 블록 이전 블록에서 – 32*r으로 발생된다;Vr+1 ← Blake2b(Vr, partialBytesNeeded)Concatenate 첫번째 32-byt 생성됩니다.ea의 에스ch 블록 Vi (전체 블록을 차지하는 부분적인 마지막 블록은 제외) Let A는i 32바이트의 블록 Vi 리턴1 A2 ∥ A ... Arr+1 ∥ V 

참조

  1. ^ "암호 해싱 대회"
  2. ^ Jos Wetzels (2016-02-08). "Open Sesame: The Password Hashing Competition and Argon2". arXiv:1602.03097 [cs.CR].{{cite arxiv}}: CS1 maint: 작성자 매개변수 사용(링크)
  3. ^ Argon2: 암호 해싱기타 애플리케이션용 메모리 하드 기능, Alex Biryukov, et al, 2015년 10월 1일
  4. ^ https://www.rfc-editor.org/rfc/rfc9106.html Argon2 암호 해싱 및 작업 증명 애플리케이션을 위한 메모리 하드 기능, RFC 9106은 2021년 9월 9일에 접속했다.
  5. ^ a b Joël Alwen, Jeremiah Blocki (2016-08-05). "Towards Practical Attacks on Argon2i and Balloon Hashing" (PDF). {{cite journal}}: Cite 저널은 필요로 한다. journal= (도움말)CS1 maint: 작성자 매개변수 사용(링크)
  6. ^ Henry Corrigan-Gibbs, Dan Boneh, Stuart Schechter (2016-01-14). "Balloon Hashing: Provably Space-Hard Hash Functions with Data-Independent Access Patterns" (PDF). {{cite journal}}: Cite 저널은 필요로 한다. journal= (도움말)CS1 maint: 작성자 매개변수 사용(링크)
  7. ^ a b "[Cfrg] Argon2 v.1.3". www.ietf.org. Retrieved 2016-10-30.
  8. ^ Joel Alwen, Jeremiah Blocki (2016-02-19). "Efficiently Computing Data-Independent Memory-Hard Functions" (PDF). {{cite journal}}: Cite 저널은 필요로 한다. journal= (도움말)CS1 maint: 작성자 매개변수 사용(링크)

외부 링크