Rabin signature algorithm

From Wikipedia, the free encyclopedia
Jump to navigation Jump to search

In cryptography, the Rabin signature algorithm is a method of digital signature originally published by Michael O. Rabin in 1979.[1][2]

The Rabin signature algorithm was one of the first digital signature schemes proposed. By using a trapdoor function with a hash of the message rather than with the message itself, in contrast to earlier proposals of one-time hash-based signatures or trapdoor-based signatures without hashing,[3][4] Rabin's was the first published design to meet what is now the modern standard of security for digital signatures for more than one message, existential unforgeability under chosen-message attack.[5]

Rabin signatures resemble RSA signatures with exponent e=2, but this leads to qualitative differences that enable more efficient implementation[5] and a security guarantee relative to the difficulty of integer factorization,[1][2][6] which has not been proven for RSA. However, Rabin signatures have seen relatively little use or standardization outside IEEE P1363[7] in comparison to RSA signature schemes such as RSASSA-PKCS1-v1_5 and RSASSA-PSS.

Definition

[edit | edit source]

The Rabin signature scheme is parametrized by a randomized hash function H(m,u) of a message m and k-bit randomization string u.

Public key
A public key is a pair of integers (n,b) with 0b<n and n odd. b is chosen arbitrarily and may be a fixed constant.
Signature
A signature on a message m is a pair (u,x) of a k-bit string u and an integer x such that x(x+b)H(m,u)(modn).
Private key
The private key for a public key (n,b) is the secret odd prime factorization pq of n, chosen uniformly at random from some large space of primes.
Signing a message
To make a signature on a message m using the private key, the signer starts by picking a k-bit string u uniformly at random, and computes c:=H(m,u). Let d=(b/2)modn. If c+d2 is a quadratic nonresidue modulo n, the signer starts over with an independent random u.[1]: p. 10  Otherwise, the signer computes xp:=(d±c+d2)modp,xq:=(d±c+d2)modq, using a standard algorithm for computing square roots modulo a prime—picking pq3(mod4) makes it easiest. Square roots are not unique, and different variants of the signature scheme make different choices of square root;[5] in any case, the signer must ensure not to reveal two different roots for the same hash c. xp and xq satisfy the equations xp(xp+b)H(m,u)(modp),xq(xq+b)H(m,u)(modq). The signer then uses the Chinese remainder theorem to solve the system xxp(modp),xxq(modq), for x, so that x satisfies x(x+b)H(m,u)(modn) as required. The signer reveals (u,x) as a signature on m.
The number of trials for u before x(x+b)H(m,u)(modn) can be solved for x is geometrically distributed with an average around 4 trials, because about 1/4 of all integers are quadratic residues modulo n.

Security

[edit | edit source]

Security against any adversary defined generically in terms of a hash function H (i.e., security in the random oracle model) follows from the difficulty of factoring n: Any such adversary with high probability of success at forgery can, with nearly as high probability, find two distinct square roots x1 and x2 of a random integer c modulo n. If x1±x2≢0(modn) then gcd(x1±x2,n) is a nontrivial factor of n, since x12x22c(modn) so nx12x22=(x1+x2)(x1x2) but nx1±x2.[2] Formalizing the security in modern terms requires filling in some additional details, such as the codomain of H; if we set a standard size K for the prime factors, 2K1<p<q<2K, then we might specify H:{0,1}*×{0,1}k{0,1}K.[6]

Randomization of the hash function was introduced to allow the signer to find a quadratic residue, but randomized hashing for signatures later became relevant in its own right for tighter security theorems[2] and resilience to collision attacks on fixed hash functions.[8][9][10]

Variants

[edit | edit source]

Removing b

[edit | edit source]

The quantity b in the public key adds no security, since any algorithm to solve congruences x(x+b)c(modn) for x given b and c can be trivially used as a subroutine in an algorithm to compute square roots modulo n and vice versa, so implementations can safely set b=0 for simplicity; b was discarded altogether in treatments after the initial proposal.[11][2][7][5] After removing b, the equations for xp and xq in the signing algorithm become:xp:=±cmodp,xq:=±cmodq.

Rabin-Williams

[edit | edit source]

The Rabin signature scheme was later tweaked by Williams in 1980[11] to choose p3(mod8) and q7(mod8), and replace a square root x by a tweaked square root (e,f,x), with e=±1 and f{1,2}, so that a signature instead satisfies efx2H(m,u)(modn), which allows the signer to create a signature in a single trial without sacrificing security. This variant is known as Rabin–Williams.[5][7]

Others

[edit | edit source]

Further variants allow tradeoffs between signature size and verification speed, partial message recovery, signature compression (down to one-half size), and public key compression (down to one-third size), still without sacrificing security.[5]

Variants without the hash function have been published in textbooks,[12][13] crediting Rabin for exponent 2 but not for the use of a hash function. These variants are trivially broken—for example, the signature x=2 can be forged by anyone as a valid signature on the message m=4 if the signature verification equation is x2m(modn) instead of x2H(m,u)(modn).

In the original paper,[1] the hash function H(m,u) was written with the notation C(MU), with C for compression, and using juxtaposition to denote concatenation of M and U as bit strings:

By convention, when wishing to sign a given message, M, [the signer] P adds as suffix a word U of an agreed upon length k. The choice of U is randomized each time a message is to be signed. The signer now compresses M1=MU by a hashing function to a word C(M1)=c, so that as a binary number cn

This notation has led to some confusion among some authors later who ignored the C part and misunderstood MU to mean multiplication, giving the misapprehension of a trivially broken signature scheme.[14]

References

[edit | edit source]
  1. ^ a b c d Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  2. ^ a b c d e Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  3. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  4. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  5. ^ a b c d e f Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value). (additional information at https://cr.yp.to/sigs.html)
  6. ^ a b Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  7. ^ a b c Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  8. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  9. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  10. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  11. ^ a b Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  12. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  13. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
  14. ^ Lua error in Module:Citation/CS1/Configuration at line 2172: attempt to index field '?' (a nil value).
[edit | edit source]