/home/algorithms/


Substitution Ciphers

Mono-alphabetic substitution

Allgemein werden bei Substitutionsalgorithmen "Substitution
Ciphers" die Zeichen im Klartext durch andere Zeichen
ersetzt (substituiert). 

Bei der monoalphabetischen Chiffrierung wird jedes Zeichen
genau auf ein anderes Zeichen abgebildet.

Shift Cipher - Ceasar Ciphers

"Verschiebechiffren", sog. shift ciphers wurden schon von
Julius Caesar (100 bis 44 v. Chr.) benutzt um Nachrichten
zu verschlüsseln.

Es ist die einfachste Art der Verschlüsselung und  wird
meinst als eine alphabetische Verschlüsselung  (modulo 26)
implementiert.

Dabei wird das Alphabet von 0 bis 25 nummeriert (A = 0) und
die erhaltenen Werte werden um einen bestimmten Wert erhöht.
Dieser Wert k wird zur Entschlüsselung wieder abgezogen.

Beispiel mit k = 1:

X       = HALLO WELT
e(X)    = IBMMP XFMU
e(e(X)) = JCNNQ YGNV

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

Funktion:
e(x) = x + k (modulo 26)

e(x):  Der Geheimtext (cipher text)
x:     Der Klartext (plaintext)
k:     Der Schlüssel, {1..26}

Sonderfälle:
- Beim berühmten Cäsar-Chiffre benutzte Julius Cäsar k = 3.

- ROT13, eine Verschlüsselung die oft im Usenet benutzt wird,
  benutzt, wie der Name schon sagt, einen Wert für k von 13.
  Der Vorteil daran ist, dass für die Entschlüsselung einfach
  ein weiteres mal verschlüsselt werden muss (natürlich mod26).

Krypanalyse:
Die Kryptanalyse von Shift Ciphers ist, aufgrund des sehr kleinen
Schlüsselraumes, sehr einfach:
Entweder es werden einfach die 26 bzw. 256 möglichen Schlüssel
durchprobiert bis ein lesbarer Text entsteht oder es wird eine
Häufigkeitsanlyse durchgeführt.

Implementation:

Eine mögliche Implementation in C:

--[cut here]------------------
char *str_rot(char *s, int k)
{
  unsigned int len = strlen(s);
  unsigned char base = 0;
  for(unsigned int i = 0; i < len; i++) {
    if (isupper(s[i]))
      base = 'A';
    else if (islower(s[i]))
      base = 'a';
    else
    {
      continue;
    }
    s[i] -= base;
    s[i] = char((s[i] + k) % 26 + base);
  }
  return s;
}
--[and here]------------------


Eine Implementation eines ASCII Shift-Cipher (molulo 256):

--[cut here]------------------
unsigned char *bin_rot(unsigned char *s, int k)
{
  unsigned int len = strlen(s);
  int y = 0;
  for(unsigned int i = 0; i < len; i++) {
    y = s[i] + k;
    while(y < 0) {y += 256;}
    while(y > 255) {y -= 256;}
    s[i] = y;
  }
  return s;
}
--[and here]------------------