Abstract:
The invention relates to a system and method of hiding cryptographic private keys. While public/private key encryption systems are considered to be secure, the private keys ultimately must be stored in some location—in fact, in some digital commerce systems the private key is sent to the end user as part of an executable file such as an audio player and audio file. Thus, attackers can obtain access to the private key. The broad concept of the invention is to split the private key up into parts which are obfuscated, but still kept in a form that allows the encrypted data to be decrypted. One technique for obfuscating the private key uses modulo arithmetic.

Description:
RELATED APPLICATIONS 
     This application claims priority on the basis of Canadian patent application Serial No. 2,369,304 filed 30 Jan. 2002 and is a continuation of PCT Application No. PCT/CA03/00110 designating the United States and filed 30 Jan. 2003. 
    
    
     FIELD OF THE INVENTION 
     The invention relates to software and data cryptography. In particular, the invention relates to a system and method of hiding cryptographic private keys. 
     BACKGROUND TO THE INVENTION 
     In recent years, public/private-key cryptosystems have been widely used for protection of commercial data transmitted via the Internet. In addition to their use in encrypting and decrypting messages, they are used in creating and verifying digital signatures and for key exchanges. Public/private-key variants include the Rivest-Shamir-Adleman (RSA) and the EIGamal cryptosystems. The RSA cryptosystem is described in U.S. Pat. No. 4,405,829. 
     Based on standard RSA and EIGamal algorithms, a variety of extensions have been constructed. Threshold cryptography addresses single-secret sharing and related function sharing for multiple players. Chaum developed a blind signature scheme to allow one party to get a message signed by another party without leaking information about the content of the message to the other party (D. Chaum, Security without identification: transaction systems to make big brother obsolete, Communications of the ACM 28 (10, pp. 1030-1044, 1985.). 
     The RSA is a well-known and widely-used public key cryptosystem. The security of RSA is based on the intractability of the integer factorization problem. The key generation algorithm for RSA public key encryption is performed as follows: 
     1. Generate two large prime number p and q, each with roughly the same size (at least 100 digits). Let n=pq. 
     2. Select an integer e such that e is an odd integer greater than 1, less that n, and e and (p−1) (q−1) are relatively prime, i.e.,
 
( e ,( p− 1)( q− 1))=1.
 
     3. Compute an integer d such that (de−1) is evenly divisible by (p−1) (q−1), i.e.,
 
 de= 1(mod( p− 1)( q−l )).
 
     4. The public key is e. n is the modulus. 
     5. The private key is d. 
     In this specification, the public and private key pairs will some times be referred to as (e, n) and (d, n), respectively. 
     The RSA public key e and modulus n are used to encrypt a message m to get cipher message c:
 
 c=me   e (mod  n )
 
and private key d and modulus n are used to decrypt the cipher message c to obtain message m:
 
 m=c   d (mod  n ).
 
     The EIGamal cryptosystem is a public key cryptosystem whose security is based on the hardness of the Diffie-Hellman problem. The key generation process is as follows: 
     1. The server chooses a large prime p and a generator a of the group (Z/(p))* of integers modulo p. 
     2. The server selects a random integer a with 1≦a≦(p−2) and computes α a  mod p. 
     3. The public key is (p, α, α a ) and the private key is a. 
     For a message m, the enciphered message is a pair of integers (y 1 , y 2 ) such that y 1 =α k  mod p and y 2 =m(α a ) k  mod p, where k is a random integer between 1 and p−2, inclusive. The decryption is performed by computing y 1   −a ·y 2  mod p. 
     For all these cryptosystems and their applications, the basic assumption of security is that a given private key and its associated decrypting process are physically inaccessible except to the holder of the private key. However, there are many applications which require that programs perform decryption on hostile hosts. For example, in applications including e-books and other digital rights management systems, an encrypted document will often be downloaded to the end user with a private key embedded in it. In this scenario, if the decrypting process is standard, an attacker can find the private key, and the decrypted message, by observing this executing process using debugging tools, program tracing tools, and the like. 
       FIG. 1  shows an example of a typical cryptosystem  10 . The cryptosystem  10  comprises a server  11 , a communications channel  12 , and a client  13 . The server  11  comprises a key generation unit  14  and a program P  17  used to encrypt messages m into ciphers c and decrypt ciphers c back to messages m. The key generation unit  14  is used to create a private key  15  and a public key  16 . The private key  15  is embedded  18  into the program P  17 . When the user is authenticated or otherwise obtains permission from the server  11 , the public key  16  and program P  17  are then downloaded to the client  13 . The public key  16  is entered into program P  17  by a user. The client comprises the public key  16 , program P  17 , and application  19 . 
     Cryptosystem applications typically begin with a server generating a private and public key pairs (d, n) and (e, n), respectively. Next a program P  17  is generated which is intended to execute on a client&#39;s machine. The private key (d, n) is embedded in P, and part of P&#39;s code is able to decrypt cipher messages c encrypted by the public key (e, n). 
     After P  17  has been installed on the client&#39;s machine  13 , a message m is created which is intended neither to be publicly acknowledged, nor to be exposed, to the user of the client  13 . The message m is encrypted by program P  17  on the server  11  using the public key  16 . This encryption process produces a cipher c which is sent to the client  13  via the communications channel  12 . The cipher c is decrypted by program P  17  on the client  13  using the embedded private key  18 . The decrypted message m is then passed on to the appropriate application  19  in the client  13 . The application  19  may for example be an audio player, video player or e-book application. 
     The message m is not intended to be exposed to the user of the client  13  other than indirectly through the application  19 . That is, it is preferable that the message m is played or otherwise processed by the application  19 , but that it not be available to an outside observing for copying or transferring to others. However, the decryption of message m causes the states of P  17  to be changed according to the contents of message m. These changes in states may be observed by a hostile user of client  13  using techniques as described above. The observation by the hostile user may expose the embedded private key d and the message m. 
     In this situation, the client is a legitimate but untrusted party, from the server&#39;s point of view. In this scenario, it is desirable to have communication security between the server and the client to protect message c. It is also desirable to have means for protecting the private key d and the decrypted message m from the client. 
     SUMMARY OF THE INVENTION 
     It is an object of the present invention to solve one or more of the problems described above by providing a means for BLIND USE OF PRIVATE KEYS, in the sense that private keys can be used without being revealed. For example, by means of the instant invention, standard RSA and EIGamal cryptosystems can be modified to permit BLIND USE OF THEIR PRIVATE KEYS. This method can be employed so that breaking the resulting communication security is equivalent to solving the Discrete Logarithm Problem (DLP), which is generally agreed to be infeasible to solve in practice. 
     In a private/public key cryptography system, the private and public keys are compliments of one another and the private key can decipher data that has been encoded using the public key. The system is secure because the private key cannot easily be resolved from a knowledge of the public key and/or an encoded file. 
     The private key contains all the information needed to decode the encoded file. The broad concept of the invention is to divide this private information into two or more parts and then to obfuscate at least one of these parts, but still keep it in a form for which it is useful. Observers cannot resolve the obfuscated portions of the private key back to the original private key yet the obfuscated portions of the private key can still be used to decipher the ciphered data. A number of techniques are presented for doing this. 
     The entire deciphering program and data application (such as an audio or video player) are also preferably cloaked using tamper resistant software encoding techniques. In this way the unencoded data is never easily observable. 
     One aspect of the invention is broadly defined as a method for blind use of private cryptographic keys comprising the steps of: splitting the private key up into parts; and obfuscating at least one of the parts of the private key; whereby the private key is restructured so that it can be used without being revealed to an observer. 
     Another aspect of the invention is defined as a system for secure communication comprising: a first computer; a second computer; a communication network for interconnecting the first computer with the second computer; the first computer being operable to: generate a private and public key pair; split the private key into a first part and a second part; encrypt a message using the public key; transmit to the second computer: the public key; the first part of the private key; a program for decrypting messages; obfuscate the second part of the private key; and transmit the encrypted message and the obfuscated second part of the private key to the second computer; whereby the second computer can decipher the cipher using the first part of the private key and the obfuscated second part of the private key. 
    
    
     
       BRIEF DESCRIPTION OF THE DRAWINGS 
       A better understanding of the invention will be obtained by considering the detailed description below, with reference to the following drawings in which: 
         FIG. 1  shows an example of a typical cryptosystem; 
         FIG. 2  shows an example of a method of key generation for us in hiding a private key of a cryptosystem, in accordance with an embodiment of the present invention; 
         FIG. 3  shows an example of a method of message encryption and decryption when hiding a private key of a cryptosystem, in accordance with an embodiment of the present invention; and 
         FIG. 4  shows an example of a method of hiding a private key in a program, in accordance with an embodiment of the present invention. 
     
    
    
     DETAILED DESCRIPTION 
     In this description, RSA cryptosystems will be described. However, the invention applies to other cryptosystems, including Diffie-Hellman cryptosystems such as the EIGamal cryptosystem, as will be described below. 
       FIG. 2  shows an example of a method of key generation ( 20 ) for use in hiding a private key (d, n) of a cryptosystem, in accordance with an embodiment of the present invention. The method begins with the server  11  generating private  15  and public  16  key pairs (d, n) and (e, n), respectively ( 21 ). Next, the server selects two positive integers d 1  and d 2  such that d=d 1 +d 2  ( 22 ). The key generation method is done ( 23 ). Key information (e, n, d 1 ) may now be distributed to the client  13 , that will save (e, n, d 1 ) for future use. The server  11  may also create deciphering program P  17  for installation on client  13 . 
       FIG. 3  shows an example of a method of message encryption and decryption ( 30 ) when hiding a private key d of a cryptosystem  10  in the manner of  FIG. 2 , in accordance with an embodiment of the present invention. The method begins with computing the cipher text c of a plain text m ( 31 ), where c=m e (mod n). Next, the cipher text c′ of cipher text c is computed ( 32 ), where c′=c d2 (mod n). The server passes c and c′ to the client. The client receives c and c′ and program P  17  computes the plain text m ( 33 ) by performing the calculation m=(c′·c d1 )(mod n). The method is done ( 34 ). 
     The difficulty of finding d based on the information available to the client  13  is equivalent to the difficulty of solving the discrete logarithm problem (DLP). The reason is that finding d requires finding d 2  from c′, which is a DLP. 
     This protocol may be used to send out messages through common (i.e., shared, open or public) communication channels  12  because it ensures the safety of the private key d. 
     Means for protecting the private key d and the decrypted message m from the client is related to the production of tamper resistant software (TRS), and to methods of software obfuscation in general. Deployed in program P, the methods can be used to create a tamper resistant environment for the application of TRS technologies. The goal is make it very difficult for a user of client  13  to extract the private key d from P and hard to understand the decryption process as well as the usage of decrypted messages. (See PCT/CA00/00678, PCT/CA/00943, WO 01/79969, Canadian Patent Application No. 2,327,911, and WO 99/01815 for examples of suitable TRS encoding techniques.) 
     Since RSA and Diffie-Hellman cryptosystems involve modular exponentiation operations, which are computationally expensive, using a fast implementation algorithm, such as addition chains, is desirable. 
     The addition chain concept was developed to compute powers (i.e., to perform exponentiation) efficiently. An addition chain for number d is a sequence of positive integers
 
1=a 0 ,a 1 ,a 2 , . . . , a r =d
 
with the property that for each i=1, 2, . . . , r,
 
 a   i   =a   j   +a   k  
 
for some k, j with k≦j≦l.
 
     For two positive integers m and d, computing md is equivalent to computing some m ai s. Each positive integer d has many addition chains. Its binary addition chain is one of them. Finding an efficient way to perform exponentiation is identical to finding a shortest addition chain for d. Each addition chain can be represented by a special directed acyclic graph G=(V, E). Each number a i  in the chain is represented by a node v i εV. The relation a i =a j +a k  is represented by two edges (v j , v i )εE and (v k , v i )εE. 
     For three positive integers m, n and k, an addition chain of m×n+k can be obtained from addition chains of m, n and k. The source vertex and sink vertex are two important controllers of an addition chain. These two controllers can be used to obfuscate the decryption process. 
     If R is an associative ring with unity and G is a group, one defines the group ring RG to be the set of all the element of the form 
               ∑     g   ∈   G       ⁢       r   g     ⁢   g           
with addition
 
                   ∑     g   ∈   G       ⁢       r   g     ⁢   g       +       ∑     g   ∈   G       ⁢       s   g     ⁢   g         =       ∑     g   ∈   G       ⁢       (       r   g     +     s   g       )     ⁢   g             
and multiplication
 
                 ∑     g   ∈   G       ⁢       r   g     ⁢   g   *       ∑     h   ∈   G       ⁢     s     g   ⁢           ⁢   h             =       ∑     g   ∈   G       ⁢       (       r   g     +     s   h       )     ⁢   g   ⁢           ⁢   h             
where r g εR, s h εR for all g, hεG.
 
     A group ring is an associative ring. An invertible element uεRG is called a unit of RG. The set of all units of a group ring is a group under the multiplication operation of the group ring. The units so defined, are used to create mappings with which to obfuscate the decryption process. 
     After both public and private keys have been generated, the server  11  can do some pre-calculation on the private key d. Let 1 be the binary size of d. In practice, 1 could be 512 or 1024 bits long. 
     Based on the equation m=c d (mod n), where c is the cipher message, n is the modulus and m is the original message, there are a number of mathematical forms for the representation of the private key d. Two criteria may be set for any such form of representation: the first criterion is that it should facilitate key obfuscation, and the second is that it should facilitate fast computation as much as possible. 
     For any positive integer t≦d, a private key d can be represented as
 
 d=d   1   +d   2   + . . . +d 1
 
where d 1  are positive integers, for i=1, . . . , t.
 
     Therefore
 
 m=c   d (mod  n )= c   d′ (mod  n )· c   d2 (mod  n ) . . .  c   d1 (mod  n )
 
     In this way computing m becomes a process of computing t modular exponentiation operations and t−1 modular multiplications. The original key d is not involved directly. This representation of d is referred to as the summand representation. 
     Let p(d) denote the number of partitions of d into summands. The lower boundary of p(d) is 2[√/d]. 
     Another representation of d can be obtained from its binary representation, which is itself an encoding of an additive partition. For a given integer d it can also be written in the form
 
 d=dl *(2 i1 )+ d 2*(2 i2 )+ . . . + dj *(2 ij )+ . . . + dt *(2 it )
 
where d j  and i j  are integers, for all j=1, 2, . . . , t. Let 1(d) be the number of bits of d. Then the number of binary representations of d is the number of partitions of 1(d) into summands. This form of representation will be referred to as binary representation.
 
     The directed graph of an addition chain for d provides with yet another representation of d. For a given number d, there are many addition chains corresponding to d. In fact, determining the shortest addition chain for d is np-hard. The term graph representation refers to a directed graph representation of an addition chain for d. 
     Since any power can be represented in any one of the three forms above, and all d j s in the summand representation, all d j s and i j s in the binary representation, and all nodes in the graph representation are part of a power, they can be represented in other forms. For example, d j s in summand representation could be represented as instances of a graph representation. On the other hand, each node in a graph representation could be denoted by a binary representation. For a given private key, these combinations can create many different representations. 
     Program P is created by the server, and the way of decrypting a message is also designed by the server. Therefore the server can encode private key d and decode it in the decrypting process in P. Two ways of encoding a key include linear mapping and group ring mapping. Note that all three key representations mentioned above can be implemented using arrays, although elements in their cells or elements will have different interpretations, depending on the intent (i.e., depending on which of the above representations is being used). The server may insert random values into these arrays for further obfuscation. 
     The basic idea behind the linear mapping method is to use an invertible matrix to encrypt the array elements. First, select a prime number p which is greater than all of the array elements of a key representation, and then set the base ring of the matrix to be Z=(p), where Z is the integer domain. An invertible matrix H will be selected over Z=(p). 
     Some number of random values can be inserted into the private key bits. These values can be used for row or column bits in the matrix H. 
     The following will describe the use of a group ring to perform the encoding. Let G be a finite group, G={g 1 , g 2 , . . . , g |G| }, with order |G|. 
     A first approach employs group ring ZG, where Z is the ring of the integers. 
     Let f be a bijection from ZG to ZG. There exist many such kinds of maps. For example, one can choose a unit u from U(ZG) and define f by
 
 f ( x )= u   −1   xu  
 
for any x ε ZG. Since u is invertible, map f is a bijection.
 
     We show that each segment of length |G| in the array of a key representation can be encoded by f. Let
 
 S={a[i],a[i+ 1 ], . . . , ail+|G|]} 
 
