Citat:
Ursprungligen postat av
Xer0
Försöker hitta på ett bra sätt (för skoj) att kyptera mha. godtycklig krypografiskt säker hash.
Det jag tänkte var följande "algorithm":
Kod:
Generering av nycklar:
nyckel0 = hash(lösenord + salt)
nyckel1 = hash(lösenord + nyckel0)
nyckel2 = hash(lösenord + nyckel1)
nyckel3 = hash(lösenord + nyckel2)
nyckelN = hash(lösenord + nyckelN)
Kyrptering:
block0 = data0 xor nyckel0
block1 = data1 xor nyckel1
block2 = data2 xor nyckel2
blockN = dataN xor nyckelN
Dekryptering:
data0 = block0 xor nyckel0
data1 = block1 xor nyckel1
data2 = block2 xor nyckel2
dataN = blockN xor nyckelN
Tycker att det borde hålla rätt bra mot "known plaintext attack".
Säg att jag känner till data0. Då kan jag ta data0 xor block0 och få ut nyckel0, men det
ger mig ändå inte nyckel1 eller nyckel2 eftersom jag ändå inte kan få fram lösenordet på det viset.
Mönster i datat syns inte eftersom vi har en kedja av hashar där nyckeln hela tiden kommer att förändras. Kravet på en krypografisk hash är att en liten förändring i data (säg en bit) inte skall ge en snarlik hash, utan det skall ge en, till synes, slumpmässig hash.
Kärnan är altså i att vi har den här magiska hash fuktionen som vi antar är kyptografiskt säker.
Varför är det här en dålig ide?
Det är beräkningsmässigt dyrt att räkna ut alla hasharna, men folk minar ju bitcoins, så det är klart att det är görbart om man vill.
Är det osäkert?
Du gör alltså ett block cipher där den enda operation som görs på blocket är xor, och en keystretchingalgoritm där du rekursivt utökar nyckeln genom att kombinera resultatet av föregående iteration med nyckelordet, för att generera en nyckel som är lika lång som meddelandet.
Ja, det är sårbart för flera olika typer av angrepp.
Först och främst vill jag säga att du av misstag snuddat vid det enda koncept som gör det omöjligt att ens i teorin knäcka ett skiffer; en nyckel som är lika lång som klartexten. Då kan du varken angripa nyckeln eller skiffertexten.
Två saker krävs dock för att detta ska vara sant; nyckeln måste vara fullständigt slumpmässig, och du får inte använda samma nyckel till mer än ett meddelande. Bryter du mot någotdera kan du i teorin alltid få fram klartexten, och i praktiken rätt ofta.
Eftersom varje nyckel bara får användas en gång kallas detta system ofta för "one time pad", något du säkert känner igen. Du kanske också känner till att Japan under slutet av andra världskriget började använda detta system, och att de allierade knäckte ett dugligt antal av dessa meddelanden? Då var ändå nycklarna perfekt slumpmässiga.
Din genererade nyckel är inte ett dugg slumpmässig, och det gör dig sårbar för known ciphertext-attacker, och då är det ingen större mening att fundera på om den är sårbar för known plaintext. Vilket den också är, även partial, för övrigt.
Eftersom din algoritm utgår från ett lösenord kommer det med rätt stor sannolikhet skickas flera meddelanden med samma nyckel, vilket gör att man kan knäcka den relativt enkelt.
Och sist, men inte minst; man kan angripa lösenordet, eftersom man bara behöver testa första hashen mot det första blocket i meddelandet, och förkasta alla resultat som är uppenbart fel. Här skulle du vara hjälp av att padda ett antal block med äkta slumpdata, för att göra det mer tidskrävande att generera en tillräckligt lång nyckel.
Om du genererade en fullkomligt slumpmässig nyckel, och gjorde det för varje meddelande, skulle din algoritm vara säker, men eftersom du då måste lämna över nyckeln till mottagaren på ett säkert vis, och den då är lika lång som meddelandet, skulle du lika gärna kunna lämna över meddelandet direkt.