No, quello che stai cercando di realizzare è impossibile.
La crittografia tenta di mantenere riservate le informazioni. A tale scopo, è necessario un messaggio di input tra tutti i possibili messaggi di input e viene crittografato in modo tale che l'output non perda alcuna informazione sul messaggio di input. Ovviamente non vuoi che i messaggi vengano crittografati sullo stesso output perché in tal caso non potresti recuperare un messaggio o non potresti scegliere quale messaggio è stato crittografato.
Ora, se l'output fosse inferiore all'input, per definizione ci sarebbero meno valori di output rispetto ai messaggi di input. In questo caso deve essere mappato a un valore di output che è già stato assegnato a un altro messaggio di input. Questo è chiamato il principio Pigeonhole ed è spiegato nella maggior parte dei primer di crittografia.
Quindi il meglio che puoi fare è di pareggiare il pareggio.
Anche rompersi in pari ti metterebbe nei guai se provassi a riutilizzare la chiave. Il problema è che un messaggio ripetuto sarebbe criptato sullo stesso output, facendo filtrare a un utente malintenzionato che i messaggi sono identici. Per questo la maggior parte delle cifre richiede una IV come input. A volte questo IV può essere generato durante la crittografia e la decrittografia (numeri di settore per la crittografia del disco rigido), ma spesso l'IV deve essere memorizzato accanto al testo cifrato.
E quindi avresti ancora un messaggio che è confidenziale, ma non è protetto o autenticato. In generale, è necessario aggiungere anche un tag di autenticazione. Un modo comune per farlo è calcolare un valore MAC usando HMAC.
Per questi motivi, la crittografia spesso espande la dimensione del messaggio anziché ridurlo.
Quindi l'unica cosa che puoi fare è ridurre lo spazio dei messaggi di input. Questo può essere fatto eseguendo la compressione. Ma potresti anche provare a trovare un modo migliore di codificare le informazioni nel messaggio di input. Ad esempio, XML ha un sacco di overhead, che potrebbe essere rimosso usando una codifica binaria come ASN.1 con DER o anche le strane ma estremamente efficienti regole di codifica PER.
Attenzione però che anche le dimensioni del testo cifrato possono far trapelare informazioni a un utente malintenzionato. Ad esempio il bit rate di un flusso MP3 a velocità variabile potrebbe dire molto sul contenuto del flusso, che sarebbe nascosto se un flusso costante di frequenza / formato di onda grezza venisse trasmesso in streaming.
Infine vorrei che tu indicassi Format Preserving Encryption o FPE. FPE può essere utilizzato per fornire la crittografia dei messaggi in cui lo spazio dei messaggi di output è esattamente grande quanto lo spazio dei messaggi di input, anche se lo spazio dei messaggi di input non è una potenza di due (cioè può essere codificato semplicemente come una sequenza di bit). Questo metodo viene spesso utilizzato per crittografare informazioni come i numeri delle carte di credito, in cui il messaggio di input è sicuro di non ripetere mai.
Quindi FPE è un modo sicuro e sicuro di rompere persino, dove i codici moderni spesso operano su bit, byte o blocchi completi (più byte) di testo in chiaro alla volta.