ich beschäftige mich jetzt seit ca. 2 Wochen auf Grund eines Wahlpflichtmoduls mit Python und stolpere bei der aktuellen Aufgabe über die ein oder anderen Probleme bei denen ich Hilfe gebrauchen könnte.
Zur aktuellen Aufgabe:
Es soll ein Vorgegebener String mit einer eigenen "pseudo" Hashfunktion gehased werden.
Zum Problem:
Mein Verständnis bezüglich dem Umgang mit den Datentypen besonderst dem Ergebnis der Funktion "bytes" oder dem Datentyp "bytearray".
Wie kann ein String einmal 35 Bytes groß sein und der gleiche String als byte-Objekt 27Byte? Ich kann ja nur Bitoperationen auf int anwenden.
Wie bekomme ich jetzt den String in mehrer ints.
Mein versuchter Ansatz:
- String umwandeln in Bytes
- Falls String nicht mehrfaches der Blocksize entsprechend erweitern.
- String in Blöcke zerhacken welche der länge der Blocksize entsprechen
- Blöcke mit einem ersten Hashwert in Compressionfunktion schieben und dort XOR verknüpfen => neuer Hashwert
- Neuen Hashwert mit nächstem Block in Compressionsfunktion.
- Nachdem alle Blöcke abgearbeitet sind Hash Fertig
Code: Alles auswählen
from bitstream import *
import struct
import sys
hashstring = 'Dieser String soll gehased werden!1337'
hashlist = [(0x0123456789abcdef0123456789abcdef).to_bytes(32,'big')] #start Hash
#macht aus einem Hash und einem Block einen neuen Hash
def compress(preHash, block):
#test = bytearray(preHash)
#test2 = bytearray(block)
#test2.append(not(block))
#for i in range(len(test)):
# print("Hashwert",hex(test[i]))
# print("Blockwert",hex(test2[i]))
# print("---")
hashTMP = (preHash) | (block)
return hashTMP
#zerstückeln der Nachricht in Blöcke
def messegeAsBlocklist(message, blockSize):
blocklist=list()
for i in range(0, len(message) // blockSize,):
blockTMP = (message[blockSize*i:(i+1)*blockSize])
blocklist.append(blockTMP)
return blocklist
#nachricht erweitern falls notwendig
def expandMessage(message, blockSize):
expandCount = ((blockSize - (len(message) % blockSize)) % blockSize)
message = bytes(message, "ascii")
#es müssen mehr zeichen hinzugefügt werden als die Nachricht lang ist
if len(message) < expandCount:
for i in range(expandCount):
message = message + (message[i]).to_bytes(1,'big')
else:
message = (message + message[0:(expandCount)])
return (message)
def hashMessage(message, blockSize):
#Erweitert die Nachricht falls nötig auf das nächste vielfache der BlockSize
expandedMSG = expandMessage(message, blockSize)
blocklist = messegeAsBlocklist(expandedMSG, blockSize)
for i in range(len(blocklist)):
hashlist.append(compress(hashlist[i], blocklist[i]))
# Testaufrufe
if __name__ == '__main__':
hashMessage(hashstring, 32)