Computes the public key \( pk = (n, v) \):

Computes the fingerprint \( \mathcal{H}(m) \):

Computes the signature \( \sigma \) of the fingerprint \( \mathcal{H}(m) \):

Enter the message (or integer) that Samantha wants to sign:

Hit **enter** to generate the parameters and use the
**left** and **right** arrow keys to navigate.

Samantha chooses the two prime numbers \( p \) and \( q \) and computes \( n = p \cdot q \).

She then computes the public verification exponent \( v \) by randomly choosing a \( 3 \leq v \leq n-1 \) until \( \gcd(v, \phi(n)) = 1 \) where \( \phi(n) = (p - 1) \cdot (q - 1) \).

Samantha then sends her public key \( pk = (n, v) \) to Victor.

Samantha computes the fingerprint \( \mathcal{H}(m) \) of the message \( m \) by using a public known hash function \( \mathcal{H} \).

Because Samantha know the value of \( v \) and \( \phi(n) \) she can easily compute the secret signing exponent \( s \) with the extended Euclidean algorithm.

She then computes the signature of the fingerprint and sends the message \( m \) and the signature \( \sigma \) to Victor.

Victor uses the same hash function \( \mathcal{H} \) as Samantha to compute the fingerprint \( \mathcal{H}(m) \) of the message \( m \).

If nobody has tampered with the content of the message Victor get the same fingerprint as Samantha.

Victor verifies the signature \( \sigma \) of the fingerprint \( \mathcal{H}(m) \).

If the two computed values are equals, the message was signed by Samantha and nobody has tampered with the content of the message.

Receives the public key \( pk = (n, v) \)

Receives the signature \( \sigma \) and the message \( m \)

Computes the fingerprint \( \mathcal{H}(m) \):

Verifies the signature of the fingerprint: