LFSR

Linear Feedback Shift Register

Used to generate a stream for OTP.

Defined by:

  • BitSize (Length of internal state)

  • CharacteristicPolynomial (Function to be calculated for generating new values)

  • InitialState (Initial state)

By knowing the CharacteristicPolynomial of an N-BitSize, it is possible to recover the internal state by observing a subsequence of N outputs. This makes it possible to predict subsequent sequences and recover old ones. Moreover, even if one does not know the CharacteristicPolynomial, it is possible to recover it with a sequence of observations. Berlekamp-Massey algorithm allows finding LFSR for a sequence of outputs.

Code

From HERE.

#!/usr/bin/env python

def Berlekamp_Massey_algorithm(sequence):
    N = len(sequence)
    s = sequence[:]

    for k in range(N):
        if s[k] == 1:
            break
    f = set([k + 1, 0])  # use a set to denote polynomial
    l = k + 1

    g = set([0])
    a = k
    b = 0

    for n in range(k + 1, N):
        d = 0
        for ele in f:
            d ^= s[ele + n - l]

        if d == 0:
            b += 1
        else:
            if 2 * l > n:
                f ^= set([a - b + ele for ele in g])
                b += 1
            else:
                temp = f.copy()
                f = set([b - a + ele for ele in f]) ^ g
                l = n + 1 - l
                g = temp
                a = b
                b = n - l + 1

    # output the polynomial
    def print_poly(polynomial):
        result = ''
        lis = sorted(polynomial, reverse=True)
        for i in lis:
            if i == 0:
                result += '1'
            else:
                result += 'x^%s' % str(i)

            if i != lis[-1]:
                result += ' + '

        return result

    return (print_poly(f), l)


if __name__ == '__main__':
    seq = (0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0)
    (poly, span) = Berlekamp_Massey_algorithm(seq)

    print 'The input sequence is %s.' % str(seq)
    print 'Its characteristic polynomial is (%s),' % poly,
    print 'and linear span is %d.' % span

Last updated

Was this helpful?