RSASSA-PSS obbligatorio nel 2019
I regolamenti EDI @ Energy per lo scambio di file EDIFACT ( documento disponibile solo in tedesco ) tra i partecipanti al mercato dell’industria energetica tedesca pubblicati dall’Associazione federale tedesca per la gestione dell’energia e dell’acqua BDEW eV affermano che
- tutti i certificati emessi dopo il 1 ° gennaio 2019 devono essere firmati con RSASSA-PSS.
- tutti i partecipanti al mercato devono supportare i certificati firmati RSASSA-PSS per la verifica dal 1 ° gennaio 2019.
RSASSA-PSS con SHA-256 o SHA-512 deve essere utilizzato come algoritmo per la firma di e-mail dal 1 ° gennaio 2019.
SOLUZIONE DI TOP-SSL
I certificati digitali PersonalSign di GlobalSign, da noi forniti, utilizzano il protocollo Secure/Multipurpose Internet Mail Extensions (S/MIME) per firmare digitalmente o crittografare le email. S/MIME Encryption garantisce integrità del messaggio, autenticazione, privacy e non ripudio. l maggiori client di posta supportano S/MIME, come Microsoft Outlook, Thunderbird, Apple Mail, Lotus Notes.
GlobalSign supporta l’algoritmo di firma RSASSA-PSS per tutti i certificati S/MIME emessi tramite Enterprise PKI
Che cos’è l’algoritmo RSASSA-PSS
Gli algoritmi di firma digitale che utilizzano chiavi crittografiche di tipo RSA sono specificati in una serie di standard chiamati Public-Key Cryptography Standards (PKCS) e sviluppati da RSA Laboratory.
Dato un messaggio M, una funzione di Hash e una chiave privata (n, d), si costruisce la seguente stringa di byte codificata.
Sia mHash il codice Hash del messaggio M, di lunghezza hLen. Si genera una stringa di byte detta salt di lunghezza sLen, che può essere anche nulla. Si pone
M’ = 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 | mHash | salt
Sia H l’hash della stringa M’:
H = HASH(M)
Si genera una stringa PS di lunghezza emLen – sLen – hLen – 2 di byte con valore 0x00, che può anche avere lunghezza nulla.
Sia DB una stringa di lunghezza emLen – hLen – 1 composta dalla seguente concatenazione:
DB = PS | 0x01 | salt
Si calcola:
dbmask = MGF(H, emLen – hLen – 1)
maskedDB = DB xor dbmask
si pongono gli 8emLen – emBits bit del byte più a sinistra a 0.
Sia
EM = maskedDB | H | 0xBC
La firma è costituita dalla cifratura con la propria chiave privata della stringa EM
Il destinatario che riceve una firma effettua la decifratura con la chiave pubblica del mittente, ottenendo la stringa EM
I primi emLen – hLen – 1 byte di EM rappresentano il valore di maskedDB, e i successivi hLen il valore di H. L’ultimo byte (più a destra) deve avere valore 0xBC. Si verifica che gli 8emLen – emBits bit più a sinistra del byte più a sinistra di maskedDB devono essere nulli.
Si calcola
mHash = HASH(M)
dbMask = MGF (H, emLen – hLen – 1)
DB = maskedDB xor dbMask
Si pongono i 8emLen – emBits bit più a sinistra del byte più a sinistra di DB a zero. Si verifica che gli emLen – hLen – sLen – 2 byte più a sinistra di DB siano nulli e che l’ottetto nella posizione emLen – hLen – sLen – 1 abbia il valore 0x01
Gli ultimi sLen byte di DB sono la stringa salt. Si costruisce la stringa M’:
M’ = 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 | mHash | salt
e si calcola
H’ = HASH(M’)
La firma è valida se H’ = H.
Esempio firma RSASSA-PSS
Si considera un messaggio M = “prova”, la funzione di Hash SHA-1 e la chiave privata.
mHash = SHA-1(M) = 62 79 88 6f de 09 0b 30 38 f2 67 09 8b cc a7 71 a6 ef a9 46
hLen = 20
Consideriamo come stringa salt la seguente stringa casuale: 89 74 AC 91 15 D6 0B 32
sLen = 16
allora, la stringa M’ è:
M’ = 00 00 00 00 00 00 00 00 62 79 88 6f de 09 0b 30 38 f2 67 09 8b cc a7 71 a6 ef a9 46 89 74 AC 91 15 D6 0B 32
e il valore di H è:
H = SHA-1(M’) = 5d 58 fd 77 bf ef 10 bb 4c de 73 70 f8 04 ad 0b 0a 14 c3 74
Si vuole una lunghezza di firma pari a 256 byte, quindi emLen = 256.
La lunghezza della stringa PS è: 256 – 16 – 20 – 2 = 218 byte di valore 0x00
Sia DB una stringa di lunghezza pari a 256 – 20 – 1 = 235 byte seguente:
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 89 74 ac 91 15 d6 0b 32
la stringa dbmask ha lunghezza 235 byte, come DB e riceve in input il valore di H. Successivamente viene effettuata l’operazione di xor tra DB e dbmask per ottenere maskedDB, anch’essa di 235 byte. Infine si concatena maskedDB, H (di lunghezza 20) e un byte finale di valore 0xbc, per ottenere una stringa di lunghezza pari a 256 byte, come desiderato. Questa stringa viene cifrata con la chiave privata.