Stream Ciphers¶
- class sage.crypto.stream_cipher.LFSRCipher(parent, poly, IS)[source]¶
Bases:
SymmetricKeyCipher
Create a linear feedback shift register (LFSR) cipher.
INPUT:
parent
– parentpoly
– connection polynomialIS
– initial state
EXAMPLES:
sage: FF = FiniteField(2) sage: P.<x> = PolynomialRing(FF) sage: E = LFSRCryptosystem(FF) sage: E LFSR cryptosystem over Finite Field of size 2 sage: IS = [ FF(a) for a in [0,1,1,1,0,1,1] ] sage: g = x^7 + x + 1 sage: e = E((g,IS)) sage: B = BinaryStrings() sage: m = B.encoding("THECATINTHEHAT") sage: e(m) 0010001101111010111010101010001100000000110100010101011100001011110010010000011111100100100011001101101000001111 sage: FF = FiniteField(2) sage: P.<x> = PolynomialRing(FF) sage: LFSR = LFSRCryptosystem(FF) sage: e = LFSR((x^2+x+1,[FF(0),FF(1)])) sage: B = e.domain() sage: m = B.encoding("The cat in the hat.") sage: e(m) 00111001110111101011111001001101110101011011101000011001100101101011001000000011100101101010111100000101110100111111101100000101110101111010111101000011 sage: m == e(e(m)) True
>>> from sage.all import * >>> FF = FiniteField(Integer(2)) >>> P = PolynomialRing(FF, names=('x',)); (x,) = P._first_ngens(1) >>> E = LFSRCryptosystem(FF) >>> E LFSR cryptosystem over Finite Field of size 2 >>> IS = [ FF(a) for a in [Integer(0),Integer(1),Integer(1),Integer(1),Integer(0),Integer(1),Integer(1)] ] >>> g = x**Integer(7) + x + Integer(1) >>> e = E((g,IS)) >>> B = BinaryStrings() >>> m = B.encoding("THECATINTHEHAT") >>> e(m) 0010001101111010111010101010001100000000110100010101011100001011110010010000011111100100100011001101101000001111 >>> FF = FiniteField(Integer(2)) >>> P = PolynomialRing(FF, names=('x',)); (x,) = P._first_ngens(1) >>> LFSR = LFSRCryptosystem(FF) >>> e = LFSR((x**Integer(2)+x+Integer(1),[FF(Integer(0)),FF(Integer(1))])) >>> B = e.domain() >>> m = B.encoding("The cat in the hat.") >>> e(m) 00111001110111101011111001001101110101011011101000011001100101101011001000000011100101101010111100000101110100111111101100000101110101111010111101000011 >>> m == e(e(m)) True
FF = FiniteField(2) P.<x> = PolynomialRing(FF) E = LFSRCryptosystem(FF) E IS = [ FF(a) for a in [0,1,1,1,0,1,1] ] g = x^7 + x + 1 e = E((g,IS)) B = BinaryStrings() m = B.encoding("THECATINTHEHAT") e(m) FF = FiniteField(2) P.<x> = PolynomialRing(FF) LFSR = LFSRCryptosystem(FF) e = LFSR((x^2+x+1,[FF(0),FF(1)])) B = e.domain() m = B.encoding("The cat in the hat.") e(m) m == e(e(m))
- connection_polynomial()[source]¶
The connection polynomial defining the LFSR of the cipher.
EXAMPLES:
sage: k = GF(2) sage: P.<x> = PolynomialRing( k ) sage: LFSR = LFSRCryptosystem( k ) sage: e = LFSR((x^2+x+1,[k(0), k(1)])) sage: e.connection_polynomial() x^2 + x + 1
>>> from sage.all import * >>> k = GF(Integer(2)) >>> P = PolynomialRing( k , names=('x',)); (x,) = P._first_ngens(1) >>> LFSR = LFSRCryptosystem( k ) >>> e = LFSR((x**Integer(2)+x+Integer(1),[k(Integer(0)), k(Integer(1))])) >>> e.connection_polynomial() x^2 + x + 1
k = GF(2) P.<x> = PolynomialRing( k ) LFSR = LFSRCryptosystem( k ) e = LFSR((x^2+x+1,[k(0), k(1)])) e.connection_polynomial()
- initial_state()[source]¶
The initial state of the LFSR cipher.
EXAMPLES:
sage: k = GF(2) sage: P.<x> = PolynomialRing( k ) sage: LFSR = LFSRCryptosystem( k ) sage: e = LFSR((x^2+x+1,[k(0), k(1)])) sage: e.initial_state() [0, 1]
>>> from sage.all import * >>> k = GF(Integer(2)) >>> P = PolynomialRing( k , names=('x',)); (x,) = P._first_ngens(1) >>> LFSR = LFSRCryptosystem( k ) >>> e = LFSR((x**Integer(2)+x+Integer(1),[k(Integer(0)), k(Integer(1))])) >>> e.initial_state() [0, 1]
k = GF(2) P.<x> = PolynomialRing( k ) LFSR = LFSRCryptosystem( k ) e = LFSR((x^2+x+1,[k(0), k(1)])) e.initial_state()
- class sage.crypto.stream_cipher.ShrinkingGeneratorCipher(parent, e1, e2)[source]¶
Bases:
SymmetricKeyCipher
Create a shrinking generator cipher.
INPUT:
parent
– parentpoly
– connection polynomialIS
– initial state
EXAMPLES:
sage: FF = FiniteField(2) sage: P.<x> = PolynomialRing(FF) sage: LFSR = LFSRCryptosystem(FF) sage: IS_1 = [ FF(a) for a in [0,1,0,1,0,0,0] ] sage: e1 = LFSR((x^7 + x + 1,IS_1)) sage: IS_2 = [ FF(a) for a in [0,0,1,0,0,0,1,0,1] ] sage: e2 = LFSR((x^9 + x^3 + 1,IS_2)) sage: E = ShrinkingGeneratorCryptosystem() sage: e = E((e1,e2)) sage: e Shrinking generator cipher on Free binary string monoid
>>> from sage.all import * >>> FF = FiniteField(Integer(2)) >>> P = PolynomialRing(FF, names=('x',)); (x,) = P._first_ngens(1) >>> LFSR = LFSRCryptosystem(FF) >>> IS_1 = [ FF(a) for a in [Integer(0),Integer(1),Integer(0),Integer(1),Integer(0),Integer(0),Integer(0)] ] >>> e1 = LFSR((x**Integer(7) + x + Integer(1),IS_1)) >>> IS_2 = [ FF(a) for a in [Integer(0),Integer(0),Integer(1),Integer(0),Integer(0),Integer(0),Integer(1),Integer(0),Integer(1)] ] >>> e2 = LFSR((x**Integer(9) + x**Integer(3) + Integer(1),IS_2)) >>> E = ShrinkingGeneratorCryptosystem() >>> e = E((e1,e2)) >>> e Shrinking generator cipher on Free binary string monoid
FF = FiniteField(2) P.<x> = PolynomialRing(FF) LFSR = LFSRCryptosystem(FF) IS_1 = [ FF(a) for a in [0,1,0,1,0,0,0] ] e1 = LFSR((x^7 + x + 1,IS_1)) IS_2 = [ FF(a) for a in [0,0,1,0,0,0,1,0,1] ] e2 = LFSR((x^9 + x^3 + 1,IS_2)) E = ShrinkingGeneratorCryptosystem() e = E((e1,e2)) e
- decimating_cipher()[source]¶
The LFSR cipher generating the decimating key stream.
EXAMPLES:
sage: FF = FiniteField(2) sage: P.<x> = PolynomialRing(FF) sage: LFSR = LFSRCryptosystem(FF) sage: IS_1 = [ FF(a) for a in [0,1,0,1,0,0,0] ] sage: e1 = LFSR((x^7 + x + 1,IS_1)) sage: IS_2 = [ FF(a) for a in [0,0,1,0,0,0,1,0,1] ] sage: e2 = LFSR((x^9 + x^3 + 1,IS_2)) sage: E = ShrinkingGeneratorCryptosystem() sage: e = E((e1,e2)) sage: e.decimating_cipher() LFSR cipher on Free binary string monoid
>>> from sage.all import * >>> FF = FiniteField(Integer(2)) >>> P = PolynomialRing(FF, names=('x',)); (x,) = P._first_ngens(1) >>> LFSR = LFSRCryptosystem(FF) >>> IS_1 = [ FF(a) for a in [Integer(0),Integer(1),Integer(0),Integer(1),Integer(0),Integer(0),Integer(0)] ] >>> e1 = LFSR((x**Integer(7) + x + Integer(1),IS_1)) >>> IS_2 = [ FF(a) for a in [Integer(0),Integer(0),Integer(1),Integer(0),Integer(0),Integer(0),Integer(1),Integer(0),Integer(1)] ] >>> e2 = LFSR((x**Integer(9) + x**Integer(3) + Integer(1),IS_2)) >>> E = ShrinkingGeneratorCryptosystem() >>> e = E((e1,e2)) >>> e.decimating_cipher() LFSR cipher on Free binary string monoid
FF = FiniteField(2) P.<x> = PolynomialRing(FF) LFSR = LFSRCryptosystem(FF) IS_1 = [ FF(a) for a in [0,1,0,1,0,0,0] ] e1 = LFSR((x^7 + x + 1,IS_1)) IS_2 = [ FF(a) for a in [0,0,1,0,0,0,1,0,1] ] e2 = LFSR((x^9 + x^3 + 1,IS_2)) E = ShrinkingGeneratorCryptosystem() e = E((e1,e2)) e.decimating_cipher()
- keystream_cipher()[source]¶
The LFSR cipher generating the output key stream.
EXAMPLES:
sage: FF = FiniteField(2) sage: P.<x> = PolynomialRing(FF) sage: LFSR = LFSRCryptosystem(FF) sage: IS_1 = [ FF(a) for a in [0,1,0,1,0,0,0] ] sage: e1 = LFSR((x^7 + x + 1,IS_1)) sage: IS_2 = [ FF(a) for a in [0,0,1,0,0,0,1,0,1] ] sage: e2 = LFSR((x^9 + x^3 + 1,IS_2)) sage: E = ShrinkingGeneratorCryptosystem() sage: e = E((e1,e2)) sage: e.keystream_cipher() LFSR cipher on Free binary string monoid
>>> from sage.all import * >>> FF = FiniteField(Integer(2)) >>> P = PolynomialRing(FF, names=('x',)); (x,) = P._first_ngens(1) >>> LFSR = LFSRCryptosystem(FF) >>> IS_1 = [ FF(a) for a in [Integer(0),Integer(1),Integer(0),Integer(1),Integer(0),Integer(0),Integer(0)] ] >>> e1 = LFSR((x**Integer(7) + x + Integer(1),IS_1)) >>> IS_2 = [ FF(a) for a in [Integer(0),Integer(0),Integer(1),Integer(0),Integer(0),Integer(0),Integer(1),Integer(0),Integer(1)] ] >>> e2 = LFSR((x**Integer(9) + x**Integer(3) + Integer(1),IS_2)) >>> E = ShrinkingGeneratorCryptosystem() >>> e = E((e1,e2)) >>> e.keystream_cipher() LFSR cipher on Free binary string monoid
FF = FiniteField(2) P.<x> = PolynomialRing(FF) LFSR = LFSRCryptosystem(FF) IS_1 = [ FF(a) for a in [0,1,0,1,0,0,0] ] e1 = LFSR((x^7 + x + 1,IS_1)) IS_2 = [ FF(a) for a in [0,0,1,0,0,0,1,0,1] ] e2 = LFSR((x^9 + x^3 + 1,IS_2)) E = ShrinkingGeneratorCryptosystem() e = E((e1,e2)) e.keystream_cipher()