be a segment of the integer array of a key representation. Then an element x S εZG can be defined by
 
 xS=a[i]g   1   +a[i+ 1] g 2 + . . . +a[i+|G|]g   i+|G| 
 
Acting f on x s  we get f(x s ). Suppose
 
 f ( x   s )= b   1   g   1   +b   2   g   2   + . . . +b   |G|g|G| 
 
Then we have an encoded segment S′ of segment S, viz.:
 
 S′={b   1   ,b   2   , . . . , b   |G| }
 
Since f is invertible, S can be recovered from S′.
 
     Key-representation arrays may be partitioned into segments of length |G|, thus producing encoded arrays. 
     There is another way to do array encoding: instead of working on the integer ring Z, work on the Galois field GF (2 1 ) and use the group ring GF (2 1 ) G to encode the key representation array, where 1 is an integer called the word length. In this way, an array can be partitioned into segments and each segment has |G| words, while each word has 1 bits. It is well known that each word can be regarded as an element in the Galois field GF (2 1 ). 
     Following the same procedure, each segment can be encoded into a new segment by applying f which is a bijection from GF (2 1 ) G to itself. Then the whole array can be encoded, segment by segment. 
     For a given array representing a key, different methods (linear mapping or group ring mapping) may be applied on it. For the same mapping, different parameters can be selected. For example, different matrices for linear mappings, different types of groups, and different representations of the same type of group, and different rings for group ring mappings. Applying different methods, or the same method with different parameters, makes it more difficult to find the private key, and more difficult to understand the decryption process. 
     In program P, based on the key hiding scheme above, and the encoded key representation, above, the decrypted message will be represented by a message array mixed with some false values. Only by finding the right pieces and combining them together in the correct way can the true decrypted message be determined. This tamper resistant environment provides a way to apply tamper-resistant technologies (which is recommended to fully obfuscate the decryption process). 
       FIG. 4  shows an example of a method of hiding a private key d in a program P ( 40 ), in accordance with an embodiment of the present invention. The method begins with a generated private key d. A series of components are created to describe d ( 41 ). Entropy may be added to the components ( 42 ). For example, entropy may be added as random values in the components. Alternatively, entropy may not be added. However, it is preferable to add entropy to further obfuscate the private key component representation of d. The components are then flattened into one component ( 43 ). For example, the components may be flattened into an array. The method is done ( 44 ) and this flattened component is then used to represent d in program P. The following description will describe features of this method in more detail. 
     An example of a method to hide d based on its binary representation is provided. A binary representation for private key d of RSA will be described. At this stage, d is assumed to have been generated as a big integer. More precisely, let d be the key with binary size keySize. Two integer arrays will be used to describe d: keyCoefficients [ ] and keyExponents [ ] with the same size keyPartitionSize. 
     The two arrays can be filled in the following way. Based on the bit size of keySize, the keyPartitionSize can be determined. Then keyPartitionSize of values {p 1 , p 2 , . . . p keyPartitionSize } are randomly chosen such that their sum is keySize. 
     The bit-vector OF D is partitioned into keyPartitionSize consecutive bit-vectors v i  of bit length p i  with value w i , and let
 
