Код ниже от 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)
Извините за вопрос, но почему бы не использовать реализацию sha1 из модуля hashlib? Написание собственной криптографической хэш-функции обычно не является лучшей идеей – Daniel
целей обучения. понимая криптографические процедуры с нуля. Хашлиб слишком прост. – LewisFletch