/home/algorithms/


Transposition Ciphers

Transpisitionsalgorithmen ersetzen im Gegensatz zu den 
Substitution-Ciphers keine Buchstaben, sondern vertauchen
die Positionen innerhalb des Klartextes.

Skytale von Sparta (Matrix-Verschlüsselung)

Eine extrem alte Verschlüsselungsmethode wurde von der 
Regierung von Sparta vor 2500 Jahren benutzt, um 
militärisch relevante Informationen unlesbar zu machen.

Um die Daten zu ver- und zu entschlüsseln mussten Sender
und Empfänger sog. Skytalen besitzen.

Eine Skytale ist ein Zylinder mit einem bestimmten Radius.
Der Radius ist sozusagen der Schlüssel, der bei der Ver- 
und Entschlüsselung gleich sein muss.

Es wurde nun auf dem Zylinder ein schmales Pergamentband
spiralförmig gerollt und nach dem Rollen beschrieben 
(normal von rechts nach links), dann konnte das 
beschriebene Band zum Empfänger gebracht werden ohne 
leserlich zu sein.

Der Empfänger musste einfach einen Zylinder mit gleichen
Radius besitzen und konnte das Band wieder aufrollen und
dann die Botschaft lesen.

Moderner betrachtet ergibt das folgende Methode:

Als Radius des Zylinders nehmen wir eine Matrix mit n-Zeilen,
die Anzahl der Spalten ist variabel und ergibt sich aus der 
Länge der Botschaft.
Nehmen wir an eine der Skytalen besitzt einen Radius von 5 
Buchstaben:

Der Klartext wird nun Zeilenweise gelesen, während der Geheim-
Text Spaltenweise gelesen wird.

Klartext:   HALLO WELT DAS IST SCHÖN!
Geheimtext: H  ICAWDSHLEATÖLLS NOT S!

Matrix (Skytale):

n1: HALLO
n2:  WELT
n3:  DAS 
n4: IST S
n5: CHÖN!

Implementation:

Eine mögliche Implementation in C:

--[cut here]------------------
/*
  only a single line is supported. Line breaks
  will cause errors during en-decryption.
*/

char *str_matrix(char* s, int x, int code)
// s: Plaintext
// x: Key (colums)
// code: (1): encode, (0): decode
{
  // <definitions> //
  unsigned int len = strlen(s) - 1;
  char matrix[100][100]; // max chars: 100*100
                         // enlarge the matrix
                         // for more characters
  int n = 0;             // counter
  // </definitions> //
  
  // <encode, decode?> //
  // for encryption: x=colums, y=rows
  // for decryption: x=rows, y=colums
  int y = x;
  if(code == 1) {
    y = len / x;
    while ((x*y) < len) y++;
  }
  else {
    x = len / y;
    while ((x*y) < len) x++;
  }
  // </encode, decode?> //
  

  // <matrix> //
  for(int i = 0; i < x; i++) {
    for(int a = 0; a < y; a++) {
      if(char(s[n]) != 10) {
        if(n > len) matrix[i][a] = 32;
        else matrix[i][a] = char(s[n]); // fill the matrix
      }
      n++;
    }
  }
  // </matrix> //
  
  n = 0;

  // <transposition> //
  for(int i = 0; i < y; i++) {
    for(int a = 0; a < x; a++) {
      if(char(matrix[a][i]) != 10)
        s[n] = char(matrix[a][i]);
      n++;
    }
  }
  // </transposition> //

  return s;
}
--[and here]------------------