OpenSSL aes-128-cfb가 예상 크기를 생성하지 않습니다.
학습을 위해 aes-128-cfb를 직접 구현하려고합니다 . 내 구현이 올바른지 확인하기 위해 OpenSSL과 같은 잘 알려진 라이브러리로 확인하고 싶습니다. 그러나 OpenSSL을 사용하여 암호화하려고 할 때 이상한 점을 발견했습니다.
cleartext.txt
다음 내용의 파일 이 있습니다.
This is cleartext that will be used to encrypt with OpenSSL.
그런 다음이 명령을 실행합니다.
openssl enc -aes-128-cfb -in cleartext.txt -K 48656c6c6f20576f726c642041455321 -iv 72616e646f6d20313662797465206976 -out output.txt
이상한 점은 출력 파일에 60 바이트 만 포함되어 있다는 것입니다. AES 블록은 16 바이트입니다. 예상 출력 크기 (바이트)는 16의 배수 여야합니다. 60은 16의 배수가 아닙니다.
여기서 중요한 걸 놓쳤나요?
답변
CFB는 CTR 및 OFB 작동 모드와 유사한 패딩이 필요하지 않기 때문입니다. 이 모드는 암호 블록을 생성하고 암호 블록에서 필요한 양을 사용합니다.
openssl enc -K -iv
IV 의 경우 출력 파일에 기록되지 않습니다output.txt
. 따라서 일반 텍스트와 크기 (바이트)가 같습니다.61
내 파일에 대해 각각 바이트. 이 경우 IV를 처리해야합니다. IV도 제공하고 있으므로 다시 사용하지 않도록하십시오. 그렇지 않으면 CTR 모드 또는 OTP의 키 재사용에서 침대 끌기가 발생할 수 있습니다.의 경우
-k/-kfile/-pass
, The IV와 Key는 사용자의 비밀번호와 8 바이트 랜덤 솔트를 사용하여 키 유도 방법에서 파생됩니다.OpenSSL은 먼저 8 바이트 솔트 의 파일 매직 을 쓴
Salted__
다음 암호 텍스트를 파일에 씁니다 . 이제 출력 크기는magic size + salt size + data-size
. 내 시스템에서8+8+61 = 77
바이트.ECB 모드를 사용하는 경우
openssl enc -aes-128-ecb -in cleartext.txt -k -pass -out output.txt
그러면 크기는
80
패딩으로 인해 바이트입니다. 물론 ECB는 IV를 사용하지 않으므로이 모드를 잊어야합니다!CBC 모드는 ECB와 비슷한 결과를 나타냅니다.
파생 된 IV 크기는 8 바이트 블록 암호 TDES와 같은 사용 된 암호화 알고리즘에 따라 변경 될 수 있으며 Blowfish는 AES와 같은 8 바이트 IV 및 16 바이트 블록 암호가 필요하며 Twofish에는 16 바이트 IV가 필요합니다.
암호를 사용할 때 암호의 엔트로피와 사용 된 키 파생 방법에주의 할 수 있습니다. Diceware 암호를 사용하는 것이 좋으며 키 파생을 위해 최소한 PBKDF2를 사용하는 것이 좋습니다. OpenSSL은 다양한 키 파생 방법을 제공합니다.