- 키 및 IV는 OpenSSL 팀이 자랑하지 않는 OpenSSL 특정 알고리즘을 사용하여 지정한 비밀번호에서 파생됩니다. 이전 버전과의 호환성을 위해 유지되지만 PKCS의 PBKDF2와 같은 더 나은 암호 기반 키 파생 기능을 사용하는 것이 좋습니다.
OpenSSL의 맞춤형 키 파생 알고리즘은 EVP_BytesToKey (3) 함수에 있습니다.
키:
-K key 사용할 실제 키 : 16 진수만으로 구성된 문자열로 표시되어야합니다.
IV :
암호화에서 초기화 벡터 (IV) 또는 시작 변수 (SV) [1]는 일반적으로 무작위 또는 의사 난수 여야하는 암호화 기본 요소에 대한 고정 크기 입력입니다.
IV는 파일을 암호화하는 데 사용되는 추가 입력입니다. 그것은 핵심 이 아닙니다 (단지 용어라고 생각합니다).
2 소금은 지정한 키에 대한 추가 (접두사)입니다. (참조 위키 백과 . 그것은 불가능 키에 무지개 테이블 또는 미리 계산 된 해시 테이블을 사용 할 수 있습니다. 소금은 일반적으로 암호화되지 않은 저장됩니다.
3 출력은 바이너리이며 인쇄 할 수없는 문자를 포함합니다. 터미널 에뮬레이터는 해당 바이트 값을 기본 문자 인코딩 및 서체에서 인쇄 가능한 문자로 렌더링하려고 시도하지만 "가비지 텍스트"처럼 보이며 복사 / 붙여 넣기, FTP 또는 전자 메일에 안전하지 않을 수 있습니다.
4 암호화 된 텍스트를 해독하려면 키와 IV가 필요합니다. 둘 중 하나 또는 둘 다가없고 누락 된 비밀번호가 비밀번호에서 파생 된 경우 비밀번호가있는 경우 비밀번호에서 누락 된 키 및 / 또는 IV를 다시 파생시킬 수 있습니다. 이미 소금이 있기 때문에 소금이 필요하지 않습니다. 암호화 된 텍스트의 시작 부분에 미리 추가됩니다. 솔트는 실제로 비밀이 아니며 미리 계산 된 해시 테이블과 레인보우 테이블을 호일로 만드는 방법 일뿐입니다.
5 EVP_BytesToKey (3)에 정의 된 대로 비밀번호 "1"및을 사용하는 경우 --nosalt
키의 첫 16 바이트는 다음과 같습니다.
md5( D_0 || password || salt)
(이 맥락에서 ||
논리적이지 않은 연결을 의미합니다 or
)
어느 것이
md5 ( `null` || "1" || `null`)
어느 것이
md5("1")
어느 것이
0xc4ca4238a0b923820dcc509a6f75849b
이 값은 매뉴얼 페이지가 호출하는 것 D_1
입니다.
Key와 IV의 나머지 필요한 바이트는 다음과 같이 생성됩니다.
md5( D_1 || password || salt)
어느 것이
md5( 0xC4CA4238A0B923820DCC509A6F75849B || "1" || `null` )
어느 것이
md5( 0xC4CA4238A0B923820DCC509A6F75849B31 )
(ASCII "1"은 D_1
값 끝에서 0x31로 연결됩니다. )
그것은 다음과 같이 밝혀졌습니다 :
0x7976c7161415c830816dd4068a1d9a52
그 맨 페이지가 D_2라고 부르는 것입니다.
키는 D_1
이미 입증 된 것보다 8 바이트 만 더 필요 하므로 D_2의 처음 8 바이트를 가져와 다음과 같이됩니다.
Key: C4CA4238A0B923820DCC509A6F75849B7976c7161415c830
IV에는 8 바이트 만 필요하며 D_2에서 8 개의 사용하지 않는 바이트가 있으므로 IV가됩니다.
IV: 816dd4068a1d9a52
다음은 키의 첫 16 바이트 인 D_1을 생성하는 명령 행입니다 (예 --nosalt
: 비밀번호 "1"및 ).
echo -n "1" | openssl md5
다음은 키의 나머지 8 바이트와 IV의 모든 8 바이트를 더한 D_2를 생성하는 명령 줄입니다.
echo -n "$(echo -n "1" | openssl md5 -binary)1" | md5
이것은 D_1의 출력 (ASCII 인코딩 16 진수로 변환하지 않고 2 진으로 유지)을 취하고 "1"(0x31)을 추가하고 그 결과를 가져 와서 작동합니다 md5
.