1. A method of generating identification data for identifying software comprising: pre-processing a memory stack by setting the memory stack to a first predetermined state, the first predetermined state including multiple addresses being initialized to a first predetermined value; altering one or more addresses of the memory stack by executing the software; post-processing the memory stack so as to set portions of the memory stack to a second predetermined state, wherein the one or more addresses altered by the executed software are set to a second predetermined value; generating the identification data based on the one or more altered addresses of the memory stack, wherein the identification data uniquely identifies the software based upon a pattern of the first predetermined value and the second predetermined value in the memory stack; generating a fingerprint from the pattern, wherein the fingerprint comprises information representing addresses of a portion of the memory stack containing the first predetermined value and the second predetermined value; generating an encryption key using the generated identification data; encrypting data using the generated encryption key in accordance with an encryption process; generating a decryption key using the generated identification data; and decrypting data using the generated decryption key in accordance with the encryption process.