Changes between Version 14 and Version 15 of NewMutableEncodingDesign


Ignore:
Timestamp:
2010-01-08T03:35:39Z (15 years ago)
Author:
davidsarah
Comment:

update for multi-target attacks

Legend:

Unmodified
Added
Removed
Modified
  • NewMutableEncodingDesign

    v14 v15  
    1212 * [http://allmydata.org/pipermail/tahoe-dev/2009-September/002848.html The Elk Point design] is very interesting, and has not yet been transcribed into this wiki page.
    1313
     14= Parameters K and T =
     15
     16Below, K is the security level needed for an attack against confidentiality:
     17such attacks will require p * 2^K^ work factor (product of machine size and time)
     18for a probability of success p. T is the additional number of bits needed to take
     19into account
     20[http://allmydata.org/trac/tahoe/ticket/882#comment:6 multi-target attacks] against
     21hash functions, so that attacks against integrity also require p * 2^K^ work factor
     22for 2^T^ target files.
     23
    1424= Yay ECDSA =
    1525
     
    2333The RSA fields are so large that we clearly cannot put them in the filecaps,
    2434so the encoding scheme requires them to be stored in the shares, encrypted
    25 and hashed as necessary. The DSA keys are short enough (in most cases) to put
    26 directly in the filecap, simplifying the design considerably.
     35and hashed as necessary. The ECDSA keys are short enough (in most cases) to put
     36directly in the filecap, although note that this still increases the cap length
     37relative to using a hash truncated to K+T bits.
    2738
    2839= Desired Features =
     
    4758== Filecap Length ==
    4859
    49 A likely security parameter K (=kappa) would be 96, 128, or 160 bits, and most of
    50 the filecaps will be some multiple of K. [96 bits is too short IMHO --David-Sarah]
     60A likely security parameter K (=kappa) would be 96, 128, or 160 bits.
     61[96 bits is too short IMHO --David-Sarah]
    5162
    5263Assuming a {{{tahoe:}}} prefix and no additional metadata, here's what
     
    8394[http://allmydata.org/trac/tahoe/ticket/882#comment:6 #882:c6] for a
    8495counterargument saying that 50 extra bits or so are needed to be secure
    85 against multi-target attacks.
     96against multi-target attacks (i.e. T = 50). This page has now been updated
     97assuming the counterargument is correct.
    8698
    8799= Design Proposals =
     
    123135   material) (remember, K=kappa, probably 128bits)
    124136 * (minimum 2K) readcap = minimum 2*K-bit semiprivate key
    125  * verifycap = 2*K-bit public key
     137 * (minimum 2K) verifycap = public key
    126138 * storage-index = truncated verifycap
    127139
     
    142154 * (minimum 2K) readcap = minimum 2*K-bit first semiprivate key
    143155 * (minimum 2K) traversalcap = minimum 2*K-bit second semiprivate key
    144  * verifycap = 2*K-bit public key
     156 * (minimum 2K) verifycap = public key
    145157 * storage-index = truncated verifycap
    146158
     
    158170private key out of the share and into the writecap:
    159171
    160  * (1K) writecap = K-bit random string = privkey
    161  * (3K) readcap = H(writecap)[:K] + H(pubkey)
    162  * verifycap = H(pubkey)
     172 * (K) writecap = K-bit random string = privkey
     173 * (2K + T) readcap = H(writecap)[:K] + H(pubkey)[:K+T]
     174 * (K + T) verifycap = H(pubkey)[:K+T]
    163175 * storage-index = truncated verifycap
    164176
     
    166178from one of the shares, since they cannot derive it themselves. This
    167179preserves offline attenuation and server-side validation. The readcap grows
    168 to (1+2)*K : we can truncate the AES key since we only need K bits for K-bit
    169 confidentiality, but require 2*K bits on H(pubkey) to attain K-bit collision
    170 resistance. The verifycap is 2*K.
     180to 2K + T : we only need K bits for K-bit confidentiality, but require K+T bits
     181on H(pubkey) to attain K-bit second-preimage resistance for 2^T^ targets. (To
     182obtain collision-resistance, set T = K, although that shouldn't be necessary
     183for mutable files.) The verifycap is K+T bits.
    171184
    172185=== include ECDSA pubkey in cap ===
     
    175188requiring the client to fetch a copy:
    176189
    177  * (1K) writecap = K-bit random string = privkey
     190 * (K) writecap = K-bit random string = privkey
    178191 * (minimum 3K) readcap = H(writecap)[:K] + pubkey
    179  * verifycap = pubkey
     192 * (minimum 2K) verifycap = pubkey
    180193 * storage-index = H(pubkey)
    181194
    182 I think ECDSA pubkeys are 2*K long, so this would not change the length of
    183 the readcaps. It would just simplify/speed-up the download process. If we
    184 could use shorter pubkeys, this design might give us slightly shorter keys.
    185 Alternately, if we could use shorter hashes, then the H(pubkey) design might
    186 give us slightly shorter keys.
     195ECDSA pubkeys are slightly more than 2*K long, so this would increase the
     196length of the readcaps whenever K > T. The advantage would be simplifying/speeding up
     197the download process. It is highly unlikely that there is any public key algorithm
     198with keys shorter than 2*K for a K-bit security level. Since we can use shorter
     199hashes than public keys, the H(pubkey) design above gives us shorter read caps,
     200although they are not shorter than using semi-private keys.
    187201
    188202=== Any public key algorithm, no semi-private keys, with traversalcap ===
    189203
    190 Since a secure pubkey identifier (either H(pubkey) or the original privkey)
     204Since a secure pubkey identifier (either H(pubkey)[:K+T] or the original privkey)
    191205is present in all caps, it's easy to insert arbitrary intermediate levels. It
    192206doesn't even change the way the existing caps are used:
    193207
    194208 * (1K) writecap = K-bit random string = privkey
    195  * (3K) readcap = H(writecap)[:K] + H(pubkey)
    196  * (3K) traversalcap: H(readcap)[:K] + H(pubkey)
    197  * verifycap = H(pubkey)
     209 * (2K + T) readcap = H(writecap)[:K] + H(pubkey)[:K+T]
     210 * (2K + T) traversalcap: H(readcap)[:K] + H(pubkey)[:K+T]
     211 * (K + T) verifycap = H(pubkey)[:K+T]
    198212 * storage-index = truncated verifycap
    199213