Patent Publication Number: US-5835597-A

Title: Software-efficient pseudorandom function and the use thereof for decryption

Description:
This is a divisional of application Ser. No. 08/478,176 filed on Jun. 7, 1995, now U.S. Pat. No. 5,675,652, which application was a continuation of prior Ser. No. 08/163,054, filed Dec. 6, 1993, now U.S. Pat. No. 5,454,039 
    
    
     TECHNICAL FIELD 
     The present invention relates generally to methods for data encryption and more particularly to software-optimized encryption techniques that exhibit high speed and computational efficiency on conventional processor platforms. 
     BACKGROUND OF THE INVENTION 
     Cryptographic systems are widely used to insure the privacy and authenticity of messages communicated over insecure channels. In many applications, it is necessary that encryption be performed at high data rates, a requirement usually achieved, if at all, with the help of supporting cryptographic hardware. Such hardware, however, is not available on most conventional computer systems. Moreover, even when cryptographic hardware is available, it has been found that an algorithm designed to run well in hardware does not perform in software as well as an algorithm optimized for software execution. The hardware-efficient algorithm of the Data Encryption Standard (DES) is no exception. 
     Prior attempts to design encryption methods for efficient implementation in software are known in the prior art. Several of these functions are described in U.S. Pat. No. 5,003,597 and in the article entitled &#34;Fast Software Encryption Functions&#34;, R. Merkle, Advances in Cryptology, CRYPTO &#39;90 Proceedings, Springer-Verlag. In general, the Merkle technique constructs a fixed length or &#34;block&#34; cipher by operating upon a data input having two halves: a left half and a right half. The left half is used as an index to access a table of pseudorandom numbers to thereby retrieve a table value. That value is then exclusively ORed (XOR) with the right half of the data input and the result relabeled as the left half. The original left half is then rotated by a predetermined amount and relabeled as the right half. The iterative process is then continued in this fashion until the data input is fully randomized. To achieve high speed, in one embodiment the table of pseudorandom numbers is precomputed. 
     The Merkle technique and other known software-oriented block ciphers provide advantages over prior art hardware-based encryption techniques. Nevertheless, there remains a need to provide improved software-efficient encryption techniques that exhibit high speed and computational efficiency on conventional processor platforms. 
     BRIEF SUMMARY OF THE INVENTION 
     It is an object of the present invention to provide a software-efficient pseudorandom function for mapping an index and a key to a pseudorandom sequence of bits. The index is short (e.g., 32-bits) while the output bit sequence is potentially very long. The pseudorandom bit string is useful for constructing a stream cipher. 
     The pseudorandom function is a cryptographic &#34;object&#34; that preferably maps the index &#34;n&#34; and an encryption key to an pseudorandom bit sequence. The method begins by preprocessing the encryption key into a table of pseudorandom values. The index and a set of values from the table is then used to generate initial values for a plurality of registers. Using a predetermined mixing function, the initial values of some of the registers are then modified in part by taking a current value of a register and replacing the current value with a function of the current value and a value retrieved from the table, the latter value being determined by portions of one or more other registers. After modifying the registers in this fashion, their resulting values are masked using other pseudorandom values derived from the table and a predetermined masking function. The masked register values are then concatenated into the pseudorandom bit string to complete an iteration. Subsequent iterations are performed to grow the pseudorandom bit string to a desired length. 
     The stream generated in this fashion is a pseudorandom sequence of bits that is useful by way of example for encrypting a plaintext &#34;string&#34; relative to a particular &#34;position&#34;. The length of the pseudorandom bit string is as many bits as the plaintext string is long. Thus, the inventive encryption method is uniquely adapted for use in various types of software cryptography. For example, where the application involves encrypting messages over an insecure communications channel, the &#34;string&#34; is a particular message and the &#34;position&#34; is a sequence number identifying the message&#39;s position in a data stream. In this application, the encryption key is a key which protects the communication session. In yet another application, disk encryption, the &#34;string&#34; represents a particular sector of data to be written to or read from a disk, and the &#34;position&#34; is an index identifying the position of the sector on the mass storage device. In the disk encryption application, the key used to generate the table is preferably derived from a password entered by a user. Typically, in each application the particular &#34;string&#34; involved is encrypted by XOR-ing the string and the pseudorandom bit stream which is output by the pseudorandom function of the invention. 
     The foregoing has outlined some of the more pertinent objects of the present invention. These objects should be construed to be merely illustrative of some of the more prominent features and applications of the invention. Many other beneficial results can be attained by applying the disclosed invention in a different manner or modifying the invention as will be described. Accordingly, other objects and a fuller understanding of the invention may be had by referring to the following Detailed Description of the preferred embodiment. 
    
    
     BRIEF DESCRIPTION OF THE DRAWINGS 
     For a more complete understanding of the present invention and the advantages thereof, reference should be made to the following Detailed Description taken in connection with the accompanying drawings in which: 
     FIG. 1 is a process flow representation of a portion of the inventive pseudorandom function for mapping a 32-bit index &#34;n&#34; to a pseudorandom L-bit string SEAL a  (n) under the control of a set of tables T, R and S generated from a key &#34;a&#34;; 
     FIG. 2 describes the Initialize process of FIG. 1; 
     FIG. 3 describes the preferred embodiment of the pseudorandom function for generating the pseudorandom bit string SEAL a  (n); 
     FIG. 4 illustrates a computer comprising a system unit, a keyboard, a mouse and a display, for use in implementing the pseudorandom function and for using this function for encryption; 
     FIG. 5 is an architectural block diagram of the computer illustrated in FIG. 4; 
     FIG. 6 illustrates a pair of processes A&#39; and B&#39; communicating over an insecure communication link with messages encrypted by the pseudorandom function of the invention; 
     FIG. 7 illustrates a portion of the computer of FIG. 5 showing the pseudorandom function supported in the device driver to facilitate disk encryption; and 
     FIG. 8 illustrates a portion of the computer of FIG. 5 showing the pseudorandom function supported in the file system to facilitate both local and remote file encryption. 
    
    
     DETAILED DESCRIPTION 
     The inventive pseudorandom function is optimized to perform efficiently in software and is preferably implemented on a 32-bit processor of conventional design. Such processors, e.g., include the Intel 386™, Intel 486™ and the Pentium™ Processor, as well as 32-bit Reduced Instruction Set Computer (RISC) processors. While these execution vehicles are preferred, the invention in the preferred embodiment detailed below is appropriate to any byte-addressable general purpose 32-bit processor. 
     For convenience, the following notation is used herein. A 32-bit string is a &#34;word&#34; and an 8-bit string is a &#34;byte&#34;. The empty string is denoted λ. The bits of a length-t string are numbered x 0  x 1  . . . x t-1 . Numbers in hexadecimal are written by preceding them with &#34;0x&#34; and then using the symbols &#34;a&#34;-&#34;f&#34; to represent decimal 10-15, respectively. By y&gt;&gt;&gt;t, a right circular shift of the word y by t bits is denoted; in other words, the bit i of y&gt;&gt;&gt;t is y.sub.(i-t)mod32. The symbols &#34;Λ&#34; &#34;V&#34; and &#34;⊕&#34; denote bitwise AND, OR and XOR functions. The expression A+B denotes the sum, ignoring carry, of unsigned words A and B; this is the sum mod32 of words A and B. The symbol &#34;||&#34; denotes the concatenation operator. The symbol odd(.) means the predicate which is true if and only if its argument is an odd number. The designation A i! means the i-th entry of the array A. Further, if x is a real number, then .left brkt-top.x.right brkt-top. denotes the smallest integer greater than or equal to x, and .left brkt-bot.x.right brkt-bot. denotes the largest integer less than or equal to x. 
     Several variables used in the following description are referred to as &#34;registers.&#34; A &#34;register&#34; as used herein may or may not correspond to a physical register associated with the processor. It is a construct that can be said to have a particular &#34;value.&#34; Some registers (n 1 , n 2 , n 3 , n 4 ) are initialized and retain their values for many steps of the algorithm. Other registers (A, B, C, D) have values which can change more frequently. Every register has a &#34;current value&#34; at a particular instant of time. As will be seen, according to one aspect of the inventive method, a &#34;current value&#34; of a register is typically modified by replacing the current value with a function of the current value and a value derived from a table of pseudorandom number values. 
     With particular reference now to FIG. 1, a process flow diagram is shown detailing a method for mapping a 32-bit index &#34;n&#34; to an L-bit string y=SEAL a  (n) under the control of a set of tables T, R and S generated from a key &#34;a.&#34; The method begins by preprocessing the key &#34;a&#34; into preferably three (3) tables T, R and S. This step is effected using a Make Table procedure 10 which receives as an input the key &#34;a.&#34; In this particular example, the key is a 160-bit string that, in conjunction with a function G described below, is used to define the three tables. While the use of three tables is preferred, it should be appreciated that the three tables can be thought of as merely one table or array with three different parts. The description of three (3) distinct tables is thus merely exemplary and should not be taken by way of limitation as other table groupings or structures are useful as well to implement the present invention. 
     The pseudorandom values in the tables are specified using any one or more algorithms known in the art. The particular algorithm used is not critical to the present invention and it is envisioned that any secure pseudorandom generator is useful for this purpose. The pseudorandom generator thus may be derived from a secure hash algorithm, a block cipher, a stream cipher, and so on. For example, the algorithm used to generate the tables could be based on DES, MD5, the Secure Hash Algorithm (SHA) or even a combination of any of the above. According to the illustrative embodiment, the function G is described in National Institute of Standards, &#34;Digital Signature Standard,&#34; Federal Information Processing Standards Publication XX Draft--February 1993, which is incorporated herein by reference. The function G is based on the Secure Hash Algorithm (SHA) described in National Institute of Standards, &#34;Secure Hash Standard,&#34; Federal Information Processing Standards Publication 180, which is also incorporated herein by reference. Details of SHA and the particular function G can be obtained from these references (with the notation G a  (i) used in place of the notation G(a,i) in the references). 
     With the key &#34;a&#34; being a 160-bit string and i being an integer, 0≦i&lt;2 32 , G a  (i) is a 160-bit value. To construct the tables, G is re-indexed by the Make Table procedure 10 to construct a function whose images are 32-bit words instead of 160-bit ones. The function Γ is defined by Γ a  (i)=H i  imod5 where H i   0  H i   1  H i   2  H i   3  H i   4  =G a  (.left brkt-bot.i/5.right brkt-bot.). Thus a table of Γ-values is a table for G-values read left-to-right, top-to-bottom. The Make Tables procedure 10 then preferably defines the tables as follows: 
     T i!=Γ a  (i) for all 0≦i&lt;512; 
     S j!=Γa.sub.(1×1000+j) for all 0≦j&lt;256; and 
     R k!=Γ ra  (0×2000+k) for all 0≦k&lt;4.left brkt-top.(L-1)/8192.right brkt-top.. 
     Thus table T has 512 word entries, with each entry being 32-bits in length. The entries of tables S and R are also 32-bit words. Table S has 256 entries and table R has a variable length. 
     Referring back to FIG. 1, the tables T and R are used by an Initialize procedure 12, which also receives as inputs the index &#34;n&#34; and a length control variable &#34;1&#34;. The variable &#34;1&#34; is initially set to &#34;0&#34; and its upper limit will depend on the ultimate desired length of the output stream. The Initialize procedure 12 generates a set of initial values for the registers (A, B, C, D, n 1 , n 2 , n 3 , n 4 ). The first group of registers (A, B, C, D) have values that will be modified during a particular &#34;iteration&#34; of the algorithm to be described, whereas the second group of registers (n 1 , n 2 , n 3 , n 4 ) have values that remain constant throughout the &#34;iteration&#34;. The method further implements a set of mixing functions, M 1  . . . M N , and a set of masking functions B 1  . . . B N , with N preferably equal to 64. Each mixing function M i  has a corresponding masking function B i , and an &#34;iteration&#34; generally comprises a pair of such functions. Thus, mixing function M 1  and masking function B 1  are effected during a first iteration of the method, and so on. The sixty-four (64) iterations together define a &#34;phase&#34; of the algorithm, with each phase initiated by a call to the Initialize process 12. When the particular phase is complete, the value of &#34;1&#34; in incremented. 
     The initial values of registers (A, B, C, D) of the first group are supplied via line 15a to the first mixing function M 1  during the first iteration. Mixing function M 1  also receives via line 17 the initial values of the second group of registers (n 1 , n 2 , n 3 , n 4 ). As will be seen, the function M 1  comprises a set of modification instructions which serve to randomize the values of the registers (A, B, C, D) to generate a set of &#34;pre-output&#34; values for these registers on line 15b. The corresponding masking function B 1  receives these pre-output values as well as a set of values from table S via line 19. The masking function B 1  uses the set of values from table S to &#34;mask&#34; the pre-output register values from the corresponding mixing function to generate a data string of pseudorandom bits y 1 . 
     In addition to being supplied to the masking function B 1 , preferably the pre-output values of registers (A, B, C, D) on line 15b are also provided as inputs to the mixing function of the next iteration, in this case M 2 . The mixing function also receives via line 17 the initial values of the second group of registers (n 1 , n 2 , n 3 , n 4 ). As described above, these values are initialized by the Initialize process 12 and remain constant throughout the phase. The initial values of the second group of registers are used to modify the pre-output (or perhaps even the initial) values of the first group of registers (from the prior iteration) to allow the mixing function (in this case M 2 ) to more directly depend on information tied to the index n. The output of the mixing function M 2  on line 15c is supplied to masking function B 2 , which receives these pre-output values as well as a next set of values from table S via line 19. The masking function B 2  uses the set of values from table S to &#34;mask&#34; the pre-output register values from the corresponding mixing function to generate a data string of pseudorandom bits y 2 . 
     The iterations continue in this fashion. The particular data strings output from each iteration are concatenated to grow the output data stream. According to the invention, the table S is formatted to be of a sufficient size so that one pass through the S-table values corresponds to the sixty-four (64) iterations. As noted above, this cycle is a &#34;phase.&#34; In the event that a phase does not produce a long enough output stream, a new phase is begin by a new call to the Initialize process 12 with &#34;1&#34; having been incremented by 1. That process then uses new R-values and begins the cycle again to create new initial values for the registers (A, B, C, D, n 1 , n 2 , n 3 , n 4 ). The iterations of the phase are then begun again. The overall process is stopped when the length of the output stream reaches a desired value. 
     The Initialize process 12 is described in one particular embodiment in FIG. 2. This routine maps &#34;n&#34; and &#34;1&#34; in a (T,R)-dependent way to the first group of registers (A, B, C, D) and the second group of registers (n 1 , n 2 , n 3 , n 4 ). The first execution or call to the Initialize process is run using the values of n and R 0!, R 1!, R 2! and R 3! in order to form the register values for the first phase. As noted above, if necessary the procedure may be run again (i.e., using R 4! . . . R 7!, R 8! . . . R 11!, etc.) to generate additional sets of register values to continue growth of the output data stream. 
     As seen in the first four lines of FIG. 2, during the first phase the procedure uses the index n and the first set of values R 0! . . . R 3! from the table R to generate values for registers A, B, C and D. In the next four lines, the routine performs a number of functions to further randomize the registers A, B, C, D. Thus, e.g., line 5 includes the following steps: 
     
         P←A &amp; 0x7fc; B←B+T P/4!; A←A&gt;&gt;&gt;9. 
    
     This notation is explained as follows. In the first instruction; the routine designates an intermediate variable P as the portion of the value located at 0x7fc in register A. That portion of A is then used as an index to Table T (as indicated by the expression &#34;T P/4!&#34;). The notation P/4 is formally a division by 4, but in implementation means only that the instruction indexes into the array T in units of P bytes as opposed to units of P/4 words. The pseudorandom value located at position T P/4! in table T is then retrieved and summed, ignoring carry, with the word in register B. This sum replaces the register B. This is the effect of the second instruction. Generalizing, the expression &#34;B←B+T P/4!&#34; thus takes a current value of a register B and replaces the current value with a function of the current value and a value retrieved from the table T; the latter value is determined by another register value, namely, the value indicated by bits 21 . . . 29 (0x7fc) of register A. After the modification of register value B caused by the second step, the value in register A is rotated a predetermined amount and placed back into the register A. This is the effect of the instruction &#34;A←A&gt;&gt;&gt;9.&#34; This completes line 5 of the routine. 
     Lines 6-8 of the routine provide similar functionality. After line 8, the values remaining in registers D, B, A and C are then defined as values n 1 , n 2 , n 3  and n 4 , respectively, as indicated by the instruction (n 1 , n 2 , n 3 , n 4 ) +(D, B, A, C) in line 9. Additional processing is then carried out on the register values A, B, C and D as indicated by the last four lines of the routine to thereby complete the randomizing process. After the procedure is run for the first set of values R 0! . . . R 4!, the routine thus has generated an initial set of values for each of the four registers A, B, C and D, and for each of the four registers n 1 , n 2 , n 3  and n 4 . 
     Referring now to FIG. 3, it is seen how the values for registers (A, B, C, D) are used to map the 32-bit index n to an L-bit string SEAL a  (n). For a particular &#34;i&#34; value, lines 1-8 and 11 correspond to the mixing function M i , which as will been below performs a further randomizing function on the values in the registers (A, B, C, D) using additional values retrieved from table T and other rotation and operational instructions. 
     The preferred embodiment of the mixing function is now described. Thus, for example, line 1 of the function performs four separate instructions: the first instruction &#34;B←A &amp; 0x7fc&#34; takes the piece of register A located at the designated position; the second instruction &#34;B +B +T P/4!&#34; uses the piece of register A now in P as an index to table T, with the value retrieved from table T then summed, ignoring carry, with a current value in register B and the result placed back in B; the third instruction &#34;A←A&gt;&gt;&gt;9&#34; rotates the value in register A; and the fourth instruction &#34;B←B⊕A&#34; generates an exclusive OR of register B (following its modification in the second instruction) and register A (following its rotation by the third instruction). The result of the fourth instruction is placed back in register B. The newly-defined value in register B is then used as the index for the next line (line 2) of the routine by virtue of the instruction &#34;Q←B &amp; 0x7fc&#34; in line 2, and the process continues as shown. 
     Generalizing, it can be seen that the second instruction in each line takes a current value of a particular register and replaces the current value with a function (e.g., +, ⊕, etc.) of the current value and a value retrieved from table T. Moreover, the value retrieved from table T and useful in this function is determined by one or more values derived from other registers, i.e., the first instruction in each line. Thus, for example, a portion of the, register A value is used as an index (to modify register B) in line 1 by virtue of instruction &#34;P←A &amp; 0x7fc&#34; whereas, in line 3, register C and register A (by virtue of P) create the table index value. The latter index is generated by the instruction &#34;P←(P+C) &amp; 0x7fc.&#34; 
     The particular sequence of instructions shown in lines 1-8 has been found to be computationally efficient and produces well-randomized register values at very high speed on conventional processor platforms, especially when compared to encryption algorithms designed to be implemented in hardware. 
     After the process in lines 1-8 is carried out, the routine continues at line 9 to perform the masking process. In particular, line 9 corresponds to one of the masking processes B i  of FIG. 1. In this process, a set of values (e.g., S 0! . . . S 3!, which are sequential words) is obtained from table S and used to &#34;mask&#34; the pre-output values of the registers (A, B, C, D) which exist following the running of the respective mixing process. This &#34;masking&#34; is preferably carried out for each register value (of the first set of registers (A, B, C, D)) to generate a masked register value. As seen in the illustrative instruction, the masking of the pre-output value in register B is effected by the portion of the instruction &#34;B+S 4i-4!&#34;. Using sequential words retrieved from the table S, similar masking operations are performed on the other registers C, D and A as indicated by the instruction. 
     The masked register values are concatenated to form a data string y i  for the particular iteration of the function SEAL a  (n) defined by mixing function M i  and its corresponding masking function B i . After generating the data string y i  for the particular iteration, the algorithm runs the instructions in step 11 to use the register values (n 1 , n 2 , n 3 , n 4 ) to modify the non-masked register values (A, B, C, D) prior to the next iteration. 
     As noted earlier, when the 4-tuples from table S are exhausted, the function returns to FIG. 2 and re-runs the Initialize process for the next set of values from the R table. Once the new register values are determined, the &#34;for i&#34; loop of FIG. 3 is re-activated. 
     The outer loop of FIG. 2 is broken by the instruction in line 10 when enough output bits have been collected for the particular application using the pseudorandom function of the invention. As noted above, the variable L is the length of the output stream desired, and L is assumed to have a large bound, e.g., L≦64×1024×8 bits. The function stops generating bits as soon as it produces L&#39; bits, where L&#39; is the least multiple of 128 that is at least L. For a message encryption application, it will often be the case that L is less than 4096×8 bits, while for disk encryption on a personal computer, L will typically be 512×8 bits. 
     As seen in FIG. 3, generally it has been found desirable to alternate + and ⊕ operations when a particular register is modified. Thus, in line 1 the B register value is modified using an + operand whereas in line 5 the B value is modified using an ⊕ operand. It is likewise desirable to alternate these operands across the various registers during the processing of line 9. While such operations are preferred, the particular algorithm shown in FIG. 3 should not be taken as limiting the scope of the invention. For example, it may be desirable for some applications to use the same operator (+ or ⊕) throughout. It may be desirable to even omit the fourth instruction in each of lines 1-4 (the purpose of which is to more rapidly &#34;diffuse&#34; the information in the higher-order bits of A, B, C and D); alternatively, the degree of rotation in the third instruction in each line may be varied, or different lines may have different rotation instructions. The particular functions (+, ⊕) may be re-ordered or varied in numerous ways without affecting the basic purpose of the algorithm. All of these variations should be considered well within the scope of the present invention wherein a length-increasing pseudorandom function maps an index to an L-bit string under table-driven control. 
     The software-efficient pseudorandom function and its use thereof for encryption may be carried out on a number of different computers under a number of different operating systems. For example, a personal computer, a mini computer, mainframe computer or a computer running in a distributed network of other computers are useful for these purposes. Although specific choice of computer is limited only by disk and disk storage requirements, computers in the IBM PS/2™ series of computers could be used in the present invention. For additional information on IBM&#39;s PS/2 series of computers, the reader is referred to Technical Reference Manual Personal Systems/2 Model 50, 60 systems IBM Corporation, Part No. 68x2224 Order Number S68X-2224 and Technical Reference Manual Personal System/2 (Model 80) IBM Corporation Part No. 68X 2256 Order Number S68X-2254. One operating system which an IBM PS/2 personal computer may run is IBM&#39;s OS/2 2.0™. For more information on the IBM OS/2 2.0 Operating System, the reader is referred to OS/2 2.0 Technical Library, Programming Guide Vol. 1, 2, 3 Version 2.00 Order Nos. 10G6261, 10G6495, 10G6494. 
     In the alternative, the computer system might be in the IBM RISC System/6000™ line of computers which run on the AIX™ operating system. The various models of the RISC System/6000 are described in many publications of the IBM Corporation, for example, RISC System/6000, 7073 and 7016 POWERstation and POWERserver Hardware Technical reference, Order No. SA23-2644-00. The AIX operating system is described in General Concepts and Procedure--AIX Version 3 for RISC System/6000 Order No. SC23-2202-00 as well as other publications of the IBM Corporation. 
     One such computer is shown in FIG. 4. A computer 20, comprising a system unit 21, a keyboard 22, a mouse 23 and a display 24 are depicted. The screen 26 of display device 24 is used to present the graphical user interface (GUI). The graphical user interface supported by the operating system allows the user to use a point and shoot method of input, i.e., by moving the mouse pointer 25 to an icon representing a data object at a particular location on the screen 26 and pressing on the mouse buttons to perform a user command or selection. 
     FIG. 5 shows a block diagram of the components of the personal computer shown in FIG. 4. The system unit 21 includes a system bus or plurality of system buses 31 to which various components are coupled and by which communication between the various components is accomplished. The microprocessor 32 is connected to the system bus 31 and is supported by read only memory (ROM) 33 and random access memory (RAM) 34 also connected to system bus 31. A microprocessor in the IBM Multimedia PS/2 series of computers is one of the Intel family of microprocessors including the 386 or 486 microprocessors. However, as noted above, other microprocessors included, but not limited to, Motorola&#39;s family of microprocessors such as the 68000, 68020 or the 68030 microprocessors and various RISC microprocessors manufactured by IBM, Hewlett Packard, Sun, Intel, Motorola and others may be used in the specific computer. 
     The ROM 33 contains among other code the Basic Input-Output system (BIOS) which controls basic hardware operations such as the interaction and the disk drives and the keyboard. The RAM 34 is the main memory into which the operating system and application programs are loaded. The memory management chip 35 is connected to the system bus 31 and controls direct memory access operations including, passing data between the RAM 34 and hard disk drive 36 and floppy disk drive 37. The CD ROM 42, also coupled to the system bus 31, is used to store a large amount of data, e.g., a multimedia program or large database. 
     Also connected to this system bus 31 are various I/O controllers: the keyboard controller 38, the mouse controller 39, the video controller 40, and the audio controller 41. The keyboard controller 38 provides the hardware interface for the keyboard 22, the mouse controller 39 provides the hardware interface for the mouse 23, the video controller 40 is the hardware interface for the display 24, and the audio controller 41 is the hardware interface for the speakers 25a and 25b. An I/O controller 50 such as a Token Ring Adapter enables communication over a network 56 to other similarly configured data processing systems. 
     One of the preferred implementations of the present invention is as a set of instructions in a code module resident in the random access memory 34. Until required by the computer system, the set of instructions may be stored in another computer memory, for example, in the hard disk drive 36, in an optical disk for eventual use in the CD ROM 42 or in a floppy disk for eventual use in the floppy disk drive 37. As shown in the figure, the operating system 60 and the presentation manager 62 are resident in RAM 34. 
     Although the various applications of the class of pseudorandom functions described herein are quite varied, several applications can now be described. It should be appreciated, however, that these examples are merely illustrative and are not to be construed to limit the use of the inventive functions. These applications include local area network (LAN) message encryption, disk encryption, file encryption and pseudorandom number generation. 
     In typical applications requiring fast software cryptography, data encryption is required over the course of a communication session to a remote partner, or over the course of a login session to a particular machine. In either case, the key &#34;a&#34; which protects the session is determined at session setup. Typically, this session setup takes at least few milliseconds and is therefore not a time-critical operation. It is therefore acceptable to spend some number of milliseconds at that time to map the relatively short key &#34;a&#34; to a (less concise) representation of the cryptographic transformation specialized to this key. The present invention is thus quite useful in this application. 
     Existing LAN communication products (e.g., IBM LAN Distance, IBM LAN Server, and the OSF DCE) are used where two entities, A&#39; and B&#39;, are trying to communicate with one another over an insecure channel. FIG. 6 illustrates a pair of such processes A&#39; and B&#39; communicating over the insecure communication link 70. The designation &#34;E&#34; represents the adversary who witnesses the communication over the link 70. According to the invention, messages transmitted between the entities are encrypted with the pseudorandom function described above to facilitate secure communications over the link. 
     At the beginning of their communication session, an entity authentication protocol is executed which distributes to A&#39; and B&#39; a fresh and random session key a. According to the present invention, this key is used as the key a for SEAL. In particular, key a is mapped by A&#39; and B&#39; to T, R and S, and these tables are supplied to the pseudorandom function 72. The function 72 generates the pseudorandom bit string, which is then encrypted to the message (x i  or y j ) via function 74 (typically an ⊕). Maintaining a counter on the number of messages sent to the other so far, A&#39; and B&#39; thus use these three tables to encrypt the messages which are a part of the communication session which has just begun. Illustrative details of this process are set forth below. 
     Messages sent from A&#39; to B&#39; are numbered n 1  for the first message, n 2  for the second message, and so forth. Messages sent from B&#39; to A&#39; are numbered m 1  for the first message, m 2  for the second message, and so forth. It is important that n i  ≠n j  for all i≠j. In other words, no party may use a sequence number twice. It is equally necessary that n i  ≠m j  for all i and j. Thus, no sequence number used by A&#39; may ever be used by B&#39;. A numbering scheme meeting the above conditions is simple to construct. A&#39; might use even sequence numbers n 1  =0, n 2  =2, n 3  =4, and so on, reserving for B&#39; the odd ones m 1  =1, m 2  =3, m 3  =5, and so on. When A&#39; wants to send her i-th message x i  to B&#39; she computes the first |X i  | bits of SEAL a  (n 1 ), which is denoted denote pad i . Then A&#39; sends to B&#39; (n i , pad i  ⊕x i ) which is her encryption of x i . Similarly, when party B&#39; wants to send his j-th message y i  to A&#39;, he will send (m j , pad j  &#39; ⊕ y j ), where pad j  &#39; is the first |y j  | bits of SEAL a  (m j ). In the unlikely event that there should be so many messages sent by some party that all his available sequence numbers get used up, the session must effectively be declared over. In this case a new session is set up, complete with distribution of a new and random session key, a&#39;. 
     Another application of the present invention is a device driver that transparently encrypts all disk accesses. In this application, the key a is not a session key but rather a string derived from a password p u  that a user u enters when he turns his machine on. As an example, one might select a=SHA(p u ) ⊕K u , with K u  a 160-bit string associated to user u and stored on the machine&#39;s disk. When the operating system tries to read the i-th sector from the hard disk, the data there (i.e., the string x) is read and then decrypted by XOR-ing it with SEAL a  (i). As many bits of SEAL are used as a sector is long. Similarly, when the operating system tries to write the i-th sector, the data to be written is first encrypted by XOR-ing with SEAL a  (i). In the event that there is more than one disk whose contents are to be encrypted,-indices are selected for each disk such that no two sectors receive the same index. 
     FIG. 7 illustrates a portion of the computer of FIG. 5 showing the pseudorandom function supported in a device driver to facilitate such disk encryption. As used herein, the term &#34;device driver&#34; also includes terminate and stay-resident programs. In this example, the computer supports the device driver 76 which intercepts read or write calls directed to a mass storage device, in this case the hard disk 36 of the computer of FIG. 5. The read/write calls are communicated to the device driver 76 from the operating system 78. The operating system supports a login utility 80 that receives the password p u  that the user enters when he turns the computer on. The login utility hands off the password to the key processing utility 82 that generates the tables T, R and S. The tables are supplied to the pseudorandom function 84 which then encrypts the disk data via the encryption function 86. 
     Yet another application of the pseudorandom function is file encryption. In this case, the string is a data file and the index is a unique file identifier associated with that particular file. FIG. 8 illustrates a portion of the computer of FIG. 5 showing the pseudorandom function supported in the file system to facilitate both local and remote file encryption. In this representative example, the files desired to be accessed by the application may reside in the local file system 88 or a remote file system 90 accessible to the local file system 88 via the communication link 92. As in FIG. 7, the login utility 80 collects the user&#39;s name and password and passes these to the key processing utility 82, which generates the tables R, R and S. These tables are supplied to the pseudorandom function 84, which generates the pseudorandom bit strings that are used by the encryption function 86 to encrypt the data files. The file systems include appropriate interface layers to communicate the read and write requests. 
     A still further application is fast pseudorandom number generation, useful for software applications requiring a source of unpredictable bits. In this case, the random key &#34;a&#34; is stretched to a much longer pseudorandom string defined by SEAL a  (i 1 ) || SEAL a  (i 2 ) || . . . , where (i 1 , i 2 , . . . ) is a simple sequence (e.g., 0, 1, 2, . . . ) of indices. 
     It should be appreciated by those skilled in the art that the specific embodiments disclosed above may be readily utilized as a basis for modifying or designing other routines for carrying out the same purposes of the present invention. For example, it should be readily appreciated that while the preferred embodiment implements the invention in 32-bit processor, the method is also applicable to other execution vehicles including 64-bit machines. Other parameters, like the length of &#34;n&#34;, can easily be increased or otherwise changed. Those skilled in the art will recognize that such equivalent techniques and embodiments do not depart from the spirit and scope of the invention as set forth in the appended claims.