|
|
# RSA
|
|
|
|
|
|
[TOC]
|
|
|
|
|
|
## RSA key generation
|
|
|
|
|
|
**Default size:** If a library supports a key default size for RSA keys then
|
|
|
this key size should be at least 2048 bits. This limit is based on the minimum
|
|
|
recommendation of [NIST SP 800-57] part1 revision 4, Table 2, page 53. NIST
|
|
|
recommends a minimal security strength of 112 bits for keys used until 2030. 112
|
|
|
bit security strength translates to a minimal key size of 2048 bits. Other
|
|
|
organizations recommend somewhat different sizes: [Enisa], Section 3.6 also
|
|
|
suggests that 2048-bit RSA keys provide a security strength of about 112 bits,
|
|
|
but recommends a security strength of 128 bits for near term systems, hence 3072
|
|
|
bit RSA keys. [ECRYPT II], Section 13.3 suggests at least 2432 bits for new
|
|
|
keys.
|
|
|
|
|
|
All the references above clearly state that keys smaller than 2048 bits should
|
|
|
only be used in legacy cases. Therefore, it seems wrong to use a default key
|
|
|
size smaller than 2048 bits. If a user really wants a small RSA key then such a
|
|
|
choice should be made by explicitly providing the desired key length during the
|
|
|
initalization of a key pair generator.
|
|
|
|
|
|
According to https://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html
|
|
|
every implementation of the Java platform is required to implement RSA with both
|
|
|
1024 and 2048 bit key sizes. Hence a 2048 bit default should not lead to
|
|
|
compatibility problems.
|
|
|
|
|
|
**Cryptographically strong random numbers:**
|
|
|
So far the tests check that java.util.Random is not used. This needs to be
|
|
|
extended.
|
|
|
|
|
|
**Other bugs:**
|
|
|
The public exponent e should be larger than 1 [CVE-1999-1444]
|
|
|
|
|
|
## RSA PKCS #1 v1.5 encryption
|
|
|
|
|
|
PKCS #1 v1.5 padding is susceptible to adaptive chosen ciphertext attacks and
|
|
|
hence should be avoided [B98]. The difficulty of exploiting protocols using
|
|
|
PKCS #1 v1.5 encryption often depends on the amount of information leaked after
|
|
|
decrypting corrupt ciphertexts. Implementations frequently leak information
|
|
|
about the decrypted plaintext in form of error messages. The content of the
|
|
|
error messages are extremely helpful to potential attackers. Bardou et al.
|
|
|
[BFKLSST12] analyze the difficult of attacks based on different types of
|
|
|
information leakage. Smart even describes an attack that only needs about 40
|
|
|
chosen ciphertexts [S10], though in this case the encryption did not use PKCS #1
|
|
|
padding.
|
|
|
|
|
|
**Bugs**
|
|
|
|
|
|
* Bouncycastle throws detailed exceptions:
|
|
|
InvalidCipherTextException("unknown block type") or
|
|
|
InvalidCipherTextException("block padding incorrect").
|
|
|
|
|
|
<!-- the SUN provider used to include that block type -->
|
|
|
|
|
|
**Tests** To test whether an implementation leaks more information than
|
|
|
necessary a test decrypts some random ciphertexts and catches the exceptions. If
|
|
|
the exceptions are distinguishable then the test assumes that unnecessary
|
|
|
information about the padding is leaked.
|
|
|
|
|
|
Due to the nature of unit tests not every attack can be detected this way. Some
|
|
|
attacks require a large number of ciphertexts to be detected if random
|
|
|
ciphertexts are used. For example Klima et al. [KPR03] describe an
|
|
|
implementation flaw that could not be detected with our test.
|
|
|
|
|
|
Timing leakages because of differences in parsing the padding can leak
|
|
|
information (e.g. CVE-2015-7827). Such differences are too small to be reliably
|
|
|
detectable in unit tests.
|
|
|
|
|
|
## RSA OAEP
|
|
|
|
|
|
Manger describes an chosen ciphertext attack against RSA in [M01]. There are
|
|
|
implementations that were susceptible to Mangers attack, e.g. [CVE-2012-5081].
|
|
|
|
|
|
## RSA PKCS1 signatures
|
|
|
**Potential problems:**
|
|
|
|
|
|
* Some libraries parse PKCS#1 padding during signature verification
|
|
|
incorrectly.
|
|
|
* Some libraries determine the hash function from the signature (rather than
|
|
|
encoding this in the key) Effect:
|
|
|
* If the verification is buggy then an attacker might be able to generate
|
|
|
signatures for keys with a small (i.e. e=3) public exponent.
|
|
|
* If the hash algorithm is not determined by in an authentic manner then
|
|
|
preimage attacks against weak hashes are possible, even if the hashes are
|
|
|
not used by the signer.
|
|
|
|
|
|
**Countermeasures:** A good way to implement RSA signature verification is
|
|
|
described in the standard PKCS#1 v.2.2 Section 8.2.2. This standard proposes to
|
|
|
reconstruct the padding during verification and compare the padded hash to the
|
|
|
value $$s^e \bmod n$$ obtained from applying a public key exponentiation to the
|
|
|
signature s. Since this is a recurring bug it makes also a lot of sense to avoid
|
|
|
small public exponents and prefer for example e=65537 .
|
|
|
|
|
|
**List of broken implementations**
|
|
|
This is a large list.
|
|
|
|
|
|
## References
|
|
|
|
|
|
\[B98]: D. Bleichenbacher, "Chosen ciphertext attacks against protocols based on
|
|
|
the RSA encryption standard PKCS# 1" Crypto 98
|
|
|
|
|
|
\[M01]: J. Manger, "A chosen ciphertext attack on RSA optimal asymmetric
|
|
|
encryption padding (OAEP) as standardized in PKCS# 1 v2.0", Crypto 2001 This
|
|
|
paper shows that OAEP is susceptible to a chosen ciphertext attack if error
|
|
|
messages distinguish between different failure condidtions. [S10]: N. Smart,
|
|
|
"Errors matter: Breaking RSA-based PIN encryption with thirty ciphertext
|
|
|
validity queries" RSA conference, 2010 This paper shows that padding oracle
|
|
|
attacks can be successful with even a small number of queries.
|
|
|
|
|
|
\[KPR03]: V. Klima, O. Pokorny, and T. Rosa, "Attacking RSA-based Sessions in
|
|
|
SSL/TLS" https://eprint.iacr.org/2003/052/
|
|
|
|
|
|
\[BFKLSST12]: "Efficient padding oracle attacks on cryptographic hardware" R.
|
|
|
Bardou, R. Focardi, Y. Kawamoto, L. Simionato, G. Steel, J.K. Tsay, Crypto 2012
|
|
|
|
|
|
\[NIST SP 800-57]:
|
|
|
http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-57pt1r4.pdf
|
|
|
|
|
|
\[Enisa]: "Algorithms, key size and parameters report – 2014"
|
|
|
https://www.enisa.europa.eu/publications/algorithms-key-size-and-parameters-report-2014
|
|
|
|
|
|
\[ECRYPT II]: Yearly Report on Algorithms and Keysizes (2011-2012),
|
|
|
http://www.ecrypt.eu.org/ecrypt2/documents/D.SPA.20.pdf
|
|
|
|
|
|
\[CVE-1999-1444]: Alibaba 2.0 generated RSA key pairs with an exponent 1
|
|
|
|
|
|
\[CVE-2012-5081]: Java JSSE provider leaked information through exceptions and
|
|
|
timing. Both the PKCS #1 padding and the OAEP padding were broken:
|
|
|
http://www-brs.ub.ruhr-uni-bochum.de/netahtml/HSS/Diss/MeyerChristopher/diss.pdf
|