C-Programmierung: Aufgaben: Entwickeln Sie eine Funktion zur Simulierung einer Skytale
Aufgabenstellung
BearbeitenEntwickeln Sie eine Funktion zur Simulierung einer Skytale. Eine Erklärung, was eine Skytale ist, gibt es hier: http://www.mathe.tu-freiberg.de/~hebisch/cafe/kryptographie/skytale.html.
Zunächst wird der Schlüssel gewählt, was der Wahl der Dicke des Stabes der Skytale entspricht.
- n=3
- DIESER KLARTEXT IST JETZT ZU VERSCHLUESSELN
Schritt 1
BearbeitenZur Verschlüsselung wird der Text in Blöcke der Länge n eingeteilt, die zeilenweise geschrieben werden:
0 | 1 | 2 |
---|---|---|
D | I | E |
S | E | R |
K | L | A |
R | T | E |
X | T | I |
S | T | J |
E | T | Z |
T | Z | U |
V | E | R |
S | C | H |
L | U | E |
S | S | E |
L | N | S |
Schritt 2
BearbeitenDamit ergibt sich aus:
- DSKRXSETVSLSL => Spalte 0
- IELTTTTZECUSN => Spalte 1
- ERAEIJZURHEE => Spalte 2
Der Geheimtext: DSKRXSETVSLSLIELTTTTZECUSNERAEIJZURHEE
Zum Entschlüsseln des Geheimtextes ist dieser nur in n Spalten der richtigen Länge einzutragen und zeilenweise zu lesen. Diese richtige Länge erhält man dabei durch eine Division mit Rest.
Musterlösung
Bearbeiten// SK
Online-Compiler ideone
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
char *verschluesseln(char *s, int n);
char *entschluesseln(char *s, int n);
int main()
{
#define STR "DIESERKLARTEXTISTJETZTZUVERSCHLUESSELN"
char str[] = STR;
char *ver;
char *ent;
printf("unverschluesselt: %s\n", str);
ver = verschluesseln(str, 3);
printf("verschluesselt: %s\n", ver);
ent = entschluesseln(ver, 3);
printf("entschluesselt: %s\n", ent);
assert(strcmp(ent, STR) == 0);
return 0;
}
char *verschluesseln(char *s, int n)
{
int i, x = strlen(s) / n + ((strlen(s) % n) > 0);
char *b = malloc(strlen(s));
for (i = 0; s[i] != '\0'; i++)
{
b[x*(i%n) + i / n] = s[i];
}
for (i = 0; s[i] != '\0'; i++)
{
s[i] = b[i];
}
free(b);
return s;
}
char *entschluesseln(char *s, int n)
{
int i, x = strlen(s) / n + ((strlen(s) % n) > 0);
char *b = malloc(strlen(s));
for (i = 0; s[i] != '\0'; i++)
{
b[i] = s[x*(i%n) + i / n];
}
for (i = 0; s[i] != '\0'; i++)
{
s[i] = b[i];
}
free(b);
return s;
}