RSA è un crittosistema a chiave pubblica che fornisce crittografia e firme digitali basato sulla complessità computazionale della fattorizzazione di grandi numeri. Secondo NIST Special Publication 800-56B Rev. 2 (2023), RSA con una lunghezza di chiave di 2048 bit rimane lo standard di sicurezza per i sistemi governativi e commerciali. L’algoritmo è ampiamente utilizzato nei protocolli TLS, nelle firme digitali e nella crittografia dei dati nelle applicazioni mobili.
Punti chiave
RSA è un algoritmo crittografico a chiave pubblica sviluppato nel 1977 da Ron Rivest, Adi Shamir e Leonard Adleman. Il nome è formato dalle prime lettere dei cognomi degli autori. L’algoritmo è diventato il primo crittosistema asimmetrico praticamente applicabile in cui le chiavi di crittografia e decrittografia differiscono.
L’algoritmo RSA è stato pubblicato nel 1977 sulla rivista Scientific American e si basa sui precedenti lavori di Whitfield Diffie e Martin Hellman sulla crittografia a chiave pubblica. Il Massachusetts Institute of Technology ha ottenuto un brevetto per RSA nel 1983, che è durato fino al 2000. Secondo il rapporto di RSA Laboratories (2023), l’algoritmo rimane uno degli standard crittografici più diffusi al mondo — viene utilizzato in miliardi di dispositivi ogni giorno.
A differenza dei cifrari simmetrici in cui la stessa chiave viene utilizzata sia per la crittografia che per la decrittografia, RSA opera con una coppia di chiavi matematicamente legate. La chiave pubblica può essere pubblicata per chiunque senza rischi di compromettere il sistema. La chiave privata è nota solo al proprietario e non viene mai trasmessa in rete. Secondo lo studio IBM Security X-Force Threat Intelligence Index (2024), la crittografia asimmetrica viene utilizzata nel 96% dei moderni protocolli di trasmissione dati sicura.
La sicurezza di RSA si basa sul problema della fattorizzazione — scomporre il prodotto di due grandi numeri primi in fattori. Se si scelgono numeri primi p e q di 1024 bit ciascuno, il loro prodotto n sarà di 2048 bit. Calcolare p e q conoscendo solo n con metodi moderni è praticamente impossibile: secondo la valutazione degli esperti del CNRS (2024), decifrare RSA-2048 richiederebbe più di 300 miliardi di anni di calcolo su un computer classico.
Consideriamo il ciclo completo di lavoro di RSA dalla generazione delle chiavi alla crittografia e decrittografia dei messaggi. Comprendere queste fasi è necessario per una corretta implementazione dell’algoritmo nelle applicazioni mobili.
Il processo inizia con la selezione di due grandi numeri primi p e q. Viene calcolato il modulo n = p x q, che determina la lunghezza della chiave. Quindi viene calcolata la funzione toziente di Eulero phi(n) = (p-1)(q-1). Viene scelto un esponente pubblico e che sia coprimo con phi(n). L’esponente privato d viene calcolato come l’inverso moltiplicativo modulare di e modulo phi(n). Secondo NIST SP 800-56B Rev. 2, la lunghezza minima di n deve essere di 2048 bit per garantire una protezione adeguata.
import java.security.KeyPairGenerator;
import java.security.KeyPair;
import java.security.SecureRandom;
public class RSAKeyGenerator {
public static KeyPair generateKeyPair() throws Exception {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(2048, new SecureRandom());
return generator.generateKeyPair();
}
}
Per crittografare un messaggio m, il mittente lo converte in un intero minore di n e calcola il testo cifrato c = m^e mod n. Il destinatario utilizza la chiave privata d per recuperare il messaggio originale: m = c^d mod n. È importante notare che RSA non è progettato per crittografare grandi volumi di dati a causa delle scarse prestazioni — la dimensione massima del messaggio è uguale alla lunghezza della chiave meno i byte di overhead (circa 190 byte per RSA-2048 con OAEP).
import javax.crypto.Cipher;
import java.security.PublicKey;
import java.util.Base64;
public class RSAEncryptor {
public static String encrypt(String data, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encrypted = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
}
RSA viene anche utilizzato per creare firme digitali — un meccanismo per verificare l’autenticità e l’integrità dei dati. Il proprietario firma l’hash del messaggio con la propria chiave privata e chiunque può verificare la firma utilizzando la chiave pubblica. Secondo il rapporto Sectigo Certificate Transparency (2025), oltre l’85% dei certificati TLS su Internet utilizza RSA per le firme digitali, rendendo l’algoritmo il fondamento della fiducia per le comunicazioni web.
import java.security.Signature
fun signData(data: ByteArray, privateKey: java.security.PrivateKey): ByteArray {
val signature = Signature.getInstance("SHA256withRSA")
signature.initSign(privateKey)
signature.update(data)
return signature.sign()
}
fun verifySignature(
data: ByteArray, signedData: ByteArray, publicKey: java.security.PublicKey
): Boolean {
val signature = Signature.getInstance("SHA256withRSA")
signature.initVerify(publicKey)
signature.update(data)
return signature.verify(signedData)
}
La lunghezza della chiave influisce direttamente sulla forza crittografica di RSA. Con l’aumento della potenza di calcolo, la dimensione minima accettabile della chiave viene regolarmente rivista dagli organismi internazionali di normazione. Esaminiamo le raccomandazioni attuali di NIST e di altri enti regolatori.
| Lunghezza chiave | Equivalente simmetrico | Stato |
|---|---|---|
| 1024 bit | 80 bit | Vietato dal 2023 |
| 2048 bit | 112 bit | Standard minimo |
| 3072 bit | 128 bit | Raccomandato per nuovi sistemi |
| 4096 bit | 256 bit | Per dati riservati |
L’aumento della lunghezza della chiave RSA influisce significativamente sul tempo di esecuzione delle operazioni. Generare una chiave di 4096 bit richiede circa 10 volte più tempo rispetto a una chiave di 2048 bit. Le operazioni di crittografia e decrittografia con una chiave più lunga richiedono più risorse computazionali, il che è critico per i dispositivi mobili con consumo energetico limitato.
Con lo sviluppo del calcolo quantistico, RSA può essere violato utilizzando l’algoritmo di Shor in tempo polinomiale. Questo algoritmo, proposto da Peter Shor nel 1994, può fattorizzare grandi numeri in O((log n)^3) operazioni. Secondo la IBM Quantum Roadmap (2025), la violazione pratica di RSA-2048 non è prevista prima del 2035, tuttavia NIST raccomanda già una transizione graduale agli algoritmi post-quantistici CRYSTALS-Kyber e CRYSTALS-Dilithium.
RSA viene attivamente utilizzato nelle applicazioni mobili per garantire la trasmissione sicura dei dati, l’autenticazione dei server e la protezione delle transazioni digitali. L’integrazione avviene attraverso le API crittografiche standard di entrambe le piattaforme principali.
La piattaforma Android fornisce Android Keystore — un archivio sistemico di chiavi crittografiche protetto dal livello hardware Trusted Execution Environment. Le chiavi RSA generate in KeyStore non possono essere estratte dal dispositivo anche se l’applicazione viene compromessa. Ciò fornisce protezione contro un’ampia gamma di attacchi, inclusi i malware con accesso root.
import android.security.keystore.KeyGenParameterSpec
import android.security.keystore.KeyProperties
import java.security.KeyPairGenerator
fun generateKeyInAndroidKeystore() {
val generator = KeyPairGenerator.getInstance(
KeyProperties.KEY_ALGORITHM_RSA,
"AndroidKeyStore"
)
val spec = KeyGenParameterSpec.Builder(
"rsa_key_pair",
KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT
)
.setKeySize(2048)
.setBlockModes(KeyProperties.BLOCK_MODE_ECB)
.setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_RSA_OAEP)
.build()
generator.initialize(spec)
val keyPair = generator.generateKeyPair()
}
Su iOS, RSA viene gestito tramite Security Framework con accesso a Secure Enclave sui dispositivi con chip A7 e successivi. Secure Enclave è un coprocessore dedicato isolato dal processore principale che esegue operazioni crittografiche e archivia le chiavi in un vault hardware. Le chiavi RSA possono essere generate sia all’interno di Secure Enclave che nel Keychain software con vari livelli di accesso.
Nelle applicazioni mobili reali, RSA viene raramente utilizzato per la crittografia diretta di grandi dati. La pratica standard è uno schema ibrido: l’applicazione genera una chiave di sessione AES, la crittografa con la chiave pubblica RSA del server e la invia al server. Tutto il traffico successivo viene crittografato con AES, che è 100-1000 volte più veloce della trasmissione diretta dei dati tramite RSA.
Come qualsiasi algoritmo crittografico, RSA ha punti di forza e debolezze che devono essere considerati quando si progettano sistemi sicuri. Una valutazione obiettiva aiuta a scegliere lo strumento giusto per un compito specifico.
Il principale vantaggio di RSA è risolvere il problema fondamentale della distribuzione delle chiavi — la chiave pubblica può essere pubblicata liberamente senza rischi di compromettere l’intero sistema. La versatilità dell’algoritmo si manifesta nel supporto sia della crittografia che delle firme digitali con un’unica coppia di chiavi. Inoltre, RSA dispone di un vasto ecosistema di supporto: le librerie sono disponibili per tutti i linguaggi e le piattaforme.
Lo svantaggio principale di RSA è le scarse prestazioni rispetto agli algoritmi simmetrici. La decrittografia di RSA-2048 su un processore mobile moderno richiede circa 5-15 millisecondi, mentre AES-256 elabora gigabyte di dati nello stesso tempo. Inoltre, RSA è vulnerabile agli attacchi quantistici tramite l’algoritmo di Shor, il che ne limita l’uso in sistemi che richiedono protezione dei dati a lungo termine.
Per i progetti mobili, gli esperti NIST raccomandano: utilizzare RSA solo per la crittografia delle chiavi e le firme digitali, scegliere una lunghezza della chiave di almeno 3072 bit per i nuovi progetti, combinare RSA con AES in uno schema ibrido e monitorare lo sviluppo degli standard post-quantistici per una migrazione pianificata a lungo termine.
Domande frequenti
RSA è un algoritmo asimmetrico con una coppia di chiavi utilizzato per crittografare piccoli volumi di dati e firme digitali. AES è un algoritmo simmetrico con un’unica chiave condivisa, che funziona 100-1000 volte più velocemente di RSA. Nei sistemi moderni vengono combinati: RSA protegge la trasmissione della chiave di sessione AES, mentre AES crittografa il traffico principale.
La dimensione minima sicura dal 2023 è RSA-2048 secondo NIST SP 800-131A Rev. 2. Le chiavi da 1024 bit sono ufficialmente vietate per i sistemi governativi statunitensi. Per i nuovi progetti si raccomandano 3072 bit, che offrono un margine di sicurezza e una forza equivalente alla crittografia simmetrica 128 bit.
Sì, RSA è ampiamente utilizzato nelle applicazioni mobili. Android fornisce Android KeyStore per la generazione hardware e l’archiviazione sicura delle chiavi RSA. iOS fornisce Security Framework con supporto Secure Enclave. Per la crittografia di grandi dati, si raccomanda uno schema ibrido RSA + AES, in cui RSA crittografa solo la chiave di sessione.
Sui computer classici, violare RSA-2048 è praticamente impossibile — secondo le stime attuali, richiederebbe oltre 300 miliardi di anni di calcolo continuo. Tuttavia, un computer quantistico con un numero sufficiente di qubit potrebbe violare RSA-2048 in pochi minuti utilizzando l’algoritmo di Shor. Secondo le stime di IBM, un computer del genere non apparirà prima del 2035.
Tra gli algoritmi asimmetrici, ECC (Crittografia a Curva Ellittica) è popolare, offrendo una sicurezza equivalente con una lunghezza della chiave inferiore — ECC a 256 bit equivale a RSA-3072. Per l’era post-quantistica, NIST ha selezionato CRYSTALS-Kyber per la crittografia e CRYSTALS-Dilithium per le firme digitali nel 2024.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche