IV를 표시하지 않을 때 암호화된 파일에 IV가 어떻게 포함되어 있습니까?

IV를 표시하지 않을 때 암호화된 파일에 IV가 어떻게 포함되어 있습니까?

"abcd"가 포함된 파일을 "1234" 키로 암호화한다고 가정합니다.

openssl enc -iv BABA -aes128 -in file.txt -out file.enc -p

나는 얻다:

salt=1B929D9049534D22
key=0326A1E8F4875B26FE2D04E02425C5AD
iv =BABA0000000000000000000000000000

여태까지는 그런대로 잘됐다.

다음을 사용하여 파일의 암호를 해독할 수 있습니다.

openssl enc -d -aes128 -iv BABA -in file1.enc -out file1.dec.txt -p

그리고 분명히 이전과 동일한 소금, 키 및 IV를 얻습니다.

첫 번째 질문은 "0326A1E8F4875B26FE2D04E02425C5AD"가 "키"라는 의미입니다.

내 키 "1234"와 어떤 관계가 있나요? (md5 해시처럼 보입니다. 그런데... 무엇입니까?)

계속하자. 이제 iv를 제공하지 않고 동일한 작업(동일한 일반 텍스트, 동일한 키)을 수행합니다.

openssl enc -aes128 -in file.txt -out file2.enc -p

나는 얻다:

salt=237F07334625A768
key=F746D2B53EB82F7129BAEB2FCE2C310F
iv =BA28DBA00442BD4BACEBCAE7C01BA412

이제 다음을 사용하여 암호를 해독합니다.

openssl enc -d -aes128 -in file2.enc -out file2.dec.txt -p

그리고 나는 iv를 제공하지 않고도 같은 결과를 얻습니다!

salt=237F07334625A768
key=F746D2B53EB82F7129BAEB2FCE2C310F
iv =BA28DBA00442BD4BACEBCAE7C01BA412

이제 암호화된 파일에서 솔트를 볼 수 있고 프로그램에 키를 제공하지만 iv를 입력하지도 않고 암호화된 파일에서 iv를 볼 수도 없습니다.

따라서 두 번째 질문은 다음과 같습니다. 해독 프로그램은 파일을 해독하는 데 필요한 iv를 어떻게 알 수 있습니까? 또는 다르게 말하면 iv가 암호화된 파일(솔트와 같은)에 포함되어 있는 경우 어떻게 수행됩니까?

답변1

키와 IV는 모두 PBKDF를 사용하여 비밀번호에서 계산됩니다. OpenSSL의 경우 사용되는 방법은 EVP_BytesToKey. 이는 반복을 많이 사용하지 않는 PBKDF1과 유사한 기능입니다. 솔트는 PBKDF의 입력 매개변수입니다. 동일한 비밀번호를 사용하더라도 키와 IV가 항상 다른지 확인합니다.

소스코드를 보면 알 수 있다여기키와 IV 파생이 어떻게 발생하는지 알아보기 위해( EVP_BytesToKey자세하게 설명되지는 않았으나 OpenSSL 내의 독점 메커니즘입니다).

기본적으로 암호화 중에는 다음이 수행됩니다.

openssl_encrypt(password: string, plaintext: bytes): bytes
{
    salt:bytes = random(8) # 8 bytes = 64 bits
    iterations:int = 1
    key:bytes, iv:bytes = pbkdf(password, iterations, salt)
    ciphertext:bytes = encrypt_aes_cbc_pkcs7padding(key, iv, plaintext)
    encoded_ciphertext:bytes = "Salted__" | salt | ciphertext
    return encoded_ciphertext
}

이것이 해독입니다.

openssl_decrypt(password:string, encoded_ciphertext:bytes)
{
    salt:bytes = take(encoded_ciphertext, from: 8, size: 8) # 8 bytes = 64 bits
    ciphertext:bytes = take(encoded_ciphertext, from: 16, size: sizeof(encoded_ciphertext - 16)
    iterations:int = 1
    key:bytes, iv:bytes = pbkdf(password, iterations, salt)
    plaintext:bytes = decrypt_aes_cbc_pkcs7padding(key, iv, ciphertext)
    return plaintext
}

관련 정보