Blockchiffre aus Hashfunktion basteln

pi()

New member
#1
Hi Leute!

Mal ne Frage:


Nehmen wir an, ich habe eine kryptographische Hashfunktion, zum Beispiel SHA256.
Hashfunktionen sind ja ansich eine super Sache ...kann man doch so vieles damit machen.

Jetzt eine Frage. Aus einer hashfunktion müsste sich doch auch ganz leicht eine Blockchiffre machen lassen. Zum Beispiel:



PHP:
def encrypt(key, plaintext):
   counter=0
   ciphertext=[]

   for block in plaintext:
      temp=hash(counter + key)
      ciphertext.append(temp XOR block)
      counter+=1

   return ciphertext
Ist dieser Algorithmus sicher, wenn man eine bisher praktisch nicht gebrochene Hashfunktion verwendet?
Wenn nein: Warum nicht? Wann nicht? Wann schon?
Welche Schwächen könnte man sich dadurch einbrocken?

Danke

Bin sehr gespannt.
 
#2
Eines der Ziele einer Hashfunktion ist, schwer umkehrbar zu sein. Eines der Ziele einer Verschlüsselung ist, durch Kenntnis eines Geheimnisses einfach umkehrbar zu sein. Wenn du eine Hashfunktion zur Verschlüsselung nutzt, kannst du sie also nicht wieder entschlüsseln und eine Verschlüsselung ohne Entschlüsselung ist witzlos.

Edit: Sorry, hatte den Quelltext nicht richtig gelesen.
 
Zuletzt bearbeitet:

CDW

Moderator
Mitarbeiter
#3
DerW hat gesagt.:
, kannst du sie also nicht wieder entschlüsseln und eine Verschlüsselung ohne Entschlüsselung ist witzlos.
Er kann die Nachricht wieder entschlüsseln, da hier mittels hash(key+counter) ein Stream produziert wird, mit dem dann gexort wird ;)
Allerdings wird so, "as is", der gleiche Stream (sofern das Passwort gleich ist) für verschiedene Geheimnachrichten benutzt, was z.B einen Knownplaintext ermöglicht.
D.h. sobald wir den Klartext einer Nachricht kennen, können wir alle anderen Nachrichten an dieser Position entschlüsseln.
Ferner sollte es anfällig gegenüber many-one-timepad-Angriff sein:
GitHub - Jwomers/many-time-pad-attack: Attacking A Many Time Pad - Cryptography
 

pi()

New member
#4
haha, ja entschlüsselbar ist es wohl.

Aber du, CDW, hast recht! Das habe ich überhaupt nicht beachtet.

Ok dann noch eine kleine Änderung nach dem Vorbild: von

Counter Mode – Wikipedia


Neuer Code:
PHP:
nonce=secureRandom() # woher auch immer die zahl kommt :)
def encrypt(key, plaintext):
   counter=0
   ciphertext=[]
   ciphertext.append(nonce) #wir merken uns die nonce, weil wir sie beim Entschlüsseln wieder brauchen
   for block in plaintext:
      temp=hash(counter + key + nonce)
      ciphertext.append(temp XOR block)
      counter+=1

   return ciphertext
 
Zuletzt bearbeitet:
#5
Ist halt die Frage, ob es sicherer ist, als eine normale Blockchiffre im CTR-Mode. Insgesamt erzeugst du durch die Hashfunktion eine zufällig wirkende Ziffernfolge und XOR'st damit den Plaintext. D.h. du manipulierst lediglich den verwendeten Key, wie du es ohnehin mit der NONCE gemacht hättest. Aber wird damit die Komplexität erhöht?
 

pi()

New member
#6
Ist halt die Frage, ob es sicherer ist, als eine normale Blockchiffre im CTR-Mode. Insgesamt erzeugst du durch die Hashfunktion eine zufällig wirkende Ziffernfolge und XOR'st damit den Plaintext. D.h. du manipulierst lediglich den verwendeten Key, wie du es ohnehin mit der NONCE gemacht hättest. Aber wird damit die Komplexität erhöht?
Nein also sicherer ist es sicher nicht.
Es ist eher unsicherer, weil diese "Kombination" ja nicht analysiert wurde, AES-CTR zB hingegen sehrwohl. Außerdem ist es wahrscheinlich langsamer.

Die Frage ist eher, ist es sicher genug dass ich es verwenden kann, wenn ich zB nur SHA Hardware habe, und aber gerne eine schnelle Verschlüsselung implementieren will.

Lg
 
Oben