0
0

More than 3 years have passed since last update.

pythonでsha256

Last updated at Posted at 2021-05-15

概要

pythonでsha256やってみた。

参考にしたページ。

サンプルコード

import copy
import struct
import sys

def hexdigest(m):
    return Sha256(m).hexdigest()

class Sha256(object):
    _k = (0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
          0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
          0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
          0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
          0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
          0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
          0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
          0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2)
    _h = (0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19)
    _output_size = 8
    blocksize = 1
    block_size = 64
    digest_size = 32
    def __init__(self, m):
        self._buffer = b''
        self._counter = 0
        if type(m) is not str:
            raise TypeError('%s() argument 1 must be string, not %s' % (self.__class__.__name__, type(m).__name__))
        b = bytearray.fromhex(m)
        self.update(b)
    def _rotr(self, x, y):
        return ((x >> y) | (x << (32 - y))) & 0xFFFFFFFF
    def _sha256_process(self, c):
        w = [0] * 64
        w[0:16] = struct.unpack('!16L', c)
        for i in range(16, 64):
            s0 = self._rotr(w[i - 15], 7) ^ self._rotr(w[i - 15], 18) ^ (w[i - 15] >> 3)
            s1 = self._rotr(w[i - 2], 17) ^ self._rotr(w[i - 2], 19) ^ (w[i - 2] >> 10)
            w[i] = (w[i - 16] + s0 + w[i - 7] + s1) & 0xFFFFFFFF
        a, b, c, d, e, f, g, h = self._h
        for i in range(64):
            s0 = self._rotr(a, 2) ^ self._rotr(a, 13) ^ self._rotr(a, 22)
            maj = (a & b) ^ (a & c) ^ (b & c)
            t2 = s0 + maj
            s1 = self._rotr(e, 6) ^ self._rotr(e, 11) ^ self._rotr(e, 25)
            ch = (e & f) ^ ((~e) & g)
            t1 = h + s1 + ch + self._k[i] + w[i]
            h = g
            g = f
            f = e
            e = (d + t1) & 0xFFFFFFFF
            d = c
            c = b
            b = a
            a = (t1 + t2) & 0xFFFFFFFF
        self._h = [(x + y) & 0xFFFFFFFF for x, y in zip(self._h, [a, b, c, d, e, f, g, h])]
    def update(self, m):
        self._buffer += m
        self._counter += len(m)
        while len(self._buffer) >= 64:
            self._sha256_process(self._buffer[:64])
            self._buffer = self._buffer[64:]
    def digest(self):
        mdi = self._counter & 0x3F
        length = struct.pack('!Q', self._counter << 3)
        if mdi < 56:
            padlen = 55 - mdi
        else:
            padlen = 119 - mdi
        r = self.copy()
        r.update(b'\x80' + (b'\x00' * padlen) + length)
        return b''.join([struct.pack('!L', i) for i in r._h[:self._output_size]])
    def hexdigest(self):
        return self.digest().hex()
    def copy(self):
        return copy.deepcopy(self)

print('in: 616263')
print(hexdigest('616263'))
print('in: ')
print(hexdigest(''))
print('in: d3')
print(hexdigest('d3'))
print('in: 11af')
print(hexdigest('11af'))





結果




in: 616263
ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
in:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
in: d3
28969cdfa74a12c82f3bad960b0b000aca2ac329deea5c2328ebc6f2ba9802c1
in: 11af
5ca7133fa735326081558ac312c620eeca9970d1e70a4b95533d956f072d1f98


以上。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0