###fuehren sie ein mitm attack durch um c3 zu entschluesseln. verwenden sie ###dazu die plaintext cyphertext paare (m1,c1) und (m2,c2), die ver und ###entschluesselfunktionen E,D und die funktion mak_key zum erzeugen der ###moeglichen schluessel A := [ 'A', 'B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', ',' , '.','!','?', ' ']; NumbersToText := function(L,alphabet) return(Apply(L, i-> alphabet[i+1])); end; TextToNumbers := function(text,alphabet) return(Apply(List(text), i-> (Position(alphabet,i)-1))); end; AffinLinear := function(M, key,alphabet) return(NumbersToText( List( Apply(List(key[1]*M + key[2]), i-> Element(Integers(),i) mod Length(alphabet)) ), alphabet)); end; ###das ist die funktion die ihr zum verschluesseln verwenden sollt E := function(key, M) local l,n,alphabet; alphabet := A; n := Length(List(key[2])); l := ListSplit(M,n); l := Apply(l, i-> Append(i, Apply([Length(i)+1..n], j-> alphabet[1]))); l := Apply(l, i-> AffinLinear(Transpose(Matrix(Z,1,n,TextToNumbers(i,alphabet))), key, alphabet)); return(Concatenation(l)); end; ### das ist die funktion fuers entschluesseln D := function(key, C) local l,n,k,M,b,alphabet; alphabet := A; n := Length(List(key[2])); l := ListSplit(C,n); k := FiniteField(31,1); M := Matrix(k, n,n, Apply(List(key[1]), i-> Element(k,i))); b := Apply(List(key[2]), i-> Element(k,i)); l := Apply(l, i-> AffinLinear(Transpose(Matrix(k,1,n,TextToNumbers(i,alphabet))), [M^(-1),Transpose(Matrix(k,1,n,-b))] , alphabet)); return(Concatenation(l)); end; ###das ist die funktion die die moeglichen schluessel erzeugt. man steckt ###eine zahl zwischen 1 und 4000 rein und bekommt ein schluessl zurueck make_key := function(num) local k,r; r := 20; k := IntegerToSequence(num + 6000,r); k := Append(Apply([1..3-Length(k)], i -> 0), k); return [Identity(MatrixAlgebra(Z,Length(k))), Transpose(Matrix(Z, 1,Length(k), k))]; end; ### das sind die ver und entschluesselten nachrichten m1 := "BEIM ENTSCHLUESSELN DIESES TEXTES"; c1 := "TP,QP?TVRPL.HPFWUFTBCVIDW?RXURZGRKDB"; m2 := "HABEN SIE HOFFENTLICH DIE VIELEN"; c2 := "ZLTI?YYKDML XQWREFOEGMHYWKIMUFKP KDB"; c3 := "IZEXUCRG?DS?RVSWXYQGM,I?YP?ICHZC KDB";