Next: Design of Mercy
Up:
Mercy: a fast large Previous: Mercy design goals
Subsections
Since most of Mercy's operations are based around 32-bit words, we define . Vectors are indexed from zero, so a vector of 128 32-bit numbers will be indexed as . The symbol represents bitwise exclusive OR; where appears in the figures with a square box around it, it represents addition in the ring . Least significant and lowest indexed bytes and words appear leftmost and uppermost in the figures.
Note that some details that would be needed to build a specification of Mercy-based file encryption sufficient for interoperability, such as byte ordering within words, are omitted since they are irrelevant for cryptanalytic purposes.
The box ( , Figure 1) is a key-dependent mapping of bytes onto words. represents multiplicative inverses in with polynomial base except that . are key dependent bijective affine mappings on .
(Figure 2) is drawn from David Wheeler's stream cipher WAKE [21]; it's a simple, key-dependent mapping on 32-bit words. The most significant byte of the input word is looked up in the box, and the output XORred with the other three bytes shifted up eight bits; the construction of the box ensures that this mapping is bijective.
The state machine (Figure 3) maps a four-word initial state and one word input onto a four-word final state and one word output ( ) using taps from a linear feedback shift register and a nonlinear mixing function.
The function (; Figure 4) accepts a 128-bit spice and a -bit input and generates a -bit output ( ). (usually just ) is the F function for the Feistel rounds. Here represents successive 128-bit states of a state machine; are the successive 32-bit inputs to the state machine, and are the outputs.
Mercy uses a six round Feistel structure (Figure 5) with partial
pre- and post-whitening; unusually, the final swap is
not omitted. The spice (usually the sector
number) goes through a ``spice scheduling'' procedure,
analogous with key scheduling, through which the ``spice
material'' is generated
based on the input spice, using the
variant of the function; this forms
six 128-bit ``round spices''. Spice scheduling uses a dummy
input to the F function; for this a vector of incrementing
bytes is used. represents the
plaintext, the ciphertext,
and the
whitening values. We describe decryption below; since Mercy is
a straightforward Feistel cipher encryption follows in the
straightforward way.
The key is used to seed a CPRNG from which key material is drawn; [10] is used in the sample implementation (after discarding 256 bytes of output), and is convenient since it's small and byte oriented, but any strong CPRNG will serve. Then the procedure in Figure 6 generates the substitutions and the 2048-bit whitening values .
An expected 10.6 random bytes will be drawn for each . Once have been determined, a 1k table representing the box can be generated. During normal use 1536 bytes of key-dependent tables are used.
Next: Design of Mercy
Up:
Mercy: a fast large Previous: Mercy design goals