CRYPT(3)

명칭
crypt - 트랩 문 암호화

프로그램 라이브러리
libcrypt

서식
<unistd.h> char * crypt(const char *key, const char *salt) const char * crypt_get_format(void) int crypt_set_format(const char *string)

해설
crypt() 함수는, 패스워드의 해시화를 행해, 키 검색의 시도를 단념하게 하기 위한 코드를 부가합니다. 해시화에는 다른 알고리즘을 사용할 수가 있습니다. 현재 포함되는 알고리즘은, NBS Data Encryption Standard (DES), MD5, Blowfish 입니다. DES (이)나 Blowfish 하지만 인스톨 되고 있는지 어떤지, 또, 디폴트를 변경하기 위해서 crypt_set_format() 하지만 벌써 불려 가고 있는지 어떤지에 의해, 사용되는 알고리즘은 salt (모듈화 암호 포맷 (Modular Crypt Format (MCF))에 따릅니다) 의 포맷에 의존합니다.

crypt 의 최초의 인수는 해시화를 위한 데이터 (통상은 패스워드입니다)로, 눌 캐릭터로 종료하는 캐릭터 라인입니다. 2 번째의 인수는 salt 로, 다음의 3 개 중 몇개의 형식입니다.

Extended
    언더 스코아 (“_”) 그리고 시작되는 경우, 열쇠의 해석도 salt 의 해석도 함께, 다음에 개요를 설명한다 DES 확장 형식을 사용합니다.
Modular
    캐릭터 라인 “$digit$” 그리고 시작되는 경우, 다음에 개요를 설명한다 모듈화 암호 포맷 (MCF)을 사용합니다.
Traditional
    위의 어느 것에도 해당하지 않는 경우, 전통적인 포맷 (Traditional Format) (을)를 상정해, 캐릭터 라인 전체 (또는 최초의 부분)를 salt 로서 사용합니다.

어느 routine도 계산에 시간이 걸리는 설계가 되어 있습니다. Pentium 166/MMX 로 간단한 테스트를 하면(자), DES 암호화에서는, 1 CPU 초 당 암호화를 약 2640 회 행해, MD5 암호화에서는, 1 CPU 초 당 암호화를 약 62 회 행했습니다.

  DES 확장 형식:

건 key (은)는 8 캐릭터로부터 되는 그룹에 분할됩니다 (마지막 그룹에는 널 바이트가 채울 수 있습니다). 각 캐릭터의 하위 7 비트 (그룹 마다 56 비트)가, 다음에 설명하도록(듯이) 해, DES 키를 만들기 위해서(때문에) 이용됩니다. 최초의 그룹의 56 비트는, DES 열쇠의 초기치입니다. 그 후의 그룹 마다, 현재의 DES 열쇠 그것 자신과 그 그룹의 비트를 XOR 하는 것으로 암호화해, 다음의 DES 열쇠로 합니다.

salt 는 9 캐릭터의 배열이며, 언더 스코아의 뒤로 4 바이트의 반복 회수와 4 바이트의 salt 로부터 됩니다. 이것들은 인자 가능 캐릭터로 encode 됩니다. 6 비트 마다 1 캐릭터를 대응시켜, 최하정도 캐릭터를 최초로 해, encode 됩니다. 0 에서 63 까지의 값은 ``. /0-9A-Za-z''로서 encode 됩니다. 이것에 의해 count (와)과 salt 의 각각 24 비트를 사용할 수가 있습니다.

salt 하 DES 알고리즘에 대해, 16777216 방법 또는 4096 방법 (즉, 24 비트 또는 12 비트) 안의 1 방법이라고 하는 불규칙성을 도입합니다 ( salt 의 비트 i 하지만 설정되어 있는 경우, DES E-Box 출력중의 비트 i (와)과 비트 i+24 (이)가 교환됩니다) .

DES 열쇠를 사용해, 64비트의 정수에 count 회 DES 를 반복해 적용해 암호화합니다. 돌려주어지는 값은, 눌 캐릭터로 종료한다 캐릭터 라인으로, 길이는 20 바이트 또는 13 바이트 (에 눌 캐릭터가 더해집니다)로, salt 의 후에, encode 된 64 비트의 암호화를 계속된 것으로 구성됩니다.

  모듈화 암호:

