
"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
}