将用户输入添加到python代码 - sha1代码

时间:2016-05-08 02:53:22

标签: python python-2.7

https://gist.github.com/bonsaiviking/5639034

中的以下代码

是一个sha1哈希码,但我希望能够输入一条文本消息进行哈希处理。我只是没有看到消息应该输入到哪个(哪个变量),或者我是否需要首先根据需要调用这些函数。我对python类有点不熟悉。我理解代码在做什么,但self部分让我感到困惑。我已经阅读了类和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)

3 个答案:

答案 0 :(得分: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是等效于this的python。)如果您将函数调用为self,则instance.function()参数会自动传递(例如sha.finish()),所以它几乎就像它甚至不存在一样。如果你正在为一个班级写一个函数,你只需要关心它。

答案 1 :(得分:0)

def add(self, data):

在此功能下查看。我觉得按摩在这里消失了。那不是你的问题吗?

关于你的第二个问题,是的,你需要调用你需要的功能或只需要通用功能。

在这段代码之后你可以调用add(1,2)函数把变量放到我想希望它起作用

我认为另一个问题是你的定义不在课堂上,这就是为什么当你打电话给它时它不会给你带来结果。试着把def放在课堂上,如果有效的话,现在就让我吧

答案 2 :(得分:0)

如果你看test.py

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

data可能是我猜的输入。