salt 가 캐릭터 라인 $digit$ (으)로부터 시작되는 경우는, 모듈화 암호 포맷 (MCF)이 사용됩니다. digit (은)는 암호화 시에 어느 알고리즘이 사용되는지를 나타냅니다. 그 뒤의 토큰이 실제의 salt 로서 암호화에 이용됩니다. salt 의 길이는 16 캐릭터에 제한되고 있습니다. 이것은, 돌려주는 출력의 길이도 _PASSWORD_LEN 로 제한되고 있기 때문입니다. salt 는 눌 캐릭터나 달러 기호를 말미에 둘 필요가 있습니다. 달러 기호의 뒤의 캐릭터는 어째서 저것 무시됩니다.

현재 서포트하는 알고리즘은,

1.  MD5
2.  Blowfish

이외의 암호화 포맷은 용이하게 추가할 수 있습니다. salt 의 예로서 다음의 것이 있습니다.

$3$thesalt$rest

  Traditional 암호화:

사용되는 알고리즘은, crypt_set_format() 하지만 벌써 불려 가고 있는지 아닌지, 글로벌 디폴트 포맷이 벌써 지정되어 있는지 아닌지에 의존합니다. 글로벌 디폴트가 미리 지정되어 있는지, crypt_set_format() 그리고 무엇인가 다른 포맷을 설정되어 있는지, 그 어느 쪽도 아닌 경우, 편입의 디폴트 포맷이 사용됩니다. 현재로서는, 이것은, DES 를 사용할 수 있다면 DES 에, 그렇지 않으면 MD5 가 됩니다.

salt 를 어떻게 이용할까는 해시화의 알고리즘에 의존합니다. 최고의 결과를 얻기 위해서(때문에), 적어도 2 캐릭터의 salt 를 지정해 주세요.

crypt_get_format() 함수는 현재 사용하고 있는 알고리즘을 나타내는 정수 캐릭터 라인을 돌려줍니다. 유효한 값은, ‘des’, ‘blf’, ‘md5’ 입니다.

crypt_set_format() 함수는 지정한다 string 에 따라, 디폴트 encode 포맷을 설정합니다.

글로벌 디폴트 포맷은, /etc/auth.conf 파일로, crypt_default 속성을 사용해 설정할 수가 있습니다.

반환값
crypt() (은)는, 처리가 성공했을 경우, 암호화된 값을 가리키는 포인터를 돌려줍니다. 처리가 실패했을 경우, NULL 를 돌려줍니다. 주의: 이것은 통상의 거동이 아닙니다. AT&T 의 crypt() (은)는 항상 캐릭터 라인을 가리키는 포인터를 돌려줍니다.

crypt_set_format() (은)는, 주어진 encode 포맷이 정당하면, 1 을 돌려줍니다. 그 이외의 경우, 값 0 이 돌려주어집니다.

관련 항목
login(1), passwd(1), auth_getval(3), cipher(3), getpass(3), auth.conf(5), passwd(5)

버그
crypt() 함수는 정적 데이터에의 포인터를 돌려줍니다. 그리고, 이후의 crypt() 의 호출은 같은 데이터를 변경합니다. crypt_set_format() 도 이와 같이 정적 데이터를 변경합니다.

역사
로터를 채용했다 crypt() 함수는, AT&T UNIX 그리고 등장했습니다. 현재의 스타일의 crypt() (은)는, AT&T UNIX 그리고 처음 등장했습니다.

DES 섹션의 코드 (FreeSec 1.0)는, 아메리카 합중국만으로 사용할 수 있다 NetBSD libcrypt 암호화 프로그램 라이브러리에 대해서, 그러한 장해가 없는 치환으로서 아메리카 합중국의 밖에서 개발되었습니다.

저자
-nosplit 원래는 David Burren <davidb@werj.com.au> 에 의해 쓰여졌습니다. 그 후의 추가, 갱신은, Poul-Henning Kamp, Mark R V Murray, Kris Kennaway, Brian Feldman, Paul Herman Niels Provos 에 의해 행해졌습니다.