Recent from talks
Nothing was collected or created yet.
RSA cryptosystem
View on Wikipedia| General | |
|---|---|
| Designers | Ron Rivest, Adi Shamir, and Leonard Adleman |
| First published | 1977 |
| Certification | PKCS#1, ANSI X9.31 |
| Cipher detail | |
| Key sizes | variable but typically 2,048 to 4,096 bits |
| Rounds | 1 |
| Best public cryptanalysis | |
| General number field sieve for classical computers; Shor's algorithm for quantum computers. An 829-bit key has been broken. | |
The RSA (Rivest–Shamir–Adleman) cryptosystem is a family of public-key cryptosystems, one of the oldest widely used for secure data transmission. The initialism "RSA" comes from the surnames of Ron Rivest, Adi Shamir and Leonard Adleman, who publicly described the algorithm in 1977.[1][2][3] An equivalent system was developed secretly in 1973 at Government Communications Headquarters (GCHQ), the British signals intelligence agency, by the English mathematician Clifford Cocks. That system was declassified in 1997.[4]
RSA is used in digital signature such as RSASSA-PSS or RSA-FDH,[5][6][7][8][9][10] public-key encryption of very short messages (almost always a single-use symmetric key in a hybrid cryptosystem) such as RSAES-OAEP,[11][12][13][10] and public-key key encapsulation.[14][15][16]
In RSA-based cryptography, a user's private key—which can be used to sign messages, or decrypt messages sent to that user—is a pair of large prime numbers chosen at random and kept secret. A user's public key—which can be used to verify messages from the user, or encrypt messages so that only that user can decrypt them—is the product of the prime numbers.
The security of RSA is related to the difficulty of factoring the product of two large prime numbers, the "factoring problem". Breaking RSA encryption is known as the RSA problem. Whether it is as difficult as the factoring problem is an open question.[17] There are no published methods to defeat the system if a large enough key is used.
History
[edit]
The idea of an asymmetric public-private key cryptosystem is attributed to Whitfield Diffie and Martin Hellman, who published this concept in 1976. They also introduced digital signatures and attempted to apply number theory. Their formulation used a shared-secret-key created from exponentiation of some number, modulo a prime number. However, they left open the problem of realizing a one-way function, possibly because the difficulty of factoring was not well-studied at the time.[18] Moreover, like Diffie-Hellman, RSA is based on modular exponentiation.
Ron Rivest, Adi Shamir, and Leonard Adleman at the Massachusetts Institute of Technology made several attempts over the course of a year to create a function that was hard to invert. Rivest and Shamir, as computer scientists, proposed many potential functions, while Adleman, as a mathematician, was responsible for finding their weaknesses. They tried many approaches, including "knapsack-based" and "permutation polynomials". For a time, they thought what they wanted to achieve was impossible due to contradictory requirements.[19] In April 1977, they spent Passover at the house of a student and drank a good deal of wine before returning to their homes at around midnight.[20] Rivest, unable to sleep, lay on the couch with a math textbook and started thinking about their one-way function. He spent the rest of the night formalizing his idea, and he had much of the paper ready by daybreak. The algorithm is now known as RSA – the initials of their surnames in same order as their paper.[21]
Clifford Cocks, an English mathematician working for the British intelligence agency Government Communications Headquarters (GCHQ), described a similar system in an internal document in 1973.[22] However, given the relatively expensive computers needed to implement it at the time, it was considered to be mostly a curiosity and, as far as is publicly known, was never deployed. His ideas and concepts were not revealed until 1997 due to its top-secret classification.
Kid-RSA (KRSA) is a simplified, insecure public-key cipher published in 1997, designed for educational purposes. Kid-RSA gives insight into RSA and other public-key ciphers, analogous to simplified DES.[23][24][25][26][27]
Patent
[edit]A patent describing the RSA algorithm was granted to MIT on 20 September 1983: U.S. patent 4,405,829 "Cryptographic communications system and method". From DWPI's abstract of the patent:
The system includes a communications channel coupled to at least one terminal having an encoding device and to at least one terminal having a decoding device. A message-to-be-transferred is enciphered to ciphertext at the encoding terminal by encoding the message as a number M in a predetermined set. That number is then raised to a first predetermined power (associated with the intended receiver) and finally computed. The remainder or residue, C, is... computed when the exponentiated number is divided by the product of two predetermined prime numbers (associated with the intended receiver).
A detailed description of the algorithm was published in August 1977, in Scientific American's Mathematical Games column.[2][21] This preceded the patent's filing date of December 1977. Consequently, the patent had no legal standing outside the United States. Had Cocks' work been publicly known, a patent in the United States would not have been legal either.
When the patent was issued, terms of patent were 17 years. The patent was about to expire on 21 September 2000, but RSA Security released the algorithm to the public domain on 6 September 2000.[28]
Operation
[edit]The RSA algorithm involves four steps: key generation, key distribution, public-key operation (used for encryption or verifying a signature), and private key operation (used for decryption or signing a message).
A basic principle behind RSA is the observation that it is practical to find three very large positive integers e, d, and n, such that for all integers x (0 ≤ x < n), both (xe)d and x have the same remainder when divided by n (they are congruent modulo n):However, when given only e and n, it is infeasible to compute eth roots modulo n; that is, for uniform random y (0 ≤ y < n), it is extremely difficult to find x such that xe ≡ y (mod n).
The integers n and e form the public key and d is the private key. The modular exponentiation to the power of e is used in encryption and in verifying signatures, and exponentiation to the power of d is used in decryption and in signing messages.
Key generation
[edit]The keys for the RSA algorithm are generated in the following way:
- Choose two large prime numbers p and q.
- To make factoring infeasible, p and q must be chosen at random from a large space of possibilities, such as all prime numbers between 21023 and 21024 (corresponding to a 2,048-bit key). Many different algorithms for prime selection are used in practice.[29]
- p and q are kept secret.
- Compute n = pq.
- n is used as the modulus for both the public and private keys. Its length, usually expressed in bits, is the key length.
- n is released as part of the public key.
- Compute λ(n), where λ is Carmichael's totient function. Since n = pq, λ(n) = lcm(λ(p), λ(q)), and since p and q are prime, λ(p) = φ(p) = p − 1, and likewise λ(q) = q − 1. Hence λ(n) = lcm(p − 1, q − 1).
- The lcm may be calculated through the Euclidean algorithm, since lcm(a, b) = |ab|/gcd(a, b).
- λ(n) is kept secret.
- Choose an integer e such that 1 < e < λ(n) and gcd(e, λ(n)) = 1; that is, e and λ(n) are coprime.
- e having a short bit-length and small Hamming weight results in more efficient encryption – the most commonly chosen value for e is 216 + 1 = 65537. The smallest (and fastest) possible value for e is 3, but such a small value for e may expose vulnerabilities in insecure padding schemes.[30][a]
- e is released as part of the public key.
- Determine d as d ≡ e−1 (mod λ(n)); that is, d is the modular multiplicative inverse of e modulo λ(n).
- This means: solve for d the equation de ≡ 1 (mod λ(n)); d can be computed efficiently by using the extended Euclidean algorithm, since, thanks to e and λ(n) being coprime, said equation is a form of Bézout's identity, where d is one of the coefficients.
- d is kept secret as the private key exponent.
The public key consists of the modulus n and the public exponent e. The private key consists of the private exponent d, which must be kept secret. p, q, and λ(n) must also be kept secret because they can be used to calculate d. In fact, they can all be discarded after d has been computed.[31]
In the original RSA paper,[3] the Euler totient function φ(n) = (p − 1)(q − 1) is used instead of λ(n) for calculating the private exponent d. Since φ(n) is always divisible by λ(n), the algorithm works as well. The possibility of using Euler totient function results also from Lagrange's theorem applied to the multiplicative group of integers modulo pq. Thus any d satisfying d⋅e ≡ 1 (mod φ(n)) also satisfies d⋅e ≡ 1 (mod λ(n)). However, computing d modulo φ(n) will sometimes yield a result that is larger than necessary (i.e. d > λ(n)). Most of the implementations of RSA will accept exponents generated using either method (if they use the private exponent d at all, rather than using the optimized decryption method based on the Chinese remainder theorem described below), but some standards such as FIPS 186-4 (Section B.3.1) may require that d < λ(n). Any "oversized" private exponents not meeting this criterion may always be reduced modulo λ(n) to obtain a smaller equivalent exponent.
Note: The authors of the original RSA paper carry out the key generation by choosing d and then computing e as the modular multiplicative inverse of d modulo φ(n), whereas most current implementations of RSA, such as those following PKCS#1, do the reverse—choose e and compute d from it. Since e can safely be small and fixed, whereas d must be chosen from a large enough space to resist attack, the modern approach can reduce the cost of the public-key operation without loss of security.[3][32]
Key distribution
[edit]Suppose that Bob wants to send secret messages to Alice, or verify messages from Alice. If they decide to use RSA, Bob must know Alice's public key to encrypt his secret messages or verify Alice's messages, and Alice must use her private key to decrypt Bob's secret messages or sign her own messages.
To enable Bob to send his encrypted messages or verify her future messages, Alice transmits her public key (n, e) to Bob via a reliable, but not necessarily secret, route. Alice's private key (d) is never distributed.
Encryption
[edit]After Bob obtains Alice's public key, he can send a message M to Alice.
To do it, he first turns M into an integer m, the padded plaintext, such that 0 ≤ m < n, by using an agreed-upon reversible protocol known as a padding scheme. He then computes the ciphertext c, using Alice's public key e, by:
This can be done reasonably quickly, even for very large numbers, using modular exponentiation. Bob then transmits c to Alice. Note that at least nine values of m will yield a ciphertext c equal to m,[b] but this is very unlikely to occur in practice.
Decryption
[edit]Alice can recover m from c by using her private key exponent d by computing
Given m, she can recover the original message M by reversing the padding scheme, or discard it as corrupted if the padding is invalid.
Alice must discard m if the padding is invalid: if she reveals any information about m when it has invalid padding, an adversary could exploit this to decrypt (or sign) messages without knowing the private key, by sending her random or maliciously crafted ciphertexts and observing how she responds.[33]
Example
[edit]Here is an example of RSA encryption and decryption, ignoring the details of padding:[c]
- Choose two distinct prime numbers, such as
- and .
- Compute n = pq giving
- Compute the Carmichael's totient function of the product as λ(n) = lcm(p − 1, q − 1) giving
- Choose any number 1 < e < 780 that is coprime to 780. Choosing a prime number for e leaves us only to check that e is not a divisor of 780.
- Let .
- Compute d, the modular multiplicative inverse of e (mod λ(n)), yielding
as
The public key is (n = 3233, e = 17). For a padded plaintext message m, the encryption function is
The private key is (n = 3233, d = 413). For an encrypted ciphertext c, the decryption function is
For instance, in order to encrypt m = 65, one calculates
To decrypt c = 2790, one calculates
Both of these calculations can be computed efficiently using the square-and-multiply algorithm for modular exponentiation. In real-life situations the primes selected would be much larger; in our example it would be trivial to factor n = 3233 (obtained from the freely available public key) back to the primes p and q. e, also from the public key, is then inverted to get d, thus acquiring the private key.
Practical implementations use the Chinese remainder theorem to speed up the calculation using modulus of factors (mod pq using mod p and mod q).
The values dp, dq and qinv, which are part of the private key are computed as follows:
Here is how dp, dq and qinv are used for efficient decryption (encryption is efficient by choice of a suitable d and e pair):
Signing
[edit]Suppose Alice wishes to send a signed message m to Bob. She produces a hash value h = hash(m) of the message m, raises it to the power of d (modulo n), and attaches s = hd mod n as a "signature" to the message.
Verifying
[edit]When Bob receives the message m and signature s, he uses the same hash algorithm in conjunction with Alice's public key to compute h = hash(m). He raises the signature s to the power of e (modulo n), and compares the resulting hash value with the message's hash value: If the two agree, he knows that the author of the message was in possession of Alice's private key and that the message has not been tampered with since being sent.
This equation is satisfied when s = hd mod n because of exponentiation rules:
The modular exponentiation for signing and verification is the same underlying mathematics as for decryption and encryption, but all the other details of padding scheme for secure public-key encryption and hashing for secure digital signature are different.[32]
The use of a hash, first proposed in 1978 by Michael O. Rabin in the related Rabin signature algorithm,[34][35] and the security of the hash, is essential for security of the signature:[36][37] if Alice and Bob skipped the hash, and Bob checked for se ≡ m (mod n) instead, then anyone could forge the signature s = 1 on the message m = 1, or take two signed messages (m1, s1) and (m2, s2) from Alice and then forge a third by multiplication, (m1m2, s1s2), without knowledge of the private key.
Proofs of correctness
[edit]Proof using Fermat's little theorem
[edit]The proof of the correctness of RSA is based on Fermat's little theorem, stating that ap − 1 ≡ 1 (mod p) for any integer a and prime p, not dividing a.[note 1]
We want to show that for every integer m when p and q are distinct prime numbers and e and d are positive integers satisfying ed ≡ 1 (mod λ(pq)).
Since λ(pq) = lcm(p − 1, q − 1) is, by construction, divisible by both p − 1 and q − 1, we can write for some nonnegative integers h and k.[note 2]
To check whether two numbers, such as med and m, are congruent mod pq, it suffices (and in fact is equivalent) to check that they are congruent mod p and mod q separately.[note 3]
To show med ≡ m (mod p), we consider two cases:
- If m ≡ 0 (mod p), m is a multiple of p. Thus med is a multiple of p. So med ≡ 0 ≡ m (mod p).
- If m ≢ 0 (mod p),
- where we used Fermat's little theorem to replace mp−1 mod p with 1.
The verification that med ≡ m (mod q) proceeds in a completely analogous way:
- If m ≡ 0 (mod q), med is a multiple of q. So med ≡ 0 ≡ m (mod q).
- If m ≢ 0 (mod q),
This completes the proof that, for any integer m, and integers e, d such that ed ≡ 1 (mod λ(pq)),
Notes
[edit]- ^ We cannot trivially break RSA by applying the theorem (mod pq) because pq is not prime.
- ^ In particular, the statement above holds for any e and d that satisfy ed ≡ 1 (mod (p − 1)(q − 1)), since (p − 1)(q − 1) is divisible by λ(pq), and thus trivially also by p − 1 and q − 1. However, in modern implementations of RSA, it is common to use a reduced private exponent d that only satisfies the weaker, but sufficient condition ed ≡ 1 (mod λ(pq)).
- ^ This is part of the Chinese remainder theorem, although it is not the significant part of that theorem.
Proof using Euler's theorem
[edit]Although the original paper of Rivest, Shamir, and Adleman used Fermat's little theorem to explain why RSA works, it is common to find proofs that rely instead on Euler's theorem.
We want to show that med ≡ m (mod n), where n = pq is a product of two different prime numbers, and e and d are positive integers satisfying ed ≡ 1 (mod φ(n)). Since e and d are positive, we can write ed = 1 + hφ(n) for some non-negative integer h. Assuming that m is relatively prime to n, we have
where the second-last congruence follows from Euler's theorem.
More generally, for any e and d satisfying ed ≡ 1 (mod λ(n)), the same conclusion follows from Carmichael's generalization of Euler's theorem, which states that mλ(n) ≡ 1 (mod n) for all m relatively prime to n.
When m is not relatively prime to n, the argument just given is invalid. This is highly improbable (only a proportion of 1/p + 1/q − 1/(pq) numbers have this property), but even in this case, the desired congruence is still true. Either m ≡ 0 (mod p) or m ≡ 0 (mod q), and these cases can be treated using the previous proof.
Padding
[edit]Attacks against plain RSA
[edit]There are a number of attacks against plain RSA as described below.
- When encrypting with low encryption exponents (e.g., e = 3) and small values of the m (i.e., m < n1/e), the result of me is strictly less than the modulus n. In this case, ciphertexts can be decrypted easily by taking the eth root of the ciphertext over the integers.
- If the same clear-text message is sent to e or more recipients in an encrypted way, and the receivers share the same exponent e, but different p, q, and therefore n, then it is easy to decrypt the original clear-text message via the Chinese remainder theorem. Johan Håstad noticed that this attack is possible even if the clear texts are not equal, but the attacker knows a linear relation between them.[38] This attack was later improved by Don Coppersmith (see Coppersmith's attack).[39]
- Because RSA encryption is a deterministic encryption algorithm (i.e., has no random component) an attacker can successfully launch a chosen plaintext attack against the cryptosystem, by encrypting likely plaintexts under the public key and test whether they are equal to the ciphertext. A cryptosystem is called semantically secure if an attacker cannot distinguish two encryptions from each other, even if the attacker knows (or has chosen) the corresponding plaintexts. RSA without padding is not semantically secure.[40]
- RSA has the property that the product of two ciphertexts is equal to the encryption of the product of the respective plaintexts. That is, m1em2e ≡ (m1m2)e (mod n). Because of this multiplicative property, a chosen-ciphertext attack is possible. E.g., an attacker who wants to know the decryption of a ciphertext c ≡ me (mod n) may ask the holder of the private key d to decrypt an unsuspicious-looking ciphertext c′ ≡ cre (mod n) for some value r chosen by the attacker. Because of the multiplicative property, c' is the encryption of mr (mod n). Hence, if the attacker is successful with the attack, they will learn mr (mod n), from which they can derive the message m by multiplying mr with the modular inverse of r modulo n.[33][41]
- Given the private exponent d, one can efficiently factor the modulus n = pq. And given factorization of the modulus n = pq, one can obtain any private key (d', n) generated against a public key (e', n).[30]
Padding schemes
[edit]To avoid these problems, practical RSA implementations typically embed some form of structured, randomized padding into the value m before encrypting it. This padding ensures that m does not fall into the range of insecure plaintexts, and that a given message, once padded, will encrypt to one of a large number of different possible ciphertexts.
Standards such as PKCS#1 have been carefully designed to securely pad messages prior to RSA encryption. Because these schemes pad the plaintext m with some number of additional bits, the size of the un-padded message M must be somewhat smaller. RSA padding schemes must be carefully designed so as to prevent sophisticated attacks that may be facilitated by a predictable message structure. Early versions of the PKCS#1 standard (up to version 1.5) used a construction that appears to make RSA semantically secure. However, at Crypto 1998, Bleichenbacher showed that this version is vulnerable to a practical adaptive chosen-ciphertext attack. Furthermore, at Eurocrypt 2000, Coron et al.[42] showed that for some types of messages, this padding does not provide a high enough level of security. Later versions of the standard include Optimal Asymmetric Encryption Padding (OAEP), which prevents these attacks. As such, OAEP should be used in any new application, and PKCS#1 v1.5 padding should be replaced wherever possible. The PKCS#1 standard also incorporates processing schemes designed to provide additional security for RSA signatures, e.g. the Probabilistic Signature Scheme for RSA (RSA-PSS).
Secure padding schemes such as RSA-PSS are as essential for the security of message signing as they are for message encryption. Two USA patents on PSS were granted (U.S. patent 6,266,771 and U.S. patent 7,036,014); however, these patents expired on 24 July 2009 and 25 April 2010 respectively. Use of PSS no longer seems to be encumbered by patents.[original research?] Note that using different RSA key pairs for encryption and signing is potentially more secure.[43]
Security and practical considerations
[edit]Using the Chinese remainder algorithm
[edit]For efficiency, many popular crypto libraries (such as OpenSSL, Java and .NET) use for decryption and signing the following optimization based on the Chinese remainder theorem.[44][citation needed] The following values are precomputed and stored as part of the private key:
- and – the primes from the key generation,
These values allow the recipient to compute the exponentiation m = cd (mod pq) more efficiently as follows:
,
,
,[d]
.
This is more efficient than computing exponentiation by squaring, even though two modular exponentiations have to be computed. The reason is that these two modular exponentiations both use a smaller exponent and a smaller modulus.
Integer factorization and the RSA problem
[edit]The security of the RSA cryptosystem is based on two mathematical problems: the problem of factoring large numbers and the RSA problem. Full decryption of an RSA ciphertext is thought to be infeasible on the assumption that both of these problems are hard, i.e., no efficient algorithm exists for solving them. Providing security against partial decryption may require the addition of a secure padding scheme.[45]
The RSA problem is defined as the task of taking eth roots modulo a composite n: recovering a value m such that c ≡ me (mod n), where (n, e) is an RSA public key, and c is an RSA ciphertext. Currently the most promising approach to solving the RSA problem is to factor the modulus n. With the ability to recover prime factors, an attacker can compute the secret exponent d from a public key (n, e), then decrypt c using the standard procedure. To accomplish this, an attacker factors n into p and q, and computes lcm(p − 1, q − 1) that allows the determination of d from e. No polynomial-time method for factoring large integers on a classical computer has yet been found, but it has not been proven that none exists; see integer factorization for a discussion of this problem.
The first RSA-512 factorization in 1999 used hundreds of computers and required the equivalent of 8,400 MIPS years, over an elapsed time of about seven months.[46] By 2009, Benjamin Moody could factor an 512-bit RSA key in 73 days using only public software (GGNFS) and his desktop computer (a dual-core Athlon64 with a 1,900 MHz CPU). Just less than 5 gigabytes of disk storage was required and about 2.5 gigabytes of RAM for the sieving process.
Rivest, Shamir, and Adleman noted[3] that Miller has shown that – assuming the truth of the extended Riemann hypothesis – finding d from n and e is as hard as factoring n into p and q (up to a polynomial time difference).[47] However, Rivest, Shamir, and Adleman noted, in section IX/D of their paper, that they had not found a proof that inverting RSA is as hard as factoring.
As of 2020[update], the largest publicly known factored RSA number had 829 bits (250 decimal digits, RSA-250).[48] Its factorization, by a state-of-the-art distributed implementation, took about 2,700 CPU-years. In practice, RSA keys are typically 1024 to 4096 bits long. In 2003, RSA Security estimated that 1024-bit keys were likely to become crackable by 2010.[49] As of 2020, it is not known whether such keys can be cracked, but minimum recommendations have moved to at least 2048 bits.[50] It is generally presumed that RSA is secure if n is sufficiently large, outside of quantum computing.
If n is 300 bits or shorter, it can be factored in a few hours on a personal computer, using software already freely available. Keys of 512 bits have been shown to be practically breakable in 1999, when RSA-155 was factored by using several hundred computers, and these are now factored in a few weeks using common hardware. Exploits using 512-bit code-signing certificates that may have been factored were reported in 2011.[51] A theoretical hardware device named TWIRL, described by Shamir and Tromer in 2003, called into question the security of 1024-bit keys.[49]
In 1994, Peter Shor showed that a quantum computer – if one could ever be practically created for the purpose – would be able to factor in polynomial time, breaking RSA; see Shor's algorithm.
Faulty key generation
[edit]This section needs additional citations for verification. (October 2017) |
Finding the large primes p and q is usually done by testing random numbers of the correct size with probabilistic primality tests that quickly eliminate virtually all of the nonprimes.
The numbers p and q should not be "too close", lest the Fermat factorization for n be successful. If p − q is less than 2n1/4 (n = p⋅q, which even for "small" 1024-bit values of n is 3×1077), solving for p and q is trivial. Furthermore, if either p − 1 or q − 1 has only small prime factors, n can be factored quickly by Pollard's p − 1 algorithm, and hence such values of p or q should be discarded.
It is important that the private exponent d be large enough. Michael J. Wiener showed that if p is between q and 2q (which is quite typical) and d < n1/4/3, then d can be computed efficiently from n and e.[52]
There is no known attack against small public exponents such as e = 3, provided that the proper padding is used. Coppersmith's attack has many applications in attacking RSA specifically if the public exponent e is small and if the encrypted message is short and not padded. 65537 is a commonly used value for e; this value can be regarded as a compromise between avoiding potential small-exponent attacks and still allowing efficient encryptions (or signature verification). The NIST Special Publication on Computer Security (SP 800-78 Rev. 1 of August 2007) does not allow public exponents e smaller than 65537, but does not state a reason for this restriction.
In October 2017, a team of researchers from Masaryk University announced the ROCA vulnerability, which affects RSA keys generated by an algorithm embodied in a library from Infineon known as RSALib. A large number of smart cards and trusted platform modules (TPM) were shown to be affected. Vulnerable RSA keys are easily identified using a test program the team released.[53]
Importance of strong random number generation
[edit]A cryptographically strong random number generator, which has been properly seeded with adequate entropy, must be used to generate the primes p and q. An analysis comparing millions of public keys gathered from the Internet was carried out in early 2012 by Arjen K. Lenstra, James P. Hughes, Maxime Augier, Joppe W. Bos, Thorsten Kleinjung and Christophe Wachter. They were able to factor 0.2% of the keys using only Euclid's algorithm.[54][55][self-published source?]
They exploited a weakness unique to cryptosystems based on integer factorization. If n = pq is one public key, and n′ = p′q′ is another, then if by chance p = p′ (but q is not equal to q'), then a simple computation of gcd(n, n′) = p factors both n and n', totally compromising both keys. Lenstra et al. note that this problem can be minimized by using a strong random seed of bit length twice the intended security level, or by employing a deterministic function to choose q given p, instead of choosing p and q independently.
Nadia Heninger was part of a group that did a similar experiment. They used an idea of Daniel J. Bernstein to compute the GCD of each RSA key n against the product of all the other keys n' they had found (a 729-million-digit number), instead of computing each gcd(n, n′) separately, thereby achieving a very significant speedup, since after one large division, the GCD problem is of normal size.
Heninger says in her blog that the bad keys occurred almost entirely in embedded applications, including "firewalls, routers, VPN devices, remote server administration devices, printers, projectors, and VOIP phones" from more than 30 manufacturers. Heninger explains that the one-shared-prime problem uncovered by the two groups results from situations where the pseudorandom number generator is poorly seeded initially, and then is reseeded between the generation of the first and second primes. Using seeds of sufficiently high entropy obtained from key stroke timings or electronic diode noise or atmospheric noise from a radio receiver tuned between stations should solve the problem.[56]
Strong random number generation is important throughout every phase of public-key cryptography. For instance, if a weak generator is used for the symmetric keys that are being distributed by RSA, then an eavesdropper could bypass RSA and guess the symmetric keys directly.
Timing attacks
[edit]Kocher described a new attack on RSA in 1995: if the attacker Eve knows Alice's hardware in sufficient detail and is able to measure the decryption times for several known ciphertexts, Eve can deduce the decryption key d quickly. This attack can also be applied against the RSA signature scheme. In 2003, Boneh and Brumley demonstrated a more practical attack capable of recovering RSA factorizations over a network connection (e.g., from a Secure Sockets Layer (SSL)-enabled webserver).[57] This attack takes advantage of information leaked by the Chinese remainder theorem optimization used by many RSA implementations.
One way to thwart these attacks is to ensure that the decryption operation takes a constant amount of time for every ciphertext. However, this approach can significantly reduce performance. Instead, most RSA implementations use an alternate technique known as cryptographic blinding. RSA blinding makes use of the multiplicative property of RSA. Instead of computing cd (mod n), Alice first chooses a secret random value r and computes (rec)d (mod n). The result of this computation, after applying Euler's theorem, is rcd (mod n), and so the effect of r can be removed by multiplying by its inverse. A new value of r is chosen for each ciphertext. With blinding applied, the decryption time is no longer correlated to the value of the input ciphertext, and so the timing attack fails.
Adaptive chosen-ciphertext attacks
[edit]In 1998, Daniel Bleichenbacher described the first practical adaptive chosen-ciphertext attack against RSA-encrypted messages using the PKCS #1 v1 padding scheme (a padding scheme randomizes and adds structure to an RSA-encrypted message, so it is possible to determine whether a decrypted message is valid). Due to flaws with the PKCS #1 scheme, Bleichenbacher was able to mount a practical attack against RSA implementations of the Secure Sockets Layer protocol and to recover session keys. As a result of this work, cryptographers now recommend the use of provably secure padding schemes such as Optimal Asymmetric Encryption Padding, and RSA Laboratories has released new versions of PKCS #1 that are not vulnerable to these attacks.
A variant of this attack, dubbed "BERserk", came back in 2014.[58][59] It impacted the Mozilla NSS Crypto Library, which was used notably by Firefox and Chrome.
Side-channel analysis attacks
[edit]A side-channel attack using branch-prediction analysis (BPA) has been described. Many processors use a branch predictor to determine whether a conditional branch in the instruction flow of a program is likely to be taken or not. Often these processors also implement simultaneous multithreading (SMT). Branch-prediction analysis attacks use a spy process to discover (statistically) the private key when processed with these processors.
Simple Branch Prediction Analysis (SBPA) claims to improve BPA in a non-statistical way. In their paper, "On the Power of Simple Branch Prediction Analysis",[60] the authors of SBPA (Onur Aciicmez and Cetin Kaya Koc) claim to have discovered 508 out of 512 bits of an RSA key in 10 iterations.
Fault injection attack
[edit]A power-fault attack on RSA implementations was described in 2010 [61]The author recovered the key by varying the CPU power voltage outside limits; this caused multiple power faults on the server.
The CRT implementation is sensitive to fault injection attacks. If an attacker can obtain 1 faulty signature, the private key can be calculated.[62]
Tricky implementation
[edit]There are many details to keep in mind in order to implement RSA securely (strong PRNG, acceptable public exponent, etc.). This makes the implementation challenging, to the point that the book Practical Cryptography With Go suggests avoiding RSA if possible.[63]
Implementations
[edit]Some cryptography libraries that provide support for RSA include:
See also
[edit]Notes
[edit]- ^ e = 2 is also possible (and even faster) but qualitatively different because squaring is not a permutation; this is the basis of the Rabin signature algorithm.
- ^ Namely, the values of m which are equal to −1, 0, or 1 modulo p while also equal to −1, 0, or 1 modulo q. There will be more values of m having c = m if p − 1 or q − 1 has other divisors in common with e − 1 besides 2 because this gives more values of m such that or respectively.
- ^ The parameters used here are artificially small, but one can also OpenSSL can also be used to generate and examine a real keypair.
- ^ If , then some[clarification needed] libraries compute h as .
References
[edit]- ^ Rivest, R.L.; Shamir, A.; Adleman, L. (1977). A Method for Obtaining Digital Signatures and Public-Key Cryptosystems (PDF) (Technical report). MIT Laboratory for Computer Science. hdl:1721.1/148910. MIT-LCS-TM-082.
- ^ a b Gardner, Martin (August 1977). "Mathematical Games: A new kind of cipher that would take millions of years to break" (PDF). Scientific American. Vol. 237, no. 2. doi:10.1038/scientificamerican0877-120. Archived from the original (PDF) on 2025-07-11.
- ^ a b c d Rivest, R.; Shamir, A.; Adleman, L. (February 1978). "A Method for Obtaining Digital Signatures and Public-Key Cryptosystems" (PDF). Communications of the ACM. 21 (2): 120–126. CiteSeerX 10.1.1.607.2677. doi:10.1145/359340.359342. Archived from the original (PDF) on 2023-01-27. Retrieved 2025-07-30.
- ^ Smart, Nigel (February 19, 2008). "Dr Clifford Cocks CB". Bristol University. Retrieved June 20, 2025.
- ^ Bellare, Mihir; Rogaway, Phillip. Maurer, Ueli (ed.). The exact security of digital signatures: How to sign with RSA and Rabin. Advances in Cryptology—EUROCRYPT ’96. Lecture Notes in Computer Science. Springer. pp. 399–416. doi:10.1007/3-540-68339-9_34. ISBN 978-3-540-61186-8.
- ^ Aumasson, Jean-Philippe (2018). "10. RSA: Signing with RSA". Serious Cryptography. No Starch Press. pp. 188–191. ISBN 978-1-59327-826-7.
- ^ Stinson, Douglas (2006). "7: Signature Schemes". Cryptography: Theory and Practice (3rd ed.). Chapman & Hall/CRC. pp. 281–318. ISBN 978-1-58488-508-5.
- ^ Ferguson, Niels; Kohno, Tadayoshi; Schneier, Bruce (2010). "12. RSA". Cryptography Engineering. Wiley. pp. 195–211. ISBN 978-0-470-47424-2.
- ^ Galbraith, Steven (2012). "§ 24.6: Digital signatures based on RSA and Rabin". Mathematics of Public-Key Cryptography. Cambridge University Press. pp. 7–9. ISBN 978-1-107-01392-6.
- ^ a b B. Kaliski; A. Rusch; J. Johnsson; A. Rusch (November 2016). K. Moriarty (ed.). PKCS #1: RSA Cryptography Specifications Version 2.2. Internet Engineering Task Force. doi:10.17487/RFC8017. ISSN 2070-1721. RFC 8017. Informational. Obsoletes RFC 3447.
- ^ Bellare, Mihir; Rogaway, Phillip. Santis, Alfredo (ed.). Optimal asymmetric encryption. Advances in Cryptology—EUROCRYPT '94. Lecture Notes in Computer Science. Springer. pp. 92–111. doi:10.1007/BFb0053428. ISBN 978-3-540-60176-0.
- ^ Aumasson, Jean-Philippe (2018). "10. RSA: Encrypting with RSA". Serious Cryptography. No Starch Press. pp. 185–188. ISBN 978-1-59327-826-7.
- ^ Galbraith, Steven (2012). "§24.7: Public-key encryption based on RSA and Rabin". Mathematics of Public-Key Cryptography. Cambridge University Press. pp. 511–512. ISBN 978-1-107-01392-6.
- ^ Shoup, Victor (2001), A Proposal for an ISO Standard for Public Key Encryption (version 2.1), Cryptology ePrint Archive, International Association for Cryptologic Research
- ^ Ferguson, Niels; Kohno, Tadayoshi; Schneier, Bruce (2010). "12. RSA". Cryptography Engineering. Wiley. pp. 195–211. ISBN 978-0-470-47424-2.
- ^ R. Housley; S. Turner (February 2025). Use of the RSA-KEM Algorithm in the Cryptographic Message Syntax (CMS). Internet Engineering Task Force. doi:10.17487/RFC9690. RFC 9690. Proposed Standard. Obsoletes RFC 5990.
- ^ Castelvecchi, Davide (2020-10-30). "Quantum-computing pioneer warns of complacency over Internet security". Nature. 587 (7833): 189. Bibcode:2020Natur.587..189C. doi:10.1038/d41586-020-03068-9. PMID 33139910. S2CID 226243008. 2020 interview of Peter Shor.
- ^ Diffie, W.; Hellman, M. E. (November 1976). "New directions in cryptography" (PDF). IEEE Transactions on Information Theory. 22 (6): 644–654. Bibcode:1976ITIT...22..644D. CiteSeerX 10.1.1.37.9720. doi:10.1109/TIT.1976.1055638. ISSN 0018-9448. Archived from the original (PDF) on 2014-11-29. Retrieved 2025-07-30.
- ^ Rivest, Ronald. "The Early Days of RSA – History and Lessons" (PDF).
- ^ Calderbank, Michael (2007-08-20). "The RSA Cryptosystem: History, Algorithm, Primes" (PDF).
- ^ a b Robinson, Sara (June 2003). "Still Guarding Secrets after Years of Attacks, RSA Earns Accolades for its Founders" (PDF). SIAM News. 36 (5). Archived from the original (PDF) on 2022-12-15.
- ^ Cocks, C. C. (20 November 1973). "A Note on Non-Secret Encryption" (PDF). www.gchq.gov.uk. Archived from the original (PDF) on 28 September 2018. Retrieved 2017-05-30.
- ^ Jim Sauerberg. "From Private to Public Key Ciphers in Three Easy Steps".
- ^ Margaret Cozzens and Steven J. Miller. "The Mathematics of Encryption: An Elementary Introduction". p. 180.
- ^ Alasdair McAndrew. "Introduction to Cryptography with Open-Source Software". p. 12.
- ^ Surender R. Chiluka. "Public key Cryptography".
- ^ Neal Koblitz. "Cryptography As a Teaching Tool". Cryptologia, Vol. 21, No. 4 (1997).
- ^ "RSA Security Releases RSA Encryption Algorithm into Public Domain". Archived from the original on June 21, 2007. Retrieved 2010-03-03.
- ^ Švenda, Petr; Nemec, Matúš; Sekan, Peter; Kvašňovský, Rudolf; Formánek, David; Komárek, David; Matyáš, Vashek (August 2016). The Million-Key Question—Investigating the Origins of RSA Public Keys. 25th USENIX Security Symposium. Austin, TX, United States: USENIX Association. pp. 893–910. ISBN 978-1-931971-32-4.
- ^ a b Boneh, Dan (1999). "Twenty Years of attacks on the RSA Cryptosystem". Notices of the American Mathematical Society. 46 (2): 203–213.
- ^ Applied Cryptography, John Wiley & Sons, New York, 1996. Bruce Schneier, p. 467.
- ^ a b Johnson, J.; Kaliski, B. (February 2003). Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1. Network Working Group. doi:10.17487/RFC3447. RFC 3447. Retrieved 9 March 2016.
- ^ a b Bleichenbacher, Daniel (1998). Krawczyk, Hugo (ed.). Chosen ciphertext attacks against protocols based on the RSA encryption standard PKCS #1. Advances in Cryptology—CRYPTO '98. Lecture Notes in Computer Science. Springer. pp. 1–12. doi:10.1007/BFb0055716. ISBN 978-3-540-68462-6.
- ^ Rabin, Michael O. (1978). "Digitalized Signatures". In DeMillo, Richard A.; Dobkin, David P.; Jones, Anita K.; Lipton, Richard J. (eds.). Foundations of Secure Computation. New York: Academic Press. pp. 155–168. ISBN 0-12-210350-5.
- ^ Rabin, Michael O. (January 1979). Digitalized Signatures and Public Key Functions as Intractable as Factorization (PDF) (Technical report). Cambridge, MA, United States: MIT Laboratory for Computer Science. TR-212.
- ^ Bernstein, Daniel J. (January 31, 2008). RSA signatures and Rabin–Williams signatures: the state of the art (Report). (additional information at https://cr.yp.to/sigs.html)
- ^ Bellare, Mihir; Rogaway, Phillip (May 1996). Maurer, Ueli (ed.). The Exact Security of Digital Signatures—How to Sign with RSA and Rabin. Advances in Cryptology – EUROCRYPT ’96. Lecture Notes in Computer Science. Vol. 1070. Saragossa, Spain: Springer. pp. 399–416. doi:10.1007/3-540-68339-9_34. ISBN 978-3-540-61186-8.
- ^ Håstad, Johan (1986). "On using RSA with Low Exponent in a Public Key Network". Advances in Cryptology – CRYPTO '85 Proceedings. Lecture Notes in Computer Science. Vol. 218. pp. 403–408. doi:10.1007/3-540-39799-X_29. ISBN 978-3-540-16463-0.
- ^ Coppersmith, Don (1997). "Small Solutions to Polynomial Equations, and Low Exponent RSA Vulnerabilities" (PDF). Journal of Cryptology. 10 (4): 233–260. CiteSeerX 10.1.1.298.4806. doi:10.1007/s001459900030. S2CID 15726802.
- ^ Goldwasser, Shafi; Micali, Silvio (1982-05-05). "Probabilistic encryption & how to play mental poker keeping secret all partial information". Proceedings of the fourteenth annual ACM symposium on Theory of computing - STOC '82. New York, NY, USA: Association for Computing Machinery. pp. 365–377. doi:10.1145/800070.802212. ISBN 978-0-89791-070-5. S2CID 10316867.
- ^ Davida, George I. (1982). Chosen signature cryptanalysis of the RSA (MIT) public key cryptosystem (Technical report). Department of Electrical Engineering and Computer Science, University of Wisconsin, Milwaukee. Technical Report TR-CS-82-2.
- ^ Coron, Jean-Sébastien; Joye, Marc; Naccache, David; Paillier, Pascal (2000). "New Attacks on PKCS#1 v1.5 Encryption". In Preneel, Bart (ed.). Advances in Cryptology — EUROCRYPT 2000. Lecture Notes in Computer Science. Vol. 1807. Berlin, Heidelberg: Springer. pp. 369–381. doi:10.1007/3-540-45539-6_25. ISBN 978-3-540-45539-4.
- ^ "RSA Algorithm".
- ^ "OpenSSL bn_s390x.c". Github. Retrieved 2 August 2024.
- ^ Machie, Edmond K. (29 March 2013). Network security traceback attack and react in the United States Department of Defense network. Trafford. p. 167. ISBN 978-1466985742.
- ^ Lenstra, Arjen; et al. (Group) (2000). "Factorization of a 512-bit RSA Modulus" (PDF). Eurocrypt.
- ^ Miller, Gary L. (1975). "Riemann's Hypothesis and Tests for Primality" (PDF). Proceedings of Seventh Annual ACM Symposium on Theory of Computing. pp. 234–239.
- ^ Zimmermann, Paul (2020-02-28). "Factorization of RSA-250". Cado-nfs-discuss. Archived from the original on 2020-02-28. Retrieved 2020-07-12.
- ^ a b Kaliski, Burt (2003-05-06). "TWIRL and RSA Key Size". RSA Laboratories. Archived from the original on 2017-04-17. Retrieved 2017-11-24.
- ^ Barker, Elaine; Dang, Quynh (2015-01-22). "NIST Special Publication 800-57 Part 3 Revision 1: Recommendation for Key Management: Application-Specific Key Management Guidance" (PDF). National Institute of Standards and Technology. p. 12. doi:10.6028/NIST.SP.800-57pt3r1. Retrieved 2017-11-24.
- ^ Sandee, Michael (November 21, 2011). "RSA-512 certificates abused in-the-wild". Fox-IT International blog.
- ^ Wiener, Michael J. (May 1990). "Cryptanalysis of short RSA secret exponents" (PDF). IEEE Transactions on Information Theory. 36 (3): 553–558. Bibcode:1990ITIT...36..553W. doi:10.1109/18.54902. S2CID 7120331.
- ^ Nemec, Matus; Sys, Marek; Svenda, Petr; Klinec, Dusan; Matyas, Vashek (November 2017). "The Return of Coppersmith's Attack: Practical Factorization of Widely Used RSA Moduli" (PDF). Proceedings of the 2017 ACM SIGSAC Conference on Computer and Communications Security. CCS '17. doi:10.1145/3133956.3133969.
- ^ Markoff, John (February 14, 2012). "Flaw Found in an Online Encryption Method". The New York Times.
- ^ Lenstra, Arjen K.; Hughes, James P.; Augier, Maxime; Bos, Joppe W.; Kleinjung, Thorsten; Wachter, Christophe (2012). "Ron was wrong, Whit is right" (PDF).
- ^ Heninger, Nadia (February 15, 2012). "New research: There's no need to panic over factorable keys–just mind your Ps and Qs". Freedom to Tinker.
- ^ Brumley, David; Boneh, Dan (2003). "Remote timing attacks are practical" (PDF). Proceedings of the 12th Conference on USENIX Security Symposium. SSYM'03.
- ^ "'BERserk' Bug Uncovered In Mozilla NSS Crypto Library Impacts Firefox, Chrome". 25 September 2014. Retrieved 4 January 2022.
- ^ "RSA Signature Forgery in NSS". Mozilla.
- ^ Acıiçmez, Onur; Koç, Çetin Kaya; Seifert, Jean-Pierre (2007). "On the power of simple branch prediction analysis". Proceedings of the 2nd ACM Symposium on Information, Computer and Communications Security. ASIACCS '07. pp. 312–320. CiteSeerX 10.1.1.80.1438. doi:10.1145/1229285.1266999.
- ^ Pellegrini, Andrea; Bertacco, Valeria; Austin, Todd (March 2010). "Fault-based attack of RSA authentication". 2010 Design, Automation & Test in Europe Conference & Exhibition (DATE 2010). pp. 855–860. doi:10.1109/DATE.2010.5456933. ISBN 978-3-9810801-6-2.
- ^ Boneh, Dan; DeMillo, Richard A.; Lipton, Richard J. (Nov 2000). "On the Importance of Eliminating Errors in Cryptographic Computations". Journal of Cryptology. 14 (2): 106–107. doi:10.1007/s001450010016. ISSN 0933-2790.
- ^ Isom, Kyle. "Practical Cryptography With Go". Retrieved 4 January 2022.
Further reading
[edit]- Menezes, Alfred; van Oorschot, Paul C.; Vanstone, Scott A. (October 1996). Handbook of Applied Cryptography. CRC Press. ISBN 978-0-8493-8523-0.
- Cormen, Thomas H.; Leiserson, Charles E.; Rivest, Ronald L.; Stein, Clifford (2001). Introduction to Algorithms (2nd ed.). MIT Press and McGraw-Hill. pp. 881–887. ISBN 978-0-262-03293-3.
External links
[edit]- The Original RSA Patent as filed with the U.S. Patent Office by Rivest; Ronald L. (Belmont, MA), Shamir; Adi (Cambridge, MA), Adleman; Leonard M. (Arlington, MA), December 14, 1977, U.S. patent 4,405,829.
- RFC 8017: PKCS #1: RSA Cryptography Specifications Version 2.2
- Explanation of RSA using colored lamps on YouTube
- Thorough walk through of RSA
- Prime Number Hide-And-Seek: How the RSA Cipher Works
- Onur Aciicmez, Cetin Kaya Koc, Jean-Pierre Seifert: On the Power of Simple Branch Prediction Analysis
RSA cryptosystem
View on GrokipediaHistory
Invention
The RSA cryptosystem was invented in 1977 by Ron Rivest, Adi Shamir, and Leonard Adleman, computer scientists and mathematicians working together at the Massachusetts Institute of Technology (MIT).[1][4] Their collaboration involved an iterative process in which Rivest and Shamir proposed potential encryption schemes, while Adleman attempted to break each iteration to identify weaknesses and refine the design until a secure method emerged.[5][4] This work was directly motivated by the public-key cryptography concept introduced by Whitfield Diffie and Martin Hellman in their 1976 paper, which showed the theoretical possibility of secure key exchange without prior shared secrets but did not provide a complete practical system for encryption or authentication.[1] Rivest, Shamir, and Adleman sought to realize the first practical public-key cryptosystem that could support both secure message encryption and digital signatures, addressing the key distribution challenges inherent in traditional symmetric cryptography.[1][6] It was later revealed that a comparable public-key encryption scheme based on the difficulty of integer factorization had been invented in 1973 by Clifford Cocks at the UK Government Communications Headquarters (GCHQ). Due to its classified status, it had no influence on public developments and remained secret until declassified and disclosed in 1997.[7][8]Publication and patent
The RSA cryptosystem was first popularized through an August 1977 column by Martin Gardner in Scientific American, titled "A new kind of cipher that would take millions of years to break," which described the concept of public-key encryption and included a challenge based on the method later known as RSA.[9] Rivest, Shamir, and Adleman formally published their work as "A Method for Obtaining Digital Signatures and Public-Key Cryptosystems" in the February 1978 issue of Communications of the ACM (Volume 21, Issue 2, pp. 120–126).[10] MIT filed a patent application for the invention on December 14, 1977, which was granted as U.S. Patent 4,405,829 ("Cryptographic communications system and method") on September 20, 1983, with Ronald L. Rivest, Adi Shamir, and Leonard M. Adleman as inventors and the Massachusetts Institute of Technology as assignee.[11] In 1982, the inventors founded RSA Security (initially RSA Data Security, Inc.) to commercialize the patented technology.[5] The patent expired on September 21, 2000, after which the RSA algorithm entered the public domain.[12]Adoption and standardization
RSA has been broadly adopted across cryptographic standards and Internet protocols since the expiration of its primary patent in 2000, establishing it as a foundational asymmetric algorithm in secure communications. The primary standardization of RSA is found in PKCS #1 (Public-Key Cryptography Standards #1), which specifies RSA encryption schemes, signature schemes with appendix, and associated padding methods. Originally developed by RSA Laboratories, it was published by the IETF as RFC 3447 and later updated to RFC 8017, providing implementation recommendations used in various protocols.[13] RSA became integral to several widely deployed protocols: S/MIME for secure email encryption and signing, TLS (and its predecessor SSL) for securing web traffic, SSH for secure remote access, and PGP/OpenPGP for email protection. These integrations rely on PKCS #1 specifications for RSA operations.[14] Relevant IETF RFCs formalizing RSA usage include RFC 4432, which defines an RSA-based key exchange method for SSH.[15] To address increasing computational capabilities, standards bodies such as NIST mandated transitions to stronger key lengths. In the early 2010s, NIST guidelines (SP 800-131A) required a shift from 1024-bit to 2048-bit RSA keys for many applications, with a transition period ending in 2013 for most federal systems. This change became industry practice for certificates and protocols to maintain adequate security margins.[16] Although elliptic curve cryptography has gained adoption for efficiency in some contexts, RSA remains extensively used in legacy and current deployments across these standards.Mathematical foundations
Integer factorization problem
The security of the RSA cryptosystem fundamentally depends on the computational difficulty of the integer factorization problem for large semiprimes—that is, factoring a composite modulus (where and are large distinct primes) to recover the prime factors and .[1] In their original 1978 paper, Rivest, Shamir, and Adleman stated that the method's security rests in part on the difficulty of factoring large numbers, noting that factoring would enable an adversary to compute Euler's totient function and thus derive the private exponent.[1] No polynomial-time algorithm is known for factoring large semiprimes on classical computers, and the problem is widely believed to be hard in this setting.[17] The best classical algorithms, such as the number field sieve, run in subexponential time, but remain computationally infeasible for properly chosen moduli of sufficient size (typically 2048 bits or larger in current practice).[18] RSA's security therefore relies on this infeasibility: if an efficient factoring algorithm were discovered for such semiprimes, the system could be broken by factoring the public modulus to recover the private key.[1][17] This assumption holds for classical computation, but quantum computers running Shor's algorithm can factor large integers efficiently, posing a potential future threat to RSA.[19]Euler's theorem and totient function
The correctness of RSA decryption is grounded in Euler's theorem, which states that if two integers and are coprime (i.e., ), then , where is Euler's totient function.$$](https://people.csail.mit.edu/rivest/Rsapaper.pdf) Euler's totient function counts the positive integers up to that are relatively prime to . For where and are distinct primes, .[](https://people.csail.mit.edu/rivest/Rsapaper.pdf) This theorem provides the basis for why raising a ciphertext to the private exponent recovers the plaintext. Since the public exponent and private exponent satisfy , it follows that for some integer . For a message with ,[m^{ed} = m^{k \phi(n) + 1} = (m^{\phi(n)})^k \cdot m \equiv 1^k \cdot m \equiv m \pmod{n}](https://ocw.mit.edu/courses/6-042j-mathematics-for-computer-science-spring-2015/mit6_042js15_session14.pdf) The original RSA paper establishes this for the coprime case and extends it to all (even when ) by considering congruences modulo and separately using Fermat's little theorem (a special case of Euler's theorem for primes), combined with the Chinese Remainder Theorem, showing holds in general.[](https://people.csail.mit.edu/rivest/Rsapaper.pdf) An alternative bound uses the Carmichael function , the exponent of the multiplicative group modulo (the smallest exponent such that for all coprime to ). Since divides , choosing such that also suffices for the correctness proof, and because and are even, is often smaller than , potentially yielding a smaller private exponent.[](https://www.math.stonybrook.edu/~scott/Book331/RSA_Public_key.html) This number-theoretic foundation justifies computing as the modular inverse of modulo or .
Modular exponentiation
Modular exponentiation is the process of efficiently computing for large exponents , a critical operation in RSA since both encryption () and decryption () involve such large modular powers.[20] The standard approach is binary exponentiation, also called the square-and-multiply algorithm, which exploits the binary representation of the exponent to reduce the number of multiplications dramatically compared to naive repeated multiplication.[21] In the right-to-left variant (also known as the binary method iterative form), initialize result to 1 and base to ; then, while the exponent , if is odd multiply result by the current base (modulo ), square the base (modulo ), and right-shift by one bit (divide by 2). This processes bits from least to most significant.[21] In the left-to-right variant, initialize result to 1; then scan the binary digits of from most to least significant bit, squaring result (modulo ) at each step and, if the bit is 1, multiplying result by (modulo ). This accumulates the result progressively.[22] Both variants perform multiplications: approximately squarings plus up to additional multiplications (depending on the number of 1-bits in 's binary representation), yielding overall time complexity of .[20][23] This logarithmic efficiency makes modular exponentiation practical in RSA despite exponents that may exceed 2000 bits in size.[20]Key generation
Prime selection and modulus computation
In the RSA key generation process, the first step is to select two large, distinct prime numbers, denoted as p and q. These primes are chosen randomly and must remain secret, as the security of the entire system depends on the difficulty of factoring their product back into the original factors. The modulus n is then computed as the product n = p \times q. The value of n forms part of the public key and is shared openly, while p and q remain private. To achieve adequate security, p and q must be of the same bit length (each half the bit length of n) according to standards such as FIPS 186-5. For instance, in a 2048-bit modulus, each prime is 1024 bits long. This ensures n cannot be factored efficiently using algorithms that exploit unbalanced factors.[24] Additionally, p and q should not be too close in value. If |p - q| is small relative to \sqrt{n}, Fermat's factoring method can recover the factors efficiently. To mitigate this, standards such as FIPS 186-5 require that if |p - q| ≤ 2^{nlen/2 - 100}, the primes are rejected and new ones generated, where nlen is the bit length of n. In practice, random selection of large primes makes such close pairs extremely unlikely.[24] Early recommendations included the use of "strong primes" (primes with specific structural properties to resist certain factoring methods like Pollard's p-1 algorithm). However, subsequent analysis concluded that strong primes provide only negligible additional security compared to randomly selected large primes of equivalent size, as more powerful attacks like the elliptic curve method and number field sieve dominate the security considerations.[25][26]Public and private exponent selection
After the modulus has been computed, the next step in RSA key generation is the selection of the exponents. Euler's totient function is computed. Alternatively, the Carmichael function may be used in place of , as it divides and suffices for computing a valid private exponent while sometimes yielding a smaller value.[27][28] The public exponent is chosen as an integer satisfying and .[27][29] The overwhelmingly common choice in practice is (or ), a Fermat prime with a low Hamming weight (only two 1-bits in binary representation), which enables efficient modular exponentiation during encryption and decryption.[27][28] The private exponent is then computed as the modular multiplicative inverse of modulo (or ), so that (or modulo ). This inverse is efficiently found using the extended Euclidean algorithm.[1][29] The resulting public key is the pair , shared openly, while the private key is (kept secret). In practice, implementations often augment the private key with , , and precomputed values (such as Chinese Remainder Theorem coefficients) to accelerate decryption.[28]Encryption
Message encoding and padding
In the RSA cryptosystem, the plaintext message—typically an arbitrary octet string—must be converted into an integer m satisfying 0 ≤ m < n, where n is the modulus component of the public key. This conversion occurs after the message is processed by a padding scheme to form a fixed-length encoded octet string, which is then interpreted as a big-endian integer using the Octet String to Integer Primitive (OS2IP).[30] Direct application of RSA to an unpadded or minimally encoded message—known as textbook or raw RSA—is insecure and not recommended for practical use.[31] Raw RSA produces deterministic ciphertexts, so identical plaintexts always yield identical ciphertexts, potentially leaking information about message patterns or contents. It is also multiplicatively homomorphic, enabling malleability attacks where an attacker can modify a ciphertext to produce a related plaintext without knowledge of the private key.[32] Furthermore, raw RSA is vulnerable to chosen-ciphertext attacks, including scenarios where an attacker submits specially crafted ciphertexts to a decryption oracle and learns information about the target plaintext. Additional risks arise when small public exponents (such as e = 3) are used with multiple recipients encrypting the same message, allowing combination of ciphertexts via the Chinese Remainder Theorem to recover the plaintext through simple root extraction.[32] Secure padding addresses these vulnerabilities by introducing randomness, structural redundancy, and probabilistic encoding, making encryption non-deterministic and resistant to known attacks. Modern RSA implementations mandate standardized padding schemes—such as RSAES-OAEP (recommended for new applications due to its provable security against adaptive chosen-ciphertext attacks) or the legacy RSAES-PKCS1-v1_5—to ensure the encoded message is cryptographically robust before conversion to the integer m.[30][31] Padding is thus mandatory to distinguish secure RSA usage from the insecure textbook version and to protect against the fundamental weaknesses of raw modular exponentiation.Ciphertext computation
In RSA encryption, the sender uses the recipient's public key to compute the ciphertext from the message representative (an integer satisfying ). The core operation is modular exponentiation: the ciphertext is obtained as [ c \equiv m^e \pmod{n}. $$ [1] This step, which directly produces the ciphertext, is formally defined as , where denotes the encryption function.[1] The computation of is performed efficiently using modular exponentiation algorithms, such as exponentiation by squaring (also known as binary exponentiation). This method represents the exponent in binary form and iteratively applies squaring and multiplication steps while reducing modulo , requiring on the order of multiplications rather than the naive approach. In the original description of RSA, this is accomplished via "exponentiation by repeated squaring and multiplication."[1]Decryption
Plaintext recovery
In RSA decryption, the legitimate recipient uses their private exponent d to recover the original plaintext message m from the received ciphertext c via a single modular exponentiation operation: where n is the public modulus.[1][2][33] This step computes c raised to the power d modulo n, which restores m because d is the modular inverse of the public exponent e modulo φ(n) (or λ(n)), satisfying ed ≡ 1 (mod φ(n)). By Euler's theorem (or equivalent group-theoretic properties), raising the ciphertext to d undoes the encryption exponentiation.[2] In practice, this modular exponentiation is performed efficiently using algorithms such as binary (square-and-multiply) exponentiation, which requires only O(log d) modular multiplications even for very large exponents d.[33]Message reconstruction
After modular decryption, the resulting integer—representing the padded message—is converted to an octet string whose length equals the byte length of the modulus. This octet string is then processed according to the reverse steps of the padding scheme to verify its structure and extract the original message. If verification succeeds, the padding bytes are removed, yielding the embedded message; if it fails, the process rejects the result and typically returns an error without further disclosure.[30] Padding verification is essential to security. Failure to perform rigorous checks—or implementations that leak information about validity through distinguishable error messages, timing differences, or other side channels—can enable adaptive chosen-ciphertext attacks. For example, the Bleichenbacher attack exploits variations in error responses during PKCS#1 v1.5 padding checks, allowing an attacker to use the decryption system as an oracle to gradually decrypt arbitrary ciphertexts by probing whether modified versions have valid padding.[2] The specification for RSA encryption schemes stresses that error conditions must be indistinguishable to prevent such information leakage, which could otherwise facilitate attacks like Bleichenbacher's on PKCS#1 v1.5 or Manger's on early OAEP variants.[30] Proper verification ensures that only well-formed, legitimately padded messages are accepted, protecting against maliciously crafted ciphertexts that aim to reveal partial plaintext or enable forgery. The specific reversal procedures and checks depend on the padding scheme employed, which are described in the Padding schemes section.Illustrative example
Small numerical example
A small numerical example illustrates the complete RSA process using tiny numbers for pedagogical clarity. Select two distinct prime numbers: p = 3 and q = 11. Compute the modulus n = p × q = 33. Compute Euler's totient function φ(n) = (p-1)(q-1) = 2 × 10 = 20. Choose a public exponent e = 7, which satisfies 1 < e < φ(n) and gcd(e, φ(n)) = 1. Compute the private exponent d as the modular inverse of e modulo φ(n), yielding d = 3 since 7 × 3 = 21 ≡ 1 (mod 20). The public key is (n, e) = (33, 7), and the private key is d = 3.[34][35] To encrypt a message m = 2 (where 0 ≤ m < n), compute the ciphertext c = m^e mod n = 2^7 mod 33. First, 2^7 = 128, and 128 mod 33 = 29 (since 128 = 3 × 33 + 29). Thus, c = 29.[34][35] To decrypt, compute the plaintext m = c^d mod n = 29^3 mod 33. First, 29^2 = 841, and 841 mod 33 = 16 (since 841 = 25 × 33 + 16). Then, 29 × 16 = 464, and 464 mod 33 = 2 (since 464 = 14 × 33 + 2). The original message m = 2 is recovered.[35] This toy example demonstrates the mathematical correctness of RSA, though real implementations use vastly larger primes.Step-by-step walkthrough
The following small example demonstrates the RSA algorithm in action using deliberately tiny primes for pedagogical clarity. Note that real-world RSA employs primes with hundreds of digits to ensure security; this toy case serves only to illustrate the mechanics. Key generation steps:- Select two distinct prime numbers: and .
- Compute the modulus .
- Compute Euler's totient .
- Choose a public exponent such that and . Here, select (since ).
- Compute the private exponent as the modular inverse of modulo , i.e., solve . Testing shows , so .
- First, . Then : , remainder , so .
- Next, . Then : , remainder , so .
Security
Core security assumption
The core security assumption of the RSA cryptosystem is the computational hardness of the RSA problem, which involves recovering the original plaintext message m from the ciphertext c = m^e mod n given only the public key (n, e) and without knowledge of the private exponent d or the factorization of n.[2] This problem is widely believed to be computationally infeasible for sufficiently large moduli n, as no known polynomial-time classical algorithm can solve it efficiently.[2] The RSA problem is tightly connected to the difficulty of integer factorization: the most efficient known approach to solving it requires factoring n = p × q into its prime factors, after which the private key d can be computed efficiently to decrypt any ciphertext.[2] Although a general proof of equivalence between solving the RSA problem and factoring n remains an open question (with some evidence suggesting separation for small public exponents e), in models such as the generic ring model of computation, breaking RSA has been proven equivalent to factoring the modulus.[36] This assumption forms the foundation of RSA's security, though quantum computers pose a potential threat by using Shor's algorithm to efficiently factor large composites.[37]Recommended key sizes
Recommended key sizes The security of RSA depends on the difficulty of factoring the modulus n, which increases with larger key sizes, necessitating periodic increases in recommended modulus lengths as computational capabilities advance and factoring algorithms improve. Historically, smaller key sizes were once considered sufficient but have since been compromised. A 512-bit RSA modulus (RSA-155) was successfully factored in 1999 using the number field sieve, demonstrating that such sizes offered inadequate protection.[38] By the early 2010s, 1024-bit keys provided roughly 80 bits of security strength and were deemed insecure for new applications; NIST disallowed their use for applying cryptographic protection after 2013, with broader phase-out in protocols like TLS following in the mid-2010s.[39][40] Current best practices, as outlined in NIST Special Publication 800-57 Part 1 Revision 5 (2020), recommend a minimum RSA modulus size of 2048 bits, which corresponds to approximately 112 bits of security strength and is acceptable for new applications through 2030.[39] For protection beyond 2030 or applications requiring higher security levels, NIST recommends at least 3072 bits (approximately 128 bits of security strength).[39] Larger sizes, such as 7680 bits (192 bits security) or 15360 bits (256 bits security), are indicated for even stronger or long-term requirements.[39] In practice, many implementations and standards bodies align with these guidelines, often using 2048 bits as the modern minimum and 3072 bits or more for extended protection periods. NIST guidance emphasizes transitioning to these or larger sizes to maintain security against evolving threats.[39]Known vulnerabilities and mitigations
RSA implementations have faced numerous vulnerabilities stemming primarily from flawed key generation, side-channel leaks, improper padding, and low public exponents, rather than fundamental breaks in the underlying mathematical problem. A significant class of vulnerabilities arises from poor prime generation during key setup. For instance, the ROCA (Return Of Coppersmith's Attack) vulnerability affected RSA keys produced by certain Infineon TPM and Secure Element chips due to a defect in their key generation library, enabling factorization of affected keys with substantially reduced effort compared to standard factoring attacks.[41] This flaw impacted devices such as enterprise PCs, servers, smart cards, and Chrome OS systems, with estimated costs to break a 2048-bit key around $20,000 and a 1024-bit key around $40.[41] Mitigations include firmware updates from manufacturers, revoking and regenerating affected keys, and following vendor guidance from entities such as Microsoft and Google.[41] Side-channel attacks exploit physical or computational observables during execution. Timing attacks, such as the remote attack on OpenSSL-based SSL servers by Brumley and Boneh, leverage variations in modular reduction time during RSA decryption (e.g., extra reductions in Montgomery multiplication) to recover the private key over a network using millions of carefully timed queries.[42] Cache-based attacks, including instruction cache analysis on OpenSSL implementations, detect extra reduction steps in Montgomery multiplication by monitoring cache conflicts, allowing extraction of the secret exponent even with some countermeasures enabled.[43] Power analysis and other physical side channels similarly leak information about the private key through consumption patterns. Mitigations include RSA blinding (multiplying the ciphertext by a random factor before decryption and removing it afterward), constant-time implementations that eliminate data-dependent branches and operations, and defenses such as fixed-window exponentiation or removal of extra reduction steps in libraries.[42][43] Padding-related attacks target insecure padding schemes. Bleichenbacher's attack exploits PKCS#1 v1.5 padding oracle behavior, where decryption error messages reveal partial information about the plaintext, enabling adaptive chosen-ciphertext recovery of messages. This vulnerability has persisted in various protocols and implementations. Proper padding schemes such as OAEP provide resistance to many such attacks. Attacks exploiting low public exponents (e.g., e=3) include Coppersmith's method, which recovers small or stereotyped message portions when the unknown part is sufficiently small relative to the modulus (e.g., less than N^{1/3} for e=3), or recovers messages from related ciphertexts with limited random padding.[44] Recommendations include using larger exponents (such as 65537), applying strong random padding to prevent small or predictable messages, and avoiding direct encryption of raw messages.[44] Overall, mitigations emphasize constant-time code to prevent side-channel leaks, secure padding schemes, careful prime generation following standards, and reliance on vetted cryptographic libraries rather than custom implementations.[45]Padding schemes
PKCS#1 v1.5 padding
PKCS#1 v1.5 padding is the original padding scheme defined in PKCS #1 version 1.5 for RSA operations. For RSA encryption, it uses the EME-PKCS1-v1_5 encoding (block type 02), forming the encoded message as00 || 02 || PS || 00 || M, where PS is a string of pseudorandom nonzero octets of length at least 8, and M is the message (with length at most k − 11 octets, k being the octet length of the modulus).[46][30]
The leading 00 octet ensures the encoded value is less than the modulus when interpreted as an integer, while the nonzero PS and minimum length provide basic resistance to brute-force attacks on small messages.[46]
This padding remains in use for legacy TLS RSA key exchange modes and many RSA digital signatures (under RSASSA-PKCS1-v1_5, which uses a different format with block type 01 and FF octets in the padding string).[30]
However, PKCS#1 v1.5 encryption padding is vulnerable to Bleichenbacher's adaptive chosen-ciphertext attack (also known as the padding oracle attack), which exploits information from decryption error responses to determine whether a ciphertext conforms to valid padding and gradually recover the plaintext or perform unauthorized RSA operations.[47]
Due to this vulnerability and related risks, RFC 8017 retains RSAES-PKCS1-v1_5 only for compatibility with existing applications, does not recommend it for encrypting arbitrary messages (preferring random keys), and requires RSAES-OAEP for new encryption applications.[30]
Optimal Asymmetric Encryption Padding (OAEP)
Optimal Asymmetric Encryption Padding (OAEP) is a padding scheme designed to enable secure RSA encryption by transforming the RSA trapdoor permutation into a public-key encryption scheme with provable security in the random oracle model. Introduced by Mihir Bellare and Phillip Rogaway, OAEP is intended to provide semantic security against adaptive chosen-ciphertext attacks (CCA2) when properly instantiated.[48] The construction uses two hash functions (modeled as random oracles) and a mask generation function to embed randomness and structure into the message. A random seed is chosen, combined with the message through XOR operations with hash-derived masks, ensuring the encoded input to RSA appears unpredictable and resists manipulation. The plaintext-awareness property contributes to its security design.[48] In practice, OAEP is implemented as RSAES-OAEP in PKCS#1 version 2.2, standardized in RFC 8017. This specification uses MGF1 (Mask Generation Function 1) as the recommended mask generation function, which produces pseudorandom octet strings from a seed via iterative application of a hash function (such as SHA-256). An optional label (typically empty) is hashed and incorporated, and the encoding process involves masking a data block (containing the message and padding) and the seed to form the final input for RSA encryption. Decryption reverses the masking and verifies consistency to recover the message.[30] RSAES-OAEP provides stronger security than earlier padding schemes for encryption, with proofs relating its security to the RSA problem in the random oracle model. The proof, while valid in the random oracle model, features an inefficient reduction. It confirms robustness against adaptive chosen-ciphertext attacks assuming the hardness of RSA inversion.[30] OAEP is recommended for new applications requiring RSA-based encryption due to its provable security guarantees in the random oracle model.[30]Performance and implementation
Computational optimizations
RSA implementations employ several computational optimizations to accelerate the expensive modular exponentiation operations, particularly during decryption (computing ) and signing. The primary optimization is the application of the Chinese Remainder Theorem (CRT) to decryption. Instead of performing a single exponentiation modulo the full modulus , the computation is split into two independent exponentiations modulo the prime factors and , which are then recombined using CRT. This approach leverages the fact that the bit-length of and is approximately half that of , and the cost of modular exponentiation scales roughly cubically with bit-length. Thus, two exponentiations on half-sized moduli cost about one-quarter as much as one full-sized exponentiation, yielding an overall speedup factor of approximately four.[49][50] To enable this, private keys store precomputed CRT parameters: , , and . Decryption then proceeds as follows:- Compute
- Compute
- Compute
- Recover the plaintext (using Garner's formula)
