Poly1305 is a universal hash family designed by Daniel J. Bernstein in 2002 for use in cryptography.[1][2]

As with any universal hash family, Poly1305 can be used as a one-time message authentication code to authenticate a single message using a secret key shared between sender and recipient,[3] similar to the way that a one-time pad can be used to conceal the content of a single message using a secret key shared between sender and recipient.

Originally Poly1305 was proposed as part of Poly1305-AES,[2] a CarterWegman authenticator[4][5][1] that combines the Poly1305 hash with AES-128 to authenticate many messages using a single short key and distinct message numbers. Poly1305 was later applied with a single-use key generated for each message using XSalsa20 in the NaCl crypto_secretbox_xsalsa20poly1305 authenticated cipher,[6] and then using ChaCha in the ChaCha20-Poly1305 authenticated cipher[7][8][1] deployed in TLS on the internet.[9]

Description

Definition of Poly1305

Poly1305 takes a 16-byte secret key and an -byte message and returns a 16-byte hash . To do this, Poly1305:[2][1]

  1. Interprets as a little-endian 16-byte integer.
  2. Breaks the message into consecutive 16-byte chunks.
  3. Interprets the 16-byte chunks as 17-byte little-endian integers by appending a 1 byte to every 16-byte chunk, to be used as coefficients of a polynomial.
  4. Evaluates the polynomial at the point modulo the prime .
  5. Reduces the result modulo encoded in little-endian return a 16-byte hash.

The coefficients of the polynomial , where , are:

with the exception that, if , then:

The secret key is restricted to have the bytes , i.e., to have their top four bits clear; and to have the bytes , i.e., to have their bottom two bits clear. Thus there are distinct possible values of .

Use as a one-time authenticator

If is a secret 16-byte string interpreted as a little-endian integer, then

is called the authenticator for the message . If a sender and recipient share the 32-byte secret key in advance, chosen uniformly at random, then the sender can transmit an authenticated message . When the recipient receives an alleged authenticated message (which may have been modified in transmit by an adversary), they can verify its authenticity by testing whether

Without knowledge of , the adversary has probability of finding any that will pass verification.

However, the same key must not be reused for two messages. If the adversary learns

for , they can subtract

and find a root of the resulting polynomial to recover a small list of candidates for the secret evaluation point , and from that the secret pad . The adversary can then use this to forge additional messages with high probability.

Use in Poly1305-AES as a Carter–Wegman authenticator

The original Poly1305-AES proposal[2] uses the Carter–Wegman structure[4][5] to authenticate many messages by taking to be the authenticator on the ith message , where is a universal hash family and is an independent uniform random hash value that serves as a one-time pad to conceal it. Poly1305-AES uses AES-128 to generate , where is encoded as a 16-byte little-endian integer.

Specifically, a Poly1305-AES key is a 32-byte pair of a 16-byte evaluation point , as above, and a 16-byte AES key . The Poly1305-AES authenticator on a message is

where 16-byte strings and integers are identified by little-endian encoding. Note that is reused between messages.

Without knowledge of , the adversary has low probability of forging any authenticated messages that the recipient will accept as genuine. Suppose the adversary sees authenticated messages and attempts forgeries, and can distinguish from a uniform random permutation with advantage at most . (Unless AES is broken, is very small.) The adversary's chance of success at a single forgery is at most:

The message number must never be repeated with the same key . If it is, the adversary can recover a small list of candidates for and , as with the one-time authenticator, and use that to forge messages.

Use in NaCl and ChaCha20-Poly1305

The NaCl crypto_secretbox_xsalsa20poly1305 authenticated cipher uses a message number with the XSalsa20 stream cipher to generate a per-message key stream, the first 32 bytes of which are taken as a one-time Poly1305 key and the rest of which is used for encrypting the message. It then uses Poly1305 as a one-time authenticator for the ciphertext of the message.[6] ChaCha20-Poly1305 does the same but with ChaCha instead of XSalsa20.[8]

Security

Summarize

The security of Poly1305 and its derivatives against forgery follows from its bounded difference probability as a universal hash family: If and are messages of up to bytes each, and is any 16-byte string interpreted as a little-endian integer, then

where is a uniform random Poly1305 key.[2]:Theorem 3.3, p. 8

This property is sometimes called -almost-Δ-universality over , or -AΔU,[10] where in this case.

Of one-time authenticator

With a one-time authenticator , the adversary's success probability for any forgery attempt on a message of up to bytes is:

Here arithmetic inside the is taken to be in for simplicity.

Of NaCl and ChaCha20-Poly1305

For NaCl crypto_secretbox_xsalsa20poly1305 and ChaCha20-Poly1305, the adversary's success probability at forgery is the same for each message independently as for a one-time authenticator, plus the adversary's distinguishing advantage against XSalsa20 or ChaCha as pseudorandom functions used to generate the per-message key. In other words, the probability that the adversary succeeds at a single forgery after attempts of messages up to bytes is at most:

Of Poly1305-AES

The security of Poly1305-AES against forgery follows from the CarterWegmanShoup structure, which instantiates a CarterWegman authenticator with a permutation to generate the per-message pad.[11] If an adversary sees authenticated messages and attempts forgeries of messages of up to bytes, and if the adversary has distinguishing advantage at most against AES-128 as a pseudorandom permutation, then the probability the adversary succeeds at any one of the forgeries is at most:[2]

For instance, assuming that messages are packets up to 1024 bytes; that the attacker sees 264 messages authenticated under a Poly1305-AES key; that the attacker attempts a whopping 275 forgeries; and that the attacker cannot break AES with probability above δ; then, with probability at least 0.999999 − δ, all the 275 are rejected

Bernstein, Daniel J. (2005)[2]

Speed

Poly1305-AES can be computed at high speed in various CPUs: for an n-byte message, no more than 3.1n + 780 Athlon cycles are needed,[2] for example. The author has released optimized source code for Athlon, Pentium Pro/II/III/M, PowerPC, and UltraSPARC, in addition to non-optimized reference implementations in C and C++ as public domain software.[12]

Implementations

Below is a list of cryptography libraries that support Poly1305:

See also

  • ChaCha20-Poly1305 – an AEAD scheme combining the stream cipher ChaCha20 with a variant of Poly1305

References

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.