매번 키 파생 기능을 실행하지 않고 AES-GCM으로 많은 파일을 암호화하는 방법은 무엇입니까?

Nov 20 2020

연결된 질문 : 여러 파일을 암호화하는 AES


를 사용하면 password암호화 할 10 만 개의 파일이 있습니다. (오늘은 10 만 개 파일, 오늘은 5 만 개, 내일 10 만 개, 다음 주에는 4 만 개 파일).

  • 지금까지이 작업을 수행했습니다 (의사 코드).

    for each file:
        plaintext = file.read()
        nonce = getrandom(bytes=16)
        key = KDF_PBKDF2(password, salt=nonce, count=1000000)  # very slow for each file!
        ciphertext, tag = AES_GCM_cipher(key, nonce=nonce).encrypt(plaintext)
        write to disk:   nonce | ciphertext | tag
    

    암호화 된 파일을 해독하려면

    nonce, ciphertext, tag = file.read()
    key = KDF_PBKDF2(password, salt=nonce, count=1000000)    # very slow for each file!
    plaintext = AES_GCM_cipher(key, nonce=nonce).decrypt(ciphertext)
    

    분명히 이것은 각 파일에 대해 KDF 기능을 실행하기 때문에 최적이 아니며 느립니다!

  • 이 솔루션에 대해 생각했습니다.

    # do this ONLY ONCE for each encryption session:
    salt = getrandom(bytes=16)
    key = KDF_PBKDF2(password, salt=salt, count=1000000)   # run only once
    
    for each file:
        plaintext = file.read()
        nonce = getrandom(bytes=16)
        ciphertext, tag = AES_GCM_cipher(key, nonce=nonce).encrypt(plaintext)
        write to disk:   salt | nonce | ciphertext | tag
    

    그러나 이것은 salt각 암호화 된 파일의 시작 부분에 16 바이트 ( )를 더 추가해야한다는 단점이 있습니다 . 일반적인 관행입니까?

    그리고 무엇보다도 해독 할 때 다음과 같은 단점이 있습니다.

    for each encrypted file:
        salt, nonce, ciphertext, tag = file.read()           # since salt may be different for each file
                                                             # we have to run:
        key = KDF_PBKDF2(password, salt=salt, count=1000000) # very slow for each file!
        ...
    

    이후 salt각각의 암호화 된 파일의 시작 부분에, 우리가이 방법은 우리가 해독하려는 각 암호화 된 파일에 대한 KDF 기능을 ... 실행! 이것은 매우 느릴 것입니다.

    우리는 그것들을 캐시에 넣을 cache[salt] = key수 있습니다. 똑같은 것을 salt다시 찾으면 이미를 가지고 key있지만 이것이 우아한 솔루션인지 확실하지 않습니다.

질문 : AES-GCM을 사용하여 암호로 10 만 개의 파일 (한 번에 또는 여러 세션에서)을 암호화하는 데 사용할 체계는 무엇입니까?

답변

1 fgrieu Nov 20 2020 at 15:18

하나는 암호 기반에서 도보 거리 안 암호화에 대해 심각 KDF_PBKDF2하지만, 실행 에 Argon2 (또는 scrypt 그것은 더 쉽게 사용할 수있는 경우)! 비트 코인 채굴은 (2020 년) 높은 속도 (220 TH / s)와 효율성 (15 pJ / H)으로 SHA-256을 수행하는 전용 ASIC가 수천 달러에 상업적으로 이용 가능함을 보여주었습니다. 이로 인해 보안 수준이 높은 애플리케이션에서 사용자가 선택한 암호를 확장하기 위해 표준 하드웨어에서 실행되는 PBKDF2-HMAC에 의존 할 수 없습니다.

제안 된 방법은 한 가지 특성을 가지고 있습니다. salt여러 파일이 salt함께 암호화 된 경우에만 광범위 무작위에 대해 공통 입니다. 이것은 원치 않는 정보 유출 일 수 있으며 언급 된 단점을 해결하는 방법입니다. 암호 해독에 사용되는 암호 확장 코드는 ( saltkey) 쌍 의 RAM 캐시를 유지할 수 있습니다 .

RNG가 끊기는 경우 안심할 수 있도록 AES-GCM을 AES-GCM-SIV로 교체 하는 것이 좋지만 데이터에 대해 두 번의 패스가 필요하다는 점을 명심하십시오.

마지막 바이트가 중요 할 때 (예 : 데이터가 바코드에 있거나 느리거나 배터리가 많이 소모되는 통신 매체를 통과하는 경우) 마지막 바이트를 잘라내는 것을 옹호 하는만큼, 우리와 같이 파일 암호화를 저장 salt하고 nonce크기를 조정하는 것은 권장하지 않습니다. 1980 년대입니다.