for rnd in range(0, 24): # AddColumnParity (Theta)
c = [0] * 5
d = [0] * 5 for i in range(0, 25):
c[i % 5] ^= s[i] for i in range(0, 5):
d[i] = c[(i + 4) % 5] ^ _rol(c[(i + 1) % 5], 1) for i in range(0, 25):
s[i] ^= d[i % 5] # RotateWords (Rho) for i in range(0, 25):
s[i] = _rol(s[i], ROTATIONS[i]) # PermuteWords (Pi)
t = s[PERMUTATION[0]] for i in range(0, len(PERMUTATION) - 1):
s[PERMUTATION[i]] = s[PERMUTATION[i + 1]]
s[PERMUTATION[-1]] = t # NonlinearMixRows (Chi) for i in range(0, 25, 5):
t = [
s[i],
s[i + 1],
s[i + 2],
s[i + 3],
s[i + 4],
s[i],
s[i + 1],
] for j in range(0, 5):
s[i + j] = t[j] ^ ((~t[j + 1]) & (t[j + 2])) # AddRoundConstant (Iota)
s[0] ^= RC[rnd]
# Reinterpret octet array b to word array and XOR it to state s. def _reinterpret_to_words_and_xor(s, b): for j in range(0, len(b) // 8):
s[j] ^= _from_le(b[8 * j : 8 * j + 8])
# Reinterpret word array w to octet array and return it. def _reinterpret_to_octets(w):
mp = bytearray() for j in range(0, len(w)):
mp += int_to_bytes(w[j], 8, byteorder="little") return mp
def _sha3_raw(msg, r_w, o_p, e_b): """Semi-generic SHA-3 implementation"""
r_b = 8 * r_w
s = [0] * 25 # Handle whole blocks.
idx = 0
blocks = len(msg) // r_b for i in range(0, blocks):
_reinterpret_to_words_and_xor(s, msg[idx : idx + r_b])
idx += r_b
_sha3_transform(s) # Handle last block padding.
m = bytearray(msg[idx:])
m.append(o_p) while len(m) < r_b:
m.append(0)
m[len(m) - 1] |= 128 # Handle padded last block.
_reinterpret_to_words_and_xor(s, m)
_sha3_transform(s) # Output.
out = bytearray() while len(out) < e_b:
out += _reinterpret_to_octets(s[:r_w])
_sha3_transform(s) return out[:e_b]
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.