keyCoefficient[i]=w i  
 
and let keyExponents [i] be the bit position of the low-order bit of v i  in the bit vector of d, where i=0, . . . , keyPartitionSize−1. Then
 
     
       
         
           
             d 
             = 
             
               
                 ∑ 
                 
                   i 
                   = 
                   1 
                 
                 keyPartitionSize 
               
               ⁢ 
               
                 
                   keyCoefficients 
                   ⁡ 
                   
                     [ 
                     i 
                     ] 
                   
                 
                 ⁢ 
                 
                   x2 
                   
                     keyExponents 
                     ⁡ 
                     
                       [ 
                       i 
                       ] 
                     
                   
                 
               
             
           
         
       
     
     Some randomness may be injected into both arrays in order to obfuscate key d. Two arrays are created to store true values and entropy for keyCoefficients [ ] and keyExponents [ ], called coefficientsAndEntropy [ ] and exponentsAndEntropy [ ], respectively. 
     Values of array coefficientsAndEntropy [ ] based on the keySize may be set, and an entropyNumber of random values may be determined based on the keyPartitionSize. Then these values may be randomly inserted into the array coefficientsAndEntropy [ ]. 
     In this way, coefficientsAndEntropy [ ] contains both real data and random values. The indices of the spurious (random) entries will be stored in an array called coefficientEntropyNumberIndices [ ]. 
     Now a way to set the elements of exponentsAndEntropy [ ] will be described. The same number of random values entropyNumber will be used. All the random values must lie between 1 and keySize, since the values in keyExponents [ ] is an ascending chain. exponentsAndEntropy [ ] can be constructed from keyExponents [ ] and these random values. 
     A group ring mapping may be used to encode the two arrays. A non-Abelian group G with order |G| is selected and a unit u from ZG is found. Then a map is defined from ZG to ZG by
 
 f ( x )= xu  
 
