Transposition CiphersTranspisitionsalgorithmen 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]------------------
|
Copyright © 1997-2004 Oliver Gobin -
Version 2.0 vom 12.2002 -
Haftungsausschluss -
Impressum
Kommentare, Änregungen und Feedback zur Website oder zu den Texten und
Quellcodes bitte an: og@ogobin.org oder direkt
ins Gästebuch.
Diese Seite ist XHTML 1.0
und CSS konform.
This page was rendered in 0.017086 seconds