Hubbry Logo
RSA cryptosystemRSA cryptosystemMain
Open search
RSA cryptosystem
Community hub
RSA cryptosystem
logo
7 pages, 0 posts
0 subscribers
Be the first to start a discussion here.
Be the first to start a discussion here.
RSA cryptosystem
RSA cryptosystem
from Wikipedia
RSA cryptosystem
General
DesignersRon Rivest, Adi Shamir, and Leonard Adleman
First published1977
CertificationPKCS#1, ANSI X9.31
Cipher detail
Key sizesvariable but typically 2,048 to 4,096 bits
Rounds1
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]
Adi Shamir, co-inventor of RSA (the others are Ron Rivest and Leonard Adleman)

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 xey (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:

  1. 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.
  2. 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.
  3. 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(ab) = |ab|/gcd(ab).
    • λ(n) is kept secret.
  4. 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.
  5. Determine d as de−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 de ≡ 1 (mod φ(n)) also satisfies de ≡ 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]

  1. Choose two distinct prime numbers, such as
    and .
  2. Compute n = pq giving
  3. Compute the Carmichael's totient function of the product as λ(n) = lcm(p − 1, q − 1) giving
  4. 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 .
  5. 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 sem (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 medm (mod p), we consider two cases:

  1. If m ≡ 0 (mod p), m is a multiple of p. Thus med is a multiple of p. So med ≡ 0 ≡ m (mod p).
  2. If m ≢ 0 (mod p),
    where we used Fermat's little theorem to replace mp−1 mod p with 1.

The verification that medm (mod q) proceeds in a completely analogous way:

  1. If m ≡ 0 (mod q), med is a multiple of q. So med ≡ 0 ≡ m (mod q).
  2. 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]
  1. ^ We cannot trivially break RSA by applying the theorem (mod pq) because pq is not prime.
  2. ^ 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)).
  3. ^ 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 medm (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 + (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 cme (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 cme (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, 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]

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 pq is less than 2n1/4 (n = pq, 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′ = pq 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]

References

[edit]

Further reading

[edit]
[edit]
Revisions and contributorsEdit on WikipediaRead on Wikipedia
from Grokipedia
RSA (Rivest–Shamir–Adleman) is a public-key cryptosystem invented in 1977 by Ron Rivest, Adi Shamir, and Leonard Adleman at MIT. It is one of the earliest and most widely deployed asymmetric encryption algorithms, enabling secure communication without prior key exchange by using a pair of keys: a public key for encryption and a private key for decryption. The security of RSA fundamentally relies on the computational difficulty of factoring the product of two large prime numbers, a problem that remains hard for properly sized keys despite extensive study. In the RSA system, key generation involves selecting two large secret prime numbers p and q, computing the modulus n = p × q, and deriving a public exponent e and private exponent d such that e × d ≡ 1 mod (p-1)(q-1) (using Euler's totient function). The public key is the pair (n, e), which can be openly shared, while the private key d (or equivalently (n, d)) is kept secret. Encryption of a message M (represented as an integer between 0 and n-1) produces ciphertext C = M^e mod n, and decryption recovers M = C^d mod n. This mechanism provides both confidentiality and, when used in reverse (encrypting with the private key), non-repudiable digital signatures that can be verified with the public key. RSA was first described in a 1977 paper that introduced the concept of a trapdoor one-way permutation, allowing public revelation of an encryption key without compromising the corresponding decryption key. The system solved the key distribution problem inherent in symmetric cryptography, as messages could be encrypted using a publicly available key and only the intended recipient could decrypt them. By 1998, after twenty years of analysis, RSA had become a cornerstone of commercial systems for securing digital communications, email, remote logins, and electronic payments, with no fundamental breaks found when properly implemented. Modern deployments of RSA typically use moduli of 2048 bits or larger to maintain security against factoring attacks, such as those based on the General Number Field Sieve. While RSA remains prevalent for digital signatures in protocols like HTTPS (where it authenticates servers and certificates), its use for key exchange has declined in favor of alternatives like Diffie-Hellman due to evolving performance and security considerations. Proper implementation is critical: vulnerabilities often arise from misuse, such as small exponents, , or poor random number generation, rather than the core algorithm itself. As of recent analyses, RSA continues to provide robust security for many applications when configured with recommended parameters.

History

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). 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. 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. 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. 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.

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. 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). 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. In 1982, the inventors founded RSA Security (initially RSA Data Security, Inc.) to commercialize the patented technology. The patent expired on September 21, 2000, after which the RSA algorithm entered the public domain.

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 (), 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. 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 specifications for RSA operations. Relevant IETF formalizing RSA usage include RFC 4432, which defines an RSA-based key exchange method for SSH. 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 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. 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 n=p×qn = p \times q (where pp and qq are large distinct primes) to recover the prime factors pp and qq. 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 nn would enable an adversary to compute Euler's totient function and thus derive the private exponent. 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. 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). 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. 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.

Euler's theorem and totient function

The correctness of RSA decryption is grounded in Euler's theorem, which states that if two integers aa and nn are coprime (i.e., gcd(a,n)=1\gcd(a, n) = 1), then aϕ(n)1(modn)a^{\phi(n)} \equiv 1 \pmod{n}, where ϕ\phi is Euler's totient function.$$](https://people.csail.mit.edu/rivest/Rsapaper.pdf) Euler's totient function ϕ(n)\phi(n) counts the positive integers up to nn that are relatively prime to nn. For n=pqn = pq where pp and qq are distinct primes, ϕ(n)=(p1)(q1)\phi(n) = (p-1)(q-1).[](https://people.csail.mit.edu/rivest/Rsapaper.pdf) This theorem provides the basis for why raising a to the private exponent recovers the plaintext. Since the public exponent ee and private exponent dd satisfy ed1(modϕ(n))ed \equiv 1 \pmod{\phi(n)}, it follows that ed=kϕ(n)+1ed = k \phi(n) + 1 for some integer kk. For a message mm with gcd(m,n)=1\gcd(m, n) = 1,
[m^{ed} = m^{k \phi(n) + 1} = (m^{\phi(n)})^k \cdot m \equiv 1^k \cdot m \equiv m \pmod{n}byEulerstheorem. by Euler's theorem.](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 mm (even when gcd(m,n)1\gcd(m, n) \neq 1) by considering congruences modulo pp and qq separately using Fermat's little theorem (a special case of Euler's theorem for primes), combined with the Chinese Remainder Theorem, showing medm(modn)m^{ed} \equiv m \pmod{n} holds in general.[](https://people.csail.mit.edu/rivest/Rsapaper.pdf) An alternative bound uses the Carmichael function λ(n)=lcm(p1,q1)\lambda(n) = \operatorname{lcm}(p-1, q-1), the exponent of the multiplicative group modulo nn (the smallest exponent such that aλ(n)1(modn)a^{\lambda(n)} \equiv 1 \pmod{n} for all aa coprime to nn). Since λ(n)\lambda(n) divides ϕ(n)\phi(n), choosing dd such that ed1(modλ(n))ed \equiv 1 \pmod{\lambda(n)} also suffices for the correctness proof, and because p1p-1 and q1q-1 are even, λ(n)\lambda(n) is often smaller than ϕ(n)\phi(n), potentially yielding a smaller private exponent.[](https://www.math.stonybrook.edu/~scott/Book331/RSA_Public_key.html) This number-theoretic foundation justifies computing dd as the modular inverse of ee modulo ϕ(n)\phi(n) or λ(n)\lambda(n).

Modular exponentiation

Modular exponentiation is the process of efficiently computing xymodmx^y \mod m for large exponents yy, a critical operation in RSA since both encryption (memodnm^e \mod n) and decryption (cdmodnc^d \mod n) involve such large modular powers. 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. In the right-to-left variant (also known as the binary method iterative form), initialize result to 1 and base to xx; then, while the exponent y>0y > 0, if yy is odd multiply result by the current base (modulo mm), square the base (modulo mm), and right-shift yy by one bit (divide by 2). This processes bits from least to most significant. In the left-to-right variant, initialize result to 1; then scan the binary digits of yy from most to least significant bit, squaring result (modulo mm) at each step and, if the bit is 1, multiplying result by xx (modulo mm). This accumulates the result progressively. Both variants perform O(logy)O(\log y) multiplications: approximately log2y\log_2 y squarings plus up to log2y\log_2 y additional multiplications (depending on the number of 1-bits in yy's binary representation), yielding overall time complexity of O(logy)O(\log y). This logarithmic efficiency makes modular exponentiation practical in RSA despite exponents that may exceed 2000 bits in size.

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. 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. 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.

Public and private exponent selection

After the modulus nn has been computed, the next step in RSA key generation is the selection of the exponents. Euler's totient function ϕ(n)=(p1)(q1)\phi(n) = (p-1)(q-1) is computed. Alternatively, the Carmichael function λ(n)=lcm(p1,q1)\lambda(n) = \operatorname{lcm}(p-1, q-1) may be used in place of ϕ(n)\phi(n), as it divides ϕ(n)\phi(n) and suffices for computing a valid private exponent while sometimes yielding a smaller value. The public exponent ee is chosen as an integer satisfying 1<e<ϕ(n)1 < e < \phi(n) and gcd(e,ϕ(n))=1\gcd(e, \phi(n)) = 1. The overwhelmingly common choice in practice is e=65537e = 65537 (or 216+12^{16} + 1), a Fermat prime with a low Hamming weight (only two 1-bits in binary representation), which enables efficient modular exponentiation during encryption and decryption. The private exponent dd is then computed as the modular multiplicative inverse of ee modulo ϕ(n)\phi(n) (or λ(n)\lambda(n)), so that de1(modϕ(n))de \equiv 1 \pmod{\phi(n)} (or modulo λ(n)\lambda(n)). This inverse is efficiently found using the extended Euclidean algorithm. The resulting public key is the pair (n,e)(n, e), shared openly, while the private key is dd (kept secret). In practice, implementations often augment the private key with pp, qq, and precomputed values (such as Chinese Remainder Theorem coefficients) to accelerate decryption.

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 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). Direct application of RSA to an —known as textbook or raw RSA—is insecure and not recommended for practical use. 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. 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. addresses these vulnerabilities by introducing randomness, structural redundancy, and probabilistic encoding, making encryption non-deterministic and resistant to known attacks. Modern RSA implementations mandate —such as (recommended for new applications due to its provable security against adaptive chosen-ciphertext attacks) or the legacy —to ensure the encoded message is cryptographically robust before conversion to the integer m. 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 (n,e)(n, e) to compute the from the message representative mm (an integer satisfying 0m<n0 \leq m < n). The core operation is modular exponentiation: the ciphertext cc is obtained as [ c \equiv m^e \pmod{n}. $$ This step, which directly produces the , is formally defined as cE(m)me(modn)c \equiv E(m) \equiv m^e \pmod{n}, where EE denotes the encryption function. The computation of memodnm^e \mod n is performed efficiently using modular exponentiation algorithms, such as exponentiation by squaring (also known as binary exponentiation). This method represents the exponent ee in binary form and iteratively applies squaring and multiplication steps while reducing modulo nn, requiring on the order of O(loge)\mathcal{O}(\log e) multiplications rather than the naive O(e)\mathcal{O}(e) approach. In the original description of RSA, this is accomplished via "exponentiation by repeated squaring and multiplication."

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: mcd(modn)m \equiv c^d \pmod{n} where n is the public modulus. 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 to d undoes the encryption exponentiation. 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.

Message reconstruction

After modular decryption, the resulting integer—representing the —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 to verify its structure and extract the original message. If verification succeeds, the are removed, yielding the embedded message; if it fails, the process rejects the result and typically returns an error without further disclosure. 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 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. 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 or Manger's on early OAEP variants. 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. To encrypt a message m = 2 (where 0 ≤ m < n), compute the 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. 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. 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:
  1. Select two distinct prime numbers: p=3p = 3 and q=11q = 11.
  2. Compute the modulus n=p×q=3×11=33n = p \times q = 3 \times 11 = 33.
  3. Compute Euler's totient ϕ(n)=(p1)(q1)=2×10=20\phi(n) = (p-1)(q-1) = 2 \times 10 = 20.
  4. Choose a public exponent ee such that 1<e<ϕ(n)1 < e < \phi(n) and gcd(e,ϕ(n))=1\gcd(e, \phi(n)) = 1. Here, select e=7e = 7 (since gcd(7,20)=1\gcd(7, 20) = 1).
  5. Compute the private exponent dd as the modular inverse of ee modulo ϕ(n)\phi(n), i.e., solve e×d1(modϕ(n))e \times d \equiv 1 \pmod{\phi(n)}. Testing shows 7×3=211(mod20)7 \times 3 = 21 \equiv 1 \pmod{20}, so d=3d = 3.
The resulting public key is the pair (n,e)=(33,7)(n, e) = (33, 7), which can be shared openly. The private key is d=3d = 3 (or the pair (n,d)=(33,3)(n, d) = (33, 3)), which is kept secret. Encryption steps: Assume the plaintext message is encoded as an integer m=2m = 2 (with 0m<n0 \leq m < n; in practice, would be applied, but none is used here for simplicity). Compute the ciphertext c=memodn=27mod33c = m^e \mod n = 2^7 \mod 33:
  • 21=22^1 = 2
  • 22=42^2 = 4
  • 23=82^3 = 8
  • 24=162^4 = 16
  • 25=322^5 = 32
  • 26=646433×1=31(mod33)2^6 = 64 \equiv 64 - 33 \times 1 = 31 \pmod{33}
  • 27=2×31=626233=29(mod33)2^7 = 2 \times 31 = 62 \equiv 62 - 33 = 29 \pmod{33}
Thus, c=29c = 29. This is transmitted to the recipient. Decryption steps: The recipient, knowing the private key, computes the plaintext m=cdmodn=293mod33m = c^d \mod n = 29^3 \mod 33:
  • First, 292=84129^2 = 841. Then 841÷33841 \div 33: 33×25=82533 \times 25 = 825, remainder 841825=16841 - 825 = 16, so 29216(mod33)29^2 \equiv 16 \pmod{33}.
  • Next, 29329×16=464(mod33)29^3 \equiv 29 \times 16 = 464 \pmod{33}. Then 464÷33464 \div 33: 33×14=46233 \times 14 = 462, remainder 464462=2464 - 462 = 2, so 2932(mod33)29^3 \equiv 2 \pmod{33}.
The original message m=2m = 2 is recovered exactly. This confirms the algorithm's correctness for this instance. In practice, modular exponentiation algorithms such as square-and-multiply are used for efficiency with large exponents, but direct computation suffices here due to the small numbers.

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 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. 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. 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 . 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. 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. 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. 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. 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. For protection beyond 2030 or applications requiring higher security levels, NIST recommends at least 3072 bits (approximately 128 bits of security strength). Larger sizes, such as 7680 bits (192 bits security) or 15360 bits (256 bits security), are indicated for even stronger or long-term requirements. 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.

Known vulnerabilities and mitigations

RSA implementations have faced numerous vulnerabilities stemming primarily from flawed key generation, side-channel leaks, , 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 due to a defect in their key generation library, enabling factorization of affected keys with substantially reduced effort compared to standard factoring attacks. 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. Mitigations include firmware updates from manufacturers, revoking and regenerating affected keys, and following vendor guidance from entities such as Microsoft and Google. 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. 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. 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. Padding-related attacks target insecure padding schemes. Bleichenbacher's attack exploits 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 . Recommendations include using larger exponents (such as ), applying strong to prevent small or predictable messages, and avoiding direct encryption of . Overall, mitigations emphasize constant-time code to prevent side-channel leaks, , careful prime generation following standards, and reliance on vetted cryptographic libraries rather than custom implementations.

Padding schemes

PKCS#1 v1.5 padding

is the original padding scheme defined in for RSA operations. For RSA encryption, it uses the (), forming the encoded message as 00 || 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). The leading 00 octet ensures the encoded value is less than the modulus when interpreted as an integer, while the nonzero and minimum length provide basic resistance to brute-force attacks on small messages. This padding remains in use for legacy TLS RSA key exchange modes and many RSA digital signatures (under , which uses a different format with and FF octets in the padding string). However, 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. Due to this vulnerability and related risks, RFC 8017 retains only for compatibility with existing applications, does not recommend it for encrypting arbitrary messages (preferring random keys), and requires for new encryption applications.

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. 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. In practice, OAEP is implemented as RSAES-OAEP in 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. provides stronger security than earlier 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. OAEP is recommended for new applications requiring due to its provable security guarantees in the random oracle model.

Performance and implementation

Computational optimizations

RSA implementations employ several computational optimizations to accelerate the expensive modular exponentiation operations, particularly during decryption (computing cdmodnc^d \mod n) 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 n=p×qn = p \times q, the computation is split into two independent exponentiations modulo the prime factors pp and qq, which are then recombined using CRT. This approach leverages the fact that the bit-length of pp and qq is approximately half that of nn, 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. To enable this, private keys store precomputed CRT parameters: dp=dmod(p1)d_p = d \mod (p-1), dq=dmod(q1)d_q = d \mod (q-1), and qinv=q1modpq_{\text{inv}} = q^{-1} \mod p. Decryption then proceeds as follows:
  • Compute m1=cdpmodpm_1 = c^{d_p} \mod p
  • Compute m2=cdqmodqm_2 = c^{d_q} \mod q
  • Compute h=qinv×(m1m2)modph = q_{\text{inv}} \times (m_1 - m_2) \mod p
  • Recover the plaintext m=m2+h×qm = m_2 + h \times q (using Garner's formula)
These precomputed values reduce the exponents for the smaller moduli and eliminate repeated computation of modular inverses or reductions. Modular exponentiation itself is further accelerated using windowed exponentiation methods (also known as sliding-window or fixed-window techniques). These algorithms precompute small powers of the base (typically up to 2w12^w - 1 for a window size ww, where ww is commonly 4–6), scan the exponent in overlapping or non-overlapping windows, and replace many squarings and multiplications with table lookups and fewer operations. This reduces the average number of multiplications compared to basic square-and-multiply, especially for large exponents. Window size selection balances precomputation cost, memory use, and the number of operations, with larger windows offering better performance for long exponents typical in RSA.

Practical key sizes and hardware considerations

Practical key sizes for RSA typically include 2048 bits as the most commonly deployed option for general-purpose use, with 3072-bit and 4096-bit keys used when higher security margins are required. Larger keys increase resistance to factoring but incur substantial performance costs, including longer computation times and greater memory consumption. On modern general-purpose CPUs, a 2048-bit RSA private-key operation (decryption or signing) generally takes several milliseconds. Benchmarks using optimized libraries show typical decryption times around 6 ms for 2048-bit keys, with encryption (public-key) operations considerably faster at under 1 ms. Hardware acceleration significantly improves RSA performance for high-throughput applications. Dedicated accelerators such as Intel QuickAssist Technology enable tens of thousands of 2048-bit RSA private-key operations per second (approximately 35,000 operations per second in some configurations), far exceeding software-only CPU performance and equivalent to the throughput of multiple CPU cores. Specialized devices like hardware security modules (HSMs) and smart cards provide secure environments for RSA operations, with performance varying by implementation. Enterprise HSMs and PCIe accelerators offer high-speed cryptographic processing, while smart cards prioritize secure key storage over raw speed, often resulting in operation times in the tens to hundreds of milliseconds for 2048-bit keys. For equivalent security levels, elliptic curve cryptography (ECC) provides substantially faster performance than RSA with smaller keys.

Applications

Use in protocols

RSA is integrated into several widely deployed cryptographic protocols, primarily for key exchange, server authentication, and digital signatures. In the Transport Layer Security (TLS) protocol, earlier versions such as TLS 1.2 supported RSA key transport, where a client encrypts a pre-master secret using the server's public RSA key to establish a shared session key. RSA was also used for authentication through signatures in X.509 certificates during the handshake. However, TLS 1.3 removes support for RSA key transport, requiring forward-secret key exchanges based on ephemeral Diffie-Hellman (or equivalent) to enhance security properties. RSA continues to be supported in TLS 1.3 for certificate signatures using schemes such as . In Secure Shell (SSH), RSA key pairs serve as host keys to authenticate servers to clients, enabling verification of server identity and mitigating man-in-the-middle attacks. Clients store known host public keys for comparison during connections. RSA is also commonly used for user public key authentication, where clients prove possession of a private key corresponding to a registered public key. For secure email, both OpenPGP (used in implementations such as PGP) and S/MIME employ RSA for asymmetric encryption of to recipients' public keys and for generating digital signatures to provide authenticity and integrity. In OpenPGP, RSA public keys are used in public-key encrypted session key packets and signature packets. In S/MIME, RSA underpins certificate-based encryption and signing of MIME messages. In IPsec-based Virtual Private Networks, the Internet Key Exchange protocol versions 1 and 2 (IKEv1 and IKEv2) support RSA for authentication. IKEv2 uses RSA signatures (RSA-SIG) to authenticate peers during the exchange of authentication payloads, leveraging X.509 certificates or raw RSA keys. IKEv1 similarly supports RSA-based methods including signatures and encrypted nonces.

Digital signatures with RSA

Digital signatures with RSA use the same public-private key pair as RSA encryption but reverse the roles: the signer applies the private key to produce a signature, while the verifier uses the public key to check it. The signature provides authenticity and integrity by allowing verification that the message originated from the holder of the private key and was not altered. Typically, the message is hashed to a fixed-length digest before signing, as RSA operates on integers up to the modulus size. Two signature schemes are defined in : and . Both use the RSA primitive for signing (RSASP1: s = m^d mod n, where m is the integer from the encoded message) and verification (RSAVP1: m = s^e mod n, where the result is checked against the expected encoding). is a deterministic scheme that encodes the hash value together with its algorithm identifier into a , then applies (starting with 0x00 0x01, followed by 0xFF bytes, 0x00, and the DigestInfo). The signature s is computed from this padded encoding. Verification decrypts the signature and compares the recovered encoding with a freshly computed and encoded hash of the message. This scheme is retained for compatibility with existing applications but is not recommended for new uses due to the lack of a tight security proof and potential future risks. (RSA Probabilistic Signature Scheme) is a probabilistic scheme that incorporates randomness through a salt value, providing provable security in the random oracle model under the RSA assumption. The encoding (EMSA-PSS) hashes the message, combines it with a random salt, applies a mask generation function (MGF1) to randomize parts of the data, and appends a trailer byte (typically 0xbc). Signing produces s from the PSS-encoded representation, while verification unmasks the data, recomputes the salted hash, and checks consistency. RSASSA-PSS is required for new applications because of its stronger security properties and resistance to certain attacks that affect deterministic schemes. For new implementations, should be preferred, and the same RSA key pair should not be used across both schemes to avoid potential cross-scheme vulnerabilities.

References

Add your contribution
Related Hubs
User Avatar
No comments yet.