161111Sbostic.\" Copyright (c) 1989, 1991, 1993 261111Sbostic.\" The Regents of the University of California. All rights reserved. 320293Smckusick.\" 448352Scael.\" %sccs.include.redist.man% 547038Sbostic.\" 6*65099Smckusick.\" @(#)crypt.3 8.2 (Berkeley) 12/11/93 747038Sbostic.\" 848352Scael.Dd 948352Scael.Dt CRYPT 3 1048352Scael.Os 1148352Scael.Sh NAME 1248352Scael.Nm crypt , 1348352Scael.Nm setkey , 1448352Scael.Nm encrypt , 1548352Scael.Nm des_setkey , 1648352Scael.Nm des_cipher 1748352Scael.Nd DES encryption 1848352Scael.Sh SYNOPSIS 1948352Scael.Ft char 2048352Scael.Fn *crypt "const char *key" "const char *setting" 2149803Sbostic.Ft int 2248352Scael.Fn setkey "char *key" 2349803Sbostic.Ft int 2448352Scael.Fn encrypt "char *block" "int flag" 2549803Sbostic.Ft int 2648352Scael.Fn des_setkey "const char *key" 2749803Sbostic.Ft int 2848486Sbostic.Fn des_cipher "const char *in" "char *out" "long salt" "int count" 2948352Scael.Sh DESCRIPTION 3048352ScaelThe 3148352Scael.Xr crypt 3248352Scaelfunction 3348352Scaelperforms password encryption. 3448352ScaelIt is derived from the 3548352Scael.Tn NBS 3648352ScaelData Encryption Standard. 3748352ScaelAdditional code has been added to deter 3848352Scaelkey search attempts. 3948352ScaelThe first argument to 4048352Scael.Nm crypt 4148352Scaelis 4248352Scaela 4348352Scael.Dv NUL Ns -terminated 4448486Sbosticstring (normally a password typed by a user). 4547038SbosticThe second is a character array, 9 bytes in length, consisting of an 4647038Sbosticunderscore (``_'') followed by 4 bytes of iteration count and 4 bytes 4747038Sbosticof salt. 4847038SbosticBoth the iteration 4948352Scael.Fa count 5047038Sbosticand the 5148352Scael.Fa salt 5249832Sbosticare encoded with 6 bits per character, least significant bits first. 5347038SbosticThe values 0 to 63 are encoded by the characters ``./0-9A-Za-z'', 5447038Sbosticrespectively. 5549832Sbostic.Pp 5620293SmckusickThe 5748352Scael.Fa salt 5848352Scaelis used to induce disorder in to the 5948352Scael.Tn DES 6048352Scaelalgorithm 6148352Scaelin one of 16777216 6248352Scaelpossible ways 6347038Sbostic(specifically, if bit 6449832Sbostic.Em i 6547038Sbosticof the 6648352Scael.Ar salt 6747038Sbosticis set then bits 6849832Sbostic.Em i 6947038Sbosticand 7049832Sbostic.Em i+24 7148352Scaelare swapped in the 7248352Scael.Tn DES 7348352Scael``E'' box output). 7449832SbosticThe 7548352Scael.Ar key 7649832Sbosticis divided into groups of 8 characters (a short final group is null-padded) 77*65099Smckusickand the low-order 7 bits of each character (56 bits per group) are 7849832Sbosticused to form the DES key as follows: the first group of 56 bits becomes the 7949832Sbosticinitial DES key. 8049832SbosticFor each additional group, the XOR of the group bits and the encryption of 8149832Sbosticthe DES key with itself becomes the next DES key. 8249832SbosticThen the final DES key is used to perform 8348352Scael.Ar count 8447038Sbosticcumulative encryptions of a 64-bit constant. 8549832SbosticThe value returned is a 8649832Sbostic.Dv NUL Ns -terminated 8749832Sbosticstring, 20 bytes in length, consisting 8847038Sbosticof the 8948352Scael.Ar setting 9047038Sbosticfollowed by the encoded 64-bit encryption. 9148352Scael.Pp 9247038SbosticFor compatibility with historical versions of 9348352Scael.Xr crypt 3 , 9447038Sbosticthe 9548352Scael.Ar setting 9647038Sbosticmay consist of 2 bytes of salt, encoded as above, in which case an 9747038Sbosticiteration 9848352Scael.Ar count 9948352Scaelof 25 is used, fewer perturbations of 10048352Scael.Tn DES 10148352Scaelare available, at most 8 10247038Sbosticcharacters of 10348352Scael.Ar key 10449832Sbosticare used, and the returned value is a 10549832Sbostic.Dv NUL Ns -terminated 10649832Sbosticstring 13 bytes in length. 10748352Scael.Pp 10848352ScaelThe 10948352Scaelfunctions, 11048352Scael.Fn encrypt , 11148352Scael.Fn setkey , 11248352Scael.Fn des_setkey 11348352Scaeland 11448352Scael.Fn des_cipher 11548352Scaelallow limited access to the 11648352Scael.Tn DES 11748352Scaelalgorithm itself. 11848352ScaelThe 11948352Scael.Ar key 12048352Scaelargument to 12148352Scael.Fn setkey 12248352Scaelis a 64 character array of 12349832Sbosticbinary values (numeric 0 or 1). 12449832SbosticA 56-bit key is derived from this array by dividing the array 12547038Sbosticinto groups of 8 and ignoring the last bit in each group. 12648352Scael.Pp 12748352ScaelThe 12848352Scael.Fn encrypt 12948352Scaelargument 13048352Scael.Fa block 13148352Scaelis also a 64 character array of 13248352Scaelbinary values. 13348352ScaelIf the value of 13448352Scael.Fa flag 13548352Scaelis 0, 13648352Scaelthe argument 13748352Scael.Fa block 138*65099Smckusickis encrypted, otherwise it 139*65099Smckusickis decrypted. 140*65099SmckusickThe encryption or decryption is returned in the original 14148352Scaelarray 14248352Scael.Fa block 14348352Scaelafter using the 14448352Scaelkey specified 14548352Scaelby 14648352Scael.Fn setkey 14748352Scaelto process it. 14848352Scael.Pp 14948352ScaelThe 15048352Scael.Fn des_setkey 15147038Sbosticand 15248352Scael.Fn des_cipher 15348352Scaelfunctions are faster but less portable than 15448352Scael.Fn setkey 15547038Sbosticand 15648352Scael.Fn encrypt . 15747038SbosticThe argument to 15848352Scael.Fn des_setkey 15947038Sbosticis a character array of length 8. 16029774SmckusickThe 16148352Scael.Em least 16247038Sbosticsignificant bit in each character is ignored and the next 7 bits of each 16347038Sbosticcharacter are concatenated to yield a 56-bit key. 16448352ScaelThe function 16548352Scael.Fn des_cipher 166*65099Smckusickencrypts (or decrypts if 167*65099Smckusick.Fa count 168*65099Smckusickis negative) the 64-bits stored in the 8 characters at 16948352Scael.Fa in 17047038Sbosticusing 17148352Scael.Xr abs 3 17248352Scaelof 17348352Scael.Fa count 17448352Scaeliterations of 17548352Scael.Tn DES 17648352Scaeland stores the 64-bit result in the 8 characters at 17748352Scael.Fa out . 17847038SbosticThe 17948352Scael.Fa salt 18048352Scaelspecifies perturbations to 18148352Scael.Tn DES 18248352Scaelas described above. 18349803Sbostic.Pp 18449803SbosticThe function 18549803Sbostic.Fn crypt 18649803Sbosticreturns a pointer to the encrypted value on success and NULL on failure. 18749803SbosticThe functions 18849803Sbostic.Fn setkey , 18949803Sbostic.Fn encrypt , 19049803Sbostic.Fn des_setkey , 19149803Sbosticand 19249803Sbostic.Fn des_cipher 19349803Sbosticreturn 0 on success and 1 on failure. 19449803SbosticHistorically, the functions 19549803Sbostic.Fn setkey 19649803Sbosticand 19749803Sbostic.Fn encrypt 19849803Sbosticdid not return any value. 19949803SbosticThey have been provided return values primarily to distinguish 20049803Sbosticimplementations where hardware support is provided but not 20149803Sbosticavailable or where the DES encryption is not available due to the 20249803Sbosticusual political silliness. 20348352Scael.Sh SEE ALSO 20448352Scael.Xr login 1 , 20548352Scael.Xr passwd 1 , 20648352Scael.Xr getpass 3 , 20748352Scael.Xr passwd 5 20848486Sbostic.sp 20948352Scael.Rs 21048352Scael.%T "Mathematical Cryptology for Computer Scientists and Mathematicians" 21148352Scael.%A Wayne Patterson 21248352Scael.%D 1987 21348352Scael.%N ISBN 0-8476-7438-X 21448352Scael.Re 21548352Scael.Rs 21648352Scael.%T "Password Security: A Case History" 21748352Scael.%A R. Morris 21848352Scael.%A Ken Thompson 21948352Scael.%J "Communications of the ACM" 22048352Scael.%V vol. 22 22148352Scael.%P pp. 594-597 22248352Scael.%D Nov. 1979 22348352Scael.Re 22448352Scael.Rs 22548352Scael.%T "DES will be Totally Insecure within Ten Years" 22648352Scael.%A M.E. Hellman 22748352Scael.%J "IEEE Spectrum" 22848352Scael.%V vol. 16 22948352Scael.%P pp. 32-39 23048352Scael.%D July 1979 23148352Scael.Re 23248352Scael.Sh HISTORY 23349224SbosticA rotor-based 23448352Scael.Fn crypt 23548352Scaelfunction appeared in 23648352Scael.At v6 . 23749224SbosticThe current style 23849224Sbostic.Fn crypt 23949224Sbosticfirst appeared in 24049224Sbostic.At v7 . 24148352Scael.Sh BUGS 24247038SbosticDropping the 24348352Scael.Em least 24447038Sbosticsignificant bit in each character of the argument to 24548352Scael.Fn des_setkey 24647038Sbosticis ridiculous. 24748352Scael.Pp 24848352ScaelThe 24948352Scael.Fn crypt 25048352Scaelfunction leaves its result in an internal static object and returns 25149803Sbostica pointer to that object. 25249803SbosticSubsequent calls to 25348352Scael.Fn crypt 25448352Scaelwill modify the same object. 255