2016-05-08 5 views
0

Код ниже от https://gist.github.com/bonsaiviking/5639034добавления пользовательского ввода кода Python - sha1 код

является кодом sha1 хэширования, но я хотел бы иметь возможность вводить текст сообщение для него, чтобы хэширования. И я просто не вижу, где (какая переменная) сообщение должно быть введено, или если мне нужно сначала вызвать функции по мере необходимости. Я немного незнакомый с классами python. Я понимаю, что делает код, однако часть его меня смущает. Я читал о классах и python self, но я все еще смущен.

Может кто-нибудь, пожалуйста, направит меня в правильном направлении, как ввести сообщение, которое будет хэшировано в приведенном ниже коде. благодаря

#!/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

Извините за вопрос, но почему бы не использовать реализацию sha1 из модуля hashlib? Написание собственной криптографической хэш-функции обычно не является лучшей идеей – Daniel

+0

целей обучения. понимая криптографические процедуры с нуля. Хашлиб слишком прост. – LewisFletch

ответ

1

Вам не нужно беспокоиться о self, если вы не написали код в пределах класса. Использование класса SHA1 так же легко, как

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

Или, чтобы использовать .add функции:

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

разработать на self: Функции, определенные в классе нужно экземпляр этого класса для работы. Этот экземпляр передается функции в качестве первого параметра и обычно называется self. (Если вы знакомы с другими языками программирования, self является эквивалентом python this.) Параметр self передается автоматически, если вы вызываете функцию как instance.function() (например, sha.finish()), так что почти так же, как и там. Вам нужно только заботиться о нем, если вы пишете функцию для класса.

+0

Спасибо, что объяснил это, я попытался хешировать слово сейчас, и оно выводится как '* l5 OΘ _ @ F' Мне нужно вывести его в шестнадцатеричном или base64? – LewisFletch

+0

И спасибо за объяснение 'self'. это делает его более ясным. я думаю, что это смутило меня, потому что я не был уверен, могу ли я назвать класс, как вы это делали в приведенном выше примере, или что он будет работать одинаково. – LewisFletch

+0

@LewisFletch: Вам нужен гексагон. Вы можете использовать '. '.join ('% 02x '% ord (c) для c в sha.finish())', чтобы получить шестнадцатеричное представление. –

0
def add(self, data): 

Посмотрите под эту функцию. Я думаю, что массаж проходит здесь. Это не ваш вопрос?

О вашем втором вопросе, да, вам нужно вызвать нужные вам функции или просто общую функцию.

После выполнения этого кода вы можете вызвать надстройку функции (1,2) положенный veriables Я надеюсь, что это работает

Я думаю, что другая проблема ваши определений не в классе Так вот почему, когда вы вызываете класс он выиграл Не давайте результата. Попробуйте поставить ДЕФа в классе, и пусть меня теперь, если он работает

+0

Hrmrmr, возможно. Я видел это раньше, но он вообще не вызывает функцию 'finish'. – LewisFletch

+0

https://www.youtube.com/watch?v=M1BAlDufqao в этом уроке он охватывает классы и «я». Я пытаюсь понять, почему финиш не работает.Я также новичок в программировании, но ища ответы сейчас :) –

+0

Я отредактировал мою проверку проверки обновлений mate –

0

Если вы посмотрите на test.py:

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

data в sha1.py, вероятно, является входом, я думаю.

Смежные вопросы