The execution time for the
square-and-multiply algorithm used in
modular exponentiation depends linearly on the number of '1' bits in the key. While the number of '1' bits alone is not nearly enough information to make finding the key easy, repeated executions with the same key and different inputs can be used to perform statistical correlation analysis of timing information to recover the key completely, even by a passive attacker. Observed timing measurements often include noise (from such sources as network latency, or disk drive access differences from access to access, and the
error correction techniques used to recover from transmission errors). Nevertheless, timing attacks are practical against a number of encryption algorithms, including
RSA,
ElGamal, and the
Digital Signature Algorithm. In 2003,
Boneh and
Brumley demonstrated a practical network-based timing attack on
SSL-enabled web servers, based on a different vulnerability having to do with the use of RSA with
Chinese remainder theorem optimizations. The actual network distance was small in their experiments, but the attack successfully recovered a server private key in a matter of hours. This demonstration led to the widespread deployment and use of
blinding techniques in SSL implementations. In this context, blinding is intended to remove correlations between key and encryption time. Some versions of
Unix use a relatively expensive implementation of the
crypt library function for hashing an 8-character password into an 11-character string. On older hardware, this computation took a deliberately and measurably long time: as much as two or three seconds in some cases. The
login program in early versions of Unix executed the crypt function only when the login name was recognized by the system. This leaked information through timing about the validity of the login name, even when the password was incorrect. An attacker could exploit such leaks by first applying
brute-force to produce a list of login names known to be valid, then attempt to gain access by combining only these names with a large set of passwords known to be frequently used. Without any information on the validity of login names the time needed to execute such an approach would increase by orders of magnitude, effectively rendering it useless. Later versions of Unix have fixed this leak by always executing the crypt function, regardless of login name validity. Two otherwise securely isolated processes running on a single system with either
cache memory or
virtual memory can communicate by deliberately causing
page faults and/or
cache misses in one process, then monitoring the resulting changes in access times from the other. Likewise, if an application is trusted, but its paging/caching is affected by branching logic, it may be possible for a second application to determine the values of the data compared to the branch condition by monitoring access time changes; in extreme examples, this can allow recovery of cryptographic key bits. The 2017
Meltdown and
Spectre attacks which forced CPU manufacturers (including Intel, AMD, ARM, and IBM) to redesign their CPUs both rely on timing attacks. As of early 2018, almost every computer system in the world is affected by Spectre. In 2018, many internet servers were still vulnerable to slight variations of the original timing attack on RSA, two decades after the original vulnerability was discovered.
String comparison algorithms The following
C code demonstrates a typical insecure string comparison which stops testing as soon as a character doesn't match. For example, when comparing "ABCDE" with "ABxDE" it will return after 3 loop iterations: bool insecure_string_compare(const void *a, const void *b, size_t length) { const char *ca = a, *cb = b; for (size_t i = 0; i By comparison, the following version runs in constant-time by testing all characters and using a
bitwise operation to accumulate the result: bool constant_time_string_compare(const void *a, const void *b, size_t length) { const char *ca = a, *cb = b; bool result = true; for (size_t i = 0; i In the world of C library functions, the first function is analogous to , while the latter is analogous to NetBSD's or OpenBSD's and . On other systems, the comparison function from cryptographic libraries like
OpenSSL and
libsodium can be used. == Notes ==