C-Programmierung: Aufgaben: Entwickeln Sie eine Funktion zur Simulierung einer Skytale

Aus Wikibooks

Aufgabenstellung[Bearbeiten]

Entwickeln 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[Bearbeiten]

Zur 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[Bearbeiten]

Damit 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;
}