2016-05-08 7 views
0

Der Code unten aus https://gist.github.com/bonsaiviking/5639034Hinzufügen von Benutzereingaben zu Python-Code - SHA1-Code

ist ein SHA1-Hash-Code, aber ich möchte Eingang für sie eine Textnachricht an Hash können. Und ich sehe einfach nicht, wo (welche Variable) die Nachricht eingegeben werden soll, oder ob ich die Funktionen zuerst aufrufen muss, wie ich sie brauche. Ich bin ein wenig mit Python-Klassen nicht vertraut. Ich verstehe, was der Code tut, aber der self Teil verwirrt mich. Ich habe über Klassen und die Python self gelesen, bin aber immer noch verwirrt darüber.

Könnte mir bitte jemand in die richtige Richtung zeigen, wie man eine Nachricht eingibt, die im folgenden Code gehashed wird.

dank
#!/usr/bin/env python 

import struct 

def leftrotate(i, n): 
    return ((i << n) & 0xffffffff) | (i >> (32 - n)) 

class SHA1(object): 
    def __init__(self, data=""): 
     self.h = [ 
       0x67452301, 
       0xEFCDAB89, 
       0x98BADCFE, 
       0x10325476, 
       0xC3D2E1F0 
       ] 
     self.remainder = data 
     self.count = 0 

    def _add_chunk(self, chunk): 
     self.count += 1 
     w = list(struct.unpack(">16I", chunk) + (None,) * (80-16)) 
     for i in xrange(16, 80): 
      n = w[i-3]^w[i-8]^w[i-14]^w[i-16] 
      w[i] = leftrotate(n, 1) 
     a,b,c,d,e = self.h 
     for i in xrange(80): 
      f = None 
      k = None 
      if i < 20: 
       f = (b & c)^(~b & d) 
       k = 0x5A827999 
      elif i < 40: 
       f = b^c^d 
       k = 0x6ED9EBA1 
      elif i < 60: 
       f = (b & c)^(b & d)^(c & d) 
       k = 0x8F1BBCDC 
      else: 
       f = b^c^d 
       k = 0xCA62C1D6 

      temp = (leftrotate(a,5) + f + e + k + w[i]) % 2**32 
      e = d 
      d = c 
      c = leftrotate(b, 30) 
      b = a 
      a = temp 
     self.h[0] = (self.h[0] + a) % 2**32 
     self.h[1] = (self.h[1] + b) % 2**32 
     self.h[2] = (self.h[2] + c) % 2**32 
     self.h[3] = (self.h[3] + d) % 2**32 
     self.h[4] = (self.h[4] + e) % 2**32 

    def add(self, data): 
     message = self.remainder + data 
     r = len(message) % 64 
     if r != 0: 
      self.remainder = message[-r:] 
     else: 
      self.remainder = "" 
     for chunk in xrange(0, len(message)-r, 64): 
      self._add_chunk(message[chunk:chunk+64]) 
     return self 

    def finish(self): 
     l = len(self.remainder) + 64 * self.count 
     self.add("\x80" + "\x00" * ((55 - l) % 64) + struct.pack(">Q", l * 8)) 
     h = tuple(x for x in self.h) 
     self.__init__() 
     return struct.pack(">5I", *h) 
+0

Sorry für die Frage, aber warum nicht mit Sha1-Implementierung von hashlib-Modul? Schreiben Sie Ihre eigene kryptographische Hash-Funktion in der Regel nicht die beste Idee – Daniel

+0

Lernzwecke. die kryptografischen Routinen von Grund auf verstehen. Hashlib ist zu einfach. – LewisFletch

Antwort

1

Sie müssen sich nicht mit self befassen, außer Sie schreiben innerhalb der Klasse. die SHA1-Klasse ist so einfach wie

data= raw_input('Enter text to hash: ') 
sha= SHA1(data) 
print 'SHA-1 hash:', sha.finish() 

Oder Verwendung der .add Funktion zu machen:

sha= SHA1() 
data= raw_input('Enter text to hash: ') 
sha.add(data) 
print 'SHA-1 hash:', sha.finish() 

auf self zu erarbeiten: Funktionen, die innerhalb einer Klasse müssen eine Instanz definiert werden von dieser Klasse zu operieren. Diese Instanz wird als erster Parameter an die Funktion übergeben und heißt normalerweise self. (Wenn Sie mit anderen Programmiersprachen vertraut sind, ist self das Python-Äquivalent von this.) Der self Parameter wird automatisch übergeben, wenn Sie eine Funktion wie instance.function() aufrufen (zum Beispiel sha.finish()), also ist es fast so, als wäre es gar nicht da. Sie müssen sich nur darum kümmern, wenn Sie eine Funktion für eine Klasse schreiben.

+0

Danke für das Erklären, ich habe versucht, jetzt ein Wort zu hacken und es gibt als '* l5 OΘ _ @ aus F' Muss ich es in Hexadezimal oder Base64 ausgeben? – LewisFletch

+0

Und danke für die 'Selbst' Erklärung. es macht es klarer. Ich denke, es hat mich verwirrt, weil ich nicht sicher war, ob ich die Klasse wie im obigen Beispiel nennen könnte oder dass es genauso funktionieren würde. – LewisFletch

+0

@LewisFletch: Sie brauchen hex. Sie können ''' .join ('% 02x'% ord (c) für c in sha.finish())' verwenden, um die hexadezimale Darstellung zu erhalten. –

0
def add(self, data): 

unter dieser Funktion Halten Sie Ausschau. Ich denke, die Massage geht hier durch. Ist das nicht deine Frage?

Über Ihre zweite Frage, ja müssen Sie die Funktionen aufrufen, die Sie benötigen oder nur die allgemeine Funktion.

Nachdem dieser Code Sie das Add nennen kann (1,2) Funktion veriables habe ich hoffe, es funktioniert

denke ich, das andere Problem ist Ihre Definition ist in der Klasse nicht so ist, warum, wenn Sie Klasse nennen es gewonnen Ich gebe dir kein Ergebnis. Versuchen Sie auf jeden Fall die in der Klasse zu setzen und lassen Sie mich jetzt, wenn es

+0

Hrmmr, möglicherweise. Ich habe das schon vorher gesehen, aber es nennt die Funktion 'finish' überhaupt nicht. – LewisFletch

+0

https://www.youtube.com/watch?v=M1BAlDufqao in diesem Tutorial behandelt es Klassen und Selbst. Ich versuche zu verstehen, warum Finish nicht funktioniert.Ich bin auch neu im Programmieren, aber suche jetzt nach Antworten :) –

+0

Ich habe mein Massagecheckupdate mate bearbeitet –

0

funktioniert Wenn Sie bei test.py aussehen:

`msg = bytearray(get_random_bytes()) 
    first_digest = sha1.sha1(bytes(msg)) 
    second_digest = sha1.sha1(bytes(msg))` 

data in sha1.py wahrscheinlich der Eingang ist, denke ich.

Verwandte Themen