Files
@ 9ccd379021d5
Branch filter:
Location: Shamira/src/gf256.py - annotation
9ccd379021d5
1.1 KiB
text/x-python
input/output wrappers
9ccd379021d5 9ccd379021d5 9ccd379021d5 86a5417085ef 9ccd379021d5 86a5417085ef 86a5417085ef 86a5417085ef 86a5417085ef 86a5417085ef 86a5417085ef 86a5417085ef 86a5417085ef 86a5417085ef 86a5417085ef 9ccd379021d5 9ccd379021d5 9ccd379021d5 86a5417085ef 86a5417085ef 86a5417085ef 86a5417085ef 86a5417085ef 86a5417085ef 9ccd379021d5 86a5417085ef 86a5417085ef 86a5417085ef 9ccd379021d5 86a5417085ef 86a5417085ef 86a5417085ef 86a5417085ef 438dcebc9c63 438dcebc9c63 438dcebc9c63 9ccd379021d5 9ccd379021d5 9ccd379021d5 438dcebc9c63 438dcebc9c63 438dcebc9c63 438dcebc9c63 438dcebc9c63 438dcebc9c63 db65075fe7e0 db65075fe7e0 9ccd379021d5 9ccd379021d5 9ccd379021d5 db65075fe7e0 db65075fe7e0 db65075fe7e0 db65075fe7e0 db65075fe7e0 db65075fe7e0 db65075fe7e0 db65075fe7e0 db65075fe7e0 db65075fe7e0 | """Arithmetic operations on Galois Field 2**8."""
def _ffmul(a, b):
"""Basic multiplication."""
r=0
while a!=0:
if (a&1)!=0: r^=b
t=b&0x80
b=(b<<1)&255
if t!=0: b^=0x1b
a>>=1
return r
g=3 # generator
E=[None]*256 # exponentials
L=[None]*256 # logarithms
acc=1
for i in range(256):
E[i]=acc
L[acc]=i
acc=_ffmul(acc, g)
L[1]=0
inv=[E[255-L[i]] if i!=0 else None for i in range(256)] # multiplicative inverse
def ffmul(a, b):
"""Fast multiplication. Basic multiplication is expensive. a*b==g**(log(a)+log(b))"""
if a==0 or b==0: return 0
t=L[a]+L[b]
if t>255: t-=255
return E[t]
def evaluate(coefs,x):
"""Evaluate polynomial's value at x.
:param coefs: [a0, a1, ...]."""
res=0
xK=1
for a in coefs:
res^=ffmul(a,xK)
xK=ffmul(xK,x)
return res
def getConstantCoef(*points):
"""Compute constant polynomial coefficient given the points."""
k=len(points)
res=0
for i in range(k):
(x,y)=points[i]
prod=1
for j in range(k):
if i==j: continue
(xj,yj)=points[j]
prod=ffmul(prod, (ffmul(xj,inv[xj^x])))
res^=ffmul(y,prod)
return res
|