Există, de asemenea, o schemă de semnătură mai simplă, dar nu binecunoscută pentru RSA;
Are de nefalsificat din punct de vedere existențial sub atacuri adaptive cu mesaje alese în modelul aleator ale oracolului.
Astăzi RSA-FDH este foarte simplu;
- Semn: $\sigma = Semn(H, m) = (H(m))^d \bmod n$
- Verifica: $\{0,1\} = Verificați(H, m, \sigma) = [\sigma^e \bmod n \overset{?}= H(m) \bmod n]$
Nu a fost ușor să semnezi atunci din cauza cerinței de dimensiune; haşişul $H$ trebuie să aibă o dimensiune de ieșire egală cu dimensiunea modulului RSA. Acum, alegerea evidentă este eXtendibilă Oieșire Funcțiuni (XOF) ca SHAKE128/SHKE256 de SHA-3.
Solicitați dimensiunea de ieșire de la SHAKE128 (sau SHAKE256) egală cu dimensiunea modulului RSA, hash-o apoi semnați, asta este!
import hashlib
import rsa
(pubkey, privkey) = rsa.newkeys(2048)
FHD = hashlib.shake_128()
FHD.update(b'Mesaj de semnat')
digestFDH = int.from_bytes(FHD.digest(255),byteorder='little')
#doar m^d mod n
signed = rsa.core.decrypt_int(digestFDH,privkey.d,pubkey.n)
#just m^e mod n
dacă digestFDH == rsa.core.encrypt_int( semnat ,pubkey.e,pubkey.n):
print("Verificat")
altceva:
print("!!!Verificarea eșuată. Oprire!!!")
Definiția exactă ca în lucrarea din 1998 (nu între ghilimele)
Algoritmul de semnare și verificare are acces la oracol
la o funcție hash $H_{FDH} : \{0, 1\}^â \to \mathbb{Z}^*_N$. Generarea și verificarea semnăturii sunt după cum urmează:
$\operatorname{SignFDH}_{N,d}(M) $
$\quad y \leftarrow H_{FDH}(M)$
$\quad \text{retur }y^d \bmod N$
$\operatorname{VerifyFDH}_{N,e}(M, x)$
$\quad y \leftarrow x^e \bmod N;$
$\quad y' \leftarrow H_{FDH}(M)$
$\quad\text{dacă }y = y' \text{ atunci returnează }1 \text{ else return } 0$
și rețineți că, cel puțin unele dintre elementele $\mathbb{Z}_N^*$ nu poate fi scos de un XOF standard. Modulul nu este o putere exactă de 2, așa că trebuie să ieșiți cu un bit mai puțin decât modulul. Biblioteca pe care am folosit-o pentru implementarea eșantionului folosește octeți pentru dimensiunea de ieșire, deci nu poate acoperi până la 8 biți.
De asemenea, ieșirea total-zero este exclusă!.