Here's the basic idea:
1. The first thing the AES encrypt function does is XOR user input against the secret key.
2. The result of this operation is used to index into a lookup table (the S-box).
3. The timing characteristics of step 2 will vary based on the contents of the cache.
By measuring the timings for a large number of random inputs and correlating them by index, (e.g. sort all messages into buckets based on the value of the first byte), we can recover the corresponding byte of the secret key.Though it's not clear a priori what the timing characteristics should look like for a particular key byte, we can easily measure this on a machine we control that matches the description of the target platform.