Newsgroup: it.comp.sicurezza.crittografia
Titolo: cerco algoritmo

Sto cercando un algoritmo di hash crittografico a chiave che sia
libero da brevetti e che abbia la caratteristica di fornire lo stesso
crittogramma ogni volta che eseguo la crittografazione di una stessa
stringa.
Se ho ben capito da altri post, la maggior parte degli algoritmi
disponibili in letteratura non ha questa caratteristica (che per me è
invece fondamentale).
Qualcuno ha suggerimenti?
PS: ho cercato di utilizzare i termini corretti, ma non sono esperto
di crittografia e quindi non sono certo di essermi espresso bene; in
termini "volgari" la mia richiesta è la seguente:
- devo scrivere un programma che prenda in input una stringa da
crittografare e una chiave e produca una stringa crittografata
- il mio programma deve essere tale per cui se lo eseguo due volte con
gli stessi input, mi fornisce lo stesso output
- mi pare di capire da letteratura che la maggior parte degli
algoritmi (vd ad esempio blowfish) fornisce risultati diversi in
iterazioni diverse, anche se gli input sono gli stessi
Date le mie esigenze, quale algoritmo posso usare?

Probabilmente quello che stai cercando è un HMAC 
http://en.wikipedia.org/wiki/Hmac
un meccanismo composto sulla base di un algoritmo di hashing che viene
inizializzato da una chiave oltre che dall'input.
Generalmente parlando, l'effetto a cui fai riferimento (riguardo però
Blowfish, che non è inteso come algoritmo di hasing ma di
crittografia) è dato dall'utilizzo di un 'seed' variabile per ogni
messaggio che provoca un output diverso a fronte della stessa coppia
messaggio/chiave in input.
Il seed viene utilizzato per vari buoni motivi, es evitare alcuni tipi
di attacco al crittogramma nel caso di riutilizzo della chiave (che
però non sono automaticamente estensibili al caso dell'hasing), oppure
(e questo invece riguarda l'hashing più da vicino) non consentire la
precomputazione di alcuni valori di hash attesi dall'attaccante, che
non saprà il valore del seed fino al momento stesso dell'attacco.
Se utilizzare o meno un seed è una valutazione che devi fare nel tuo
caso specifico, in genere è una buona pratica di sicurezza, in alcuni
casi è indispensabile, ma in altri (es una tabella di hash che ti
serve solo per fare delle ricerche veloci o trovare duplicati)
potrebbe anche essere semplicemente uno spreco di tempo e calcoli.

Grazie per le preziosissime informazioni.
Penso che utilizzerò un HMAC con MD5 o SHA-1
Se posso approfittarne ancora, ho un altro dubbio: MD5 e SHA-1 sono
utilizzabili liberamente?
Ho provato a cercare riferimenti e indicazioni sulla rete.
Ho trovato esempi di utilizzo di MD5 corredati di una "disclosure", il
che mi fa pensare che MD5 sia utilizzabile liberamente a patto che il
suo utilizzo venga esplicitamente dichiarato.
Per SHA-1 invece non ho trovato nessun riferimento preciso.
Qualcuno mi può aiutare?

 Per SHA-1 invece non ho trovato nessun riferimento preciso.
A quel che so i principali algoritmi di hashing e crittografici a
parte pochi casi sono di libero utilizzo (per lo più come public
domain).
La disclosure dei metodi utilizzati è sempre un buon principio nel
campo della crittografia a prescindere da ogni eventuale
considerazione di licenza: la sicurezza non deve risiedere nella
segretezza in quanto il cliente deve essere in grado di sapere quando
un componente utilizzato non è (o non è più) considerato sicuro dalla
comunità crittografica, e se vengono introdotti dei metodi non
standard è necessario che possano essere vagliati indipendentemente
per dimostrarne la sicurezza o insicurezza.
Come algoritmi ti sconsiglierei l'MD5 se la tua applicazione prevede
un certo margine di sicurezza (in altri ambiti, come la già ricordata
ricerca di duplicati o la costruzione di tabelle hash, può invece
essere tranquillamente utilizzato).
Anche per lo SHA1 comincia ad esserci qualche preoccupazione (gli
articoli a riguardo su Wikipedia, specialmente in inglese, sono molto
validi), per cui è stata creata la famiglia SHA2 di cui fanno parte ad
es. lo SHA256 e SHA512 dove il numero indica il numero di bit
dell'hash; se la sicurezza dell'hash è molto importante per la tua
applicazione ti consiglio una di queste funzioni o il Whirlpool (hash
a 512 bit basato su una modifica del Rijndael).
In alternativa, se può avere senso per il tuo sistema, si potrebbe
anche prevedere una negoziazione o una dichiarazione dell'hash usato,
consentendo di passare dai SHA2/Whirlpool, lenti ma molto sicuri, a
SHA1 o anche MD5 privilegiando la velocità a seconda delle esigenze.

 [...snip...]
Fai un po' di confusione: _tutti_ gli algoritmi di hash hanno la
caratteristica di produrre uguale output a uguale input, altrimenti che
hash produrrebbero? Quindi, per quest'uso, andrebbero bene MD5, SHA-1,
SHA-256, ecc...
L'hash non è però reversibile, cioè non puoi ricavare in alcun
(ragionevole) modo la stringa da cui sei partito. Quindi non sono
algoritmi di cifratura; anche se spesso si dicono cose tipo "cifrato con
MD5" sarebbe meglio dire "offuscato".
Viceversa, un algoritmo di cifratura generalmente _deve_ produrre output
diversi per input uguali, altrimenti si presterebbe banalmente ad un
attacco a dizionario (cioè mi cifro le parole e poi provo a vedere se le
ritrovo nel testo cifrato).
Ciao.