for any xεZG. Since u is invertible, map f is a bijection.
 
     Two two-dimensional arrays may be created for this purpose: namely, coefficientGRElements [ ] and exponentGRElements [ ] [ ]. Each sub-array in these two dimensional arrays is a group ring element. 
     Based on the order of G, the two arrays coefficientGRElements [ ] and exponentGRElements [ ] [ ] may be set, whose elements are assigned from coefficientsAndEntropy [ ] and exponentsAndEntropy [ ], respectively. Then map f may be applied to this group ring elements to form two new arrays denoted by the same names, coefficientGRElements [ ] and exponentGRElements [ ] [ ], which is the last step of private key pre-calculation. 
     Since the group G is selected by the server, the group table can be related to the private key bits, which makes it more difficult to find private key d. 
     After this pre-calculation, all of the information related to recovery of the private key is hidden and scattered in two obscured arrays which will be flattened to a one dimensional array in program P, using known compiler techniques for array addressing. Program P will use this array to perform decryption. 
     The EIGamal cryptosystem is a public key cryptosystem whose security is based on the hardness of the Diffie-Hellman problem. The key generation process is as follows:
         1. The server chooses a large prime p and a generator α of the group (Z=(p))* of integers modulo p.   2. The server selects a random integer a with 1≦a≦(p−2) and computes α a  mod p.   3. The server&#39;s public key is (p, α, α a ) and the private key is a.
 
For a message m, the enciphered message is a pair of integers (y 1 , y 2 ) such that y 1 =α k  mod p and y 2 =m·mod p, where k is a random integer between 1 and p−2, inclusive.
       

     The decryption is performed by computing y 1   −a ·y 2  mod p. As with RSA, in the decrypting process, the private key of EIGamal is used in the form of a power (for exponentiation). Therefore all of the techniques mentioned above for RSA cryptosystem can be applied to the EIGamal cryptosystem. 
     The method provides a way for hiding cryptographic keys and messages by splitting and obfuscating the private keys and their corresponding decryption process. The method can be combined with other forms of program obfuscation and techniques for the generation of tamper-resistant software to produce implementations in which both private keys and messages would be difficult for an attacker to discover. 
     Protection of the software application P could be effected by means of tamper-resistant encoding techniques known in the art. Preferrably, TRS encoding techniques described by Cloakware in co-pending applications should be used to protect the data-flow, control-flow, mass data and processing (referred to as “white-box cryptography”). 
     Data-flow refers to the ‘ordinary computation’ of a program: addition, subtraction, multiplication, division, Boolean computations, masking operations, and the like: the scalar data-flow of a program. Data-flow encoding alters the frame of reference for the data in the program, so that an attacker cannot easily determine how the program is operating. For example, a transform can be effected on each integral variable in a program, changing it to a geometric sum. Details on the various forms of data-flow encoding are available in the co-pending patent application titled: Tamper Resistant Software Encoding, filed under the Patent Co-operation Treaty on Jun. 8, 2000, under Ser. No. PCT/CA00/00678, by Stanley Chow, Harold Johnson, and Yuan Gu. 
     Control flow encoding is used to encode and protect the control logic, branch, and subroutine structure of the program by altering these structures and the decision branches that access them. Various control flow encoding techniques are described in the co-pending patent application filed under the Patent Cooperation Treaty application no. PCT/CA00/00943, titled: Tamper Resistant Software-Control Flow Encoding. 
     The term mass data refers to aggregate data structures of various kinds, such as arrays, character strings, records with named fields, discrete unions, records linked by pointers and residing in dynamic or ‘heap’ storage, I/O buffers, command buffers, and the like. Accordingly, mass-data encoding protects the contents of these data structures. 
     Mass data encoding generally relies on the random or pseudo-random dispersion of data being stored, throughout the available memory or an area of the available memory. This dispersion makes it very difficult for an attacker to locate certain pieces of data he is searching for, and also distributes the data values with respect to one another. Details on mass data encoding appear in: Tamper Resistant Software-Mass Data Encoding, filed under the Patent Co-operation Treaty on Apr. 12, 2001, under Ser. No. PCT/CA01/00493); inventors: Stanley Chow, Harold Johnson, and Yuan Gu. 
     White-box cryptography protects cryptographic computations so that they can be performed without revealing internal data such as encoding constant or secret keys. White-box cryptography is described in the co-pending patent application filed under the Patent Cooperation Treaty application no. PCT/CA01/00493, titled: Tamper Resistant Software-Mass Data Encoding. 
     While particular embodiments of the present invention have been shown and described, it is clear that changes and modifications may be made to such embodiments without departing from the true scope and spirit of the invention. 
     The method steps of the invention may be embodiment in sets of executable machine code stored in a variety of formats such as object code or source code. Such code is described generically herein as programming code, or a computer program for simplification. Clearly, the executable machine code may be integrated with the code of other programs, implemented as subroutines, by external program calls or by other techniques as known in the art. 
     The embodiments of the invention may be executed by a computer processor or similar device programmed in the manner of method steps, or may be executed by an electronic system which is provided with means for executing these steps. Similarly, an electronic memory means such computer diskettes, CO-ROMs, Random Access Memory (RAM), Read Only Memory (ROM) or similar computer software storage media known in the art, may store code to execute such method steps. 
     While exemplary embodiments described herein focus on particular public/private-key cryptosystems, it would be clear to one skilled in the art that the invention may be applied to other public/private-key cryptosystems. The protected software of the invention can be stored on any suitable storage device and executed on any manner of computing device. It is just as mobile as any other software application, and can be downloaded to users over the Internet or via email, transferred from a personal computer (PC) to a laptop, or stored on a CD ROM or hard disk drive. Accordingly, the invention could be applied to:
         1. computers such as personal computers, personal digital assistants, laptop computers and other similar devices;   2. network and system components such as servers, routers, gateways and other similar devices; and   3. all manner of appliances having computer or processor control including electronic books, mp3 players, CD readers and players, DVD players and the like.