Quello che stai facendo non è "crittografia", di per sé; è "hashing". La differenza principale tra i due è che la crittografia è facilmente reversibile (con la chiave corretta ovviamente), mentre l'hashing è progettato per essere estremamente difficile da invertire in qualsiasi circostanza diversa dalla conoscenza del messaggio originale in primo luogo.
In teoria, gli hash simulano un "oracolo casuale", un ipotetico omuncolo con una memoria eidetica e un modo per generare numeri perfettamente unici, perfettamente casuali senza limite superiore. Daresti un messaggio a questo ometto e succederebbe una delle due cose; o non ha mai visto il messaggio prima, nel qual caso genera un nuovo numero casuale e te lo dà come digest, o ha già visto quel messaggio prima, e così ricorda e ti dà il numero che ha generato quando lo ha visto prima volta. In quel modello teorico, non vi è alcuna relazione tra un messaggio e il suo digest e senza che un singolo numero appaia mai due volte dal RNG non c'è possibilità di una collisione.
Sfortunatamente, non abbiamo un oracolo casuale ideale; l'idea ha impossibilità pratiche per un'implementazione digitale, come la capacità dell'oracolo di archiviare e richiamare in modo efficiente ogni messaggio mai ricevuto da chiunque in qualsiasi luogo, e la capacità dei clienti di accettare un numero che potrebbe essere centinaia o migliaia di cifre decimali in lunghezza. Invece, abbiamo funzioni hash, che sono operazioni matematiche irreversibili (a senso unico) che lavorano sul messaggio stesso, per creare una trasformazione deterministica (stesso messaggio => stesso hash) senza apparenterelazione tra l'hash e il messaggio originale. Come menzionato nei commenti, non dovrebbe esserci alcuna modifica prevedibile al valore di hash prodotto apportando modifiche sistematiche al messaggio; idealmente, ogni bit del digest avrebbe una probabilità del 50% di cambiare, dato un cambio a un singolo bit del messaggio.
Ci sono molti usi per una funzione hash; vengono utilizzati per la verifica delle sfide (si pensi alle credenziali di accesso come le password) senza che entrambe le parti debbano conoscere il segreto del testo normale e vengono utilizzate come checksum per verificare che un messaggio non sia stato manomesso o danneggiato. Sono anche utilizzati nei cosiddetti scenari di "prove di lavoro"; compiti computazionali difficili da completare ma facili da verificare.
Se dovessi mai trovare un modo per invertire efficacemente un digest hash SHA256 per produrre un messaggio (qualsiasi messaggio) che provocherebbe tale hash, sarebbe una dimostrazione dimostrativa che in realtà l'hash è sostanzialmente rotto. SHA256 è, infatti, ritenuto sicuro, nel senso che non esiste un metodo documentato, non importa quanto pratico, iniziare con un digest hash e produrre un messaggio di collisione che richiede meno lavoro rispetto al semplice tentativo di ogni possibilità (che per SHA-256 è idealmente 2 ^ 256 ~ = 10 ^ 77 possibilità).