/home/algorithms/


Substitution Ciphers

Mono-alphabetic substitution

Affine Cipher

Affine Cipher sind eine erweiterte Form der Shift-Chiphers. Der 
einfache Algorithmus der Shift-Chiphers (e(x) = x + k) wurde
durch eine weitere Variable ergänzt. Zur Entschlüsselung muss 
daher zusätzlich zu k noch b bekannt sein:

Es handelt sich allerdings immer noch um einen Monoalphabetischen
Algorithmus, die Buchstaben werden immer 1:1 abgebildet, daher kann
man bekannte Wörter erahnen und leicht mit Entropie-Analyse, Brute-
Force oder allen anderen Methoden die Verschlüsselung brechen.

Funktion:

e(x) = bx + k (modulo 26)

k sollte eine natürliche Zahl zwischen 1 und 25 sein.
b sollte auch eine natürliche Zahl zwischen 1 und 25 sein, sollte aber
zusätzlich noch zu 26 relativ prim sein, dass bedeutet dass 26 und b
außer 1 keine gemeinsamen Teiler haben: Folgende Zahlen entsprechen den
Anforderungen für b: 1, 3, 5, 7, 9, 11, 15, 17, 19, 21, 23, 25.

Sonderfälle:

Mit b = 1 erhalten wir folgende Funktion e(x) = x + k, was dem Shift-
Chipher entspricht.

Beispiel mit k = 1 und b = 5 (mit ASCII Zeichensatz)

X       = HALLO WELT
e(X)    = KBEET HVES
e(e(X)) = ZGVVS KCVN

X       : 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
e(X)    : B G L Q V A F K P U Z E J O T Y D I N S X C H M R W
e(e(X)) : G F E D C B A Z Y X W V U T S R Q P O N M L K J I H

Kryptanalyse:

Der Schlüsselraum von Affine Chiffren ist etwas größer als der von
Shift Chiffren, jedoch nicht bedeutend größer (26*12 im Gegensatz zu 26), daher lassen sich prinzipiell die gleichen Attacken erfolgreich
gegen diese Art von Chiffren einsetzen, wobei man ohne Rechner eine Haufigkeitsanalyse der Bruteforce Attacke vorziehen wird.
Implementation: Eine mögliche Implementation in C: --[cut here]------------------ char affine_en(int c, int shift_value, int multiplier, int base)
{
c -= base;
c = ((shift_value * c) + multiplier) % 26;
c += base;
return char(c);
} char affine_de(int c, int shift_value, int multiplier, int base)
{
int i, inverse; c -= base; for (i = 1; i < 26; i += 2) { if ((shift_value * i) % 26 == 1) { inverse = i; break; } } if (c < multiplier) { c += 26; } c = ((inverse * (c - multiplier)) % 26); c += base; return char(c); } --[end here]------------------