Guten Tag zusammen,
ich konnte mit Hilfe eurer Tipps und Empfehlungen die Verschlüsselung nun erweitern. Neben Kleinbuchstaben können nun auch Großbuchstaben und 26 Sonderzeichen (inklusive Zahlen) verschlüsselt werden.
Während der Implementierung der weiteren Zeichen stand ich vor kleineren Herausforderungen zu denen ich bisher noch keine optimale Lösung, sondern eher eine Übergangslösung gefunden habe.
Beim Erstellen des Sonderzeichen-Arrays musste ich 3 Elemente löschen. Nun ist zwischen de Arrayelementen, vor und nach den drei gelöschten Elementen, der Array-Key um den Wert drei unterschiedlich. Also:
array(
.....
22 => "#",
25 => ",",
....
)
Ich brauche das Array jedoch mit fortlaufenden Keys ohne eine Lücke.
Meine Frage dazu ist: Wie kann ich nach dem Löschen von Array Keys die dahinterliegenden Array Keys durch die gelöschten Array Keys ersetzen, damit keine Lücke entsteht?
Dazu habe ich noch keine Lösung gefunden.
Bei meinem Lösungsweg habe ich aus dem Array eine Zeichenkette erstellt und dann diese nochmal am Seperator gesplittet damit die Array Keys nun fortlaufend ohne Lücke sind. Nun ist es so, dass ich die Array Keys von 1-26 und nicht von 0-25 brauche. Nun stand ich vor dem Problem, wie ich die Array Keys um eins hochzählen kann. Da fand ich nur einen Umweg über eine for-Schleife in der ich das Array nochmal komplett neu erstellt habe.
Meine Frage dazu ist: Gibt es eine Funktion mit der ich alle Array Keys um 1 hochzählen kann?
Nun möchte ich auch nochmal den Code mit euch teilen:
<?php
session_start();
require "Caeser.php";
$caeser = new Caeser();
$cipherText;
$plainText;
$error = null;
if(isset($_POST["verschluesseln"])){
if(!empty($_POST["plainText"])){
$cipherText = $caeser->encrypt(trim($_POST["plainText"]));
$_SESSION["cipherText"] = $cipherText;
}else{
$error = "Bitte geben Sie den zu verschlüsselnden Text ein!";
}
}
if(isset($_POST["entschluesseln"]) && isset($_SESSION["cipherText"])){
$plainText = $caeser->decrypt($_SESSION["cipherText"]);
}
$cipherOutput = !empty($cipherText) ? "Der verschlüsselte Text lautet: <strong>" . $cipherText . "</strong>" : null;
$decryptedOutput = !empty($plainText) ? "Der entschlüsselte Text lautet: <strong>" . $plainText . "</strong>" : null;
?>
<!DOCTYPE html>
<html lang="de" dir="ltr">
<head>
<meta charset="utf-8">
<title>Cäser Verschlüsselung</title>
<style>
form{
margin-bottom: 1em;
}
textarea{
display: block;
}
</style>
</head>
<body>
<h1>Cäser Verschlüsselung</h1>
<form class="" method="post">
<label for="plainText">Gebe hier deinen Klartext ein:</label>
<textarea name="plainText" id="plainText" rows="10" cols="35"></textarea>
<input type="submit" name="verschluesseln" value="Klartext verschlüsseln">
<input type="submit" name="entschluesseln" value="Generierten Ciphertext entschlüsseln">
</form>
<?= $cipherOutput ?? $decryptedOutput; ?>
<?= $error; ?>
</body>
</html>
Alles anzeigen
<?php
/*
Caeser Verschlüsselung (Ersetzungschiffre)
Jeder Buchstabe wird durch einen anderen Buchstaben ersetzt
Was brauchen wir dafür?
1. Schlüsselraum das Alphabets: 26
2. Key, um wie viel Stellen die Buchstaben verschoben werden sollen (k)
3. Position des jeweiligen Buchstabens im Alphabet (p)
Verschlüsseln = p + k mod 26
Entschlüsseln = p - k mod 26
Verschlüsselt & Entschlüsselt:
- Groß- und Kleinbuchstaben
- Zahlen
- Folgende Zeichen:
# $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : = ?
*/
class Caeser{
private $keyRoom = 26;
private $key = 3;
private $letterPosition;
private $lowercaseAlphabet = [];
private $uppercaseAplhapet = [];
private $moreChars = [];
private $cipherText = "";
private $decryptedText = "";
public function __construct(){
$this->generateAlphabetWithLowercaseLetters();
$this->generateAlphabetWithUppercaseLetters();
$this->generateMoreExtraChars();
}
protected function generateAlphabetWithLowercaseLetters(){
for($i = 1, $char = "a"; $i <= $this->keyRoom; $i++){
$this->lowercaseAlphabet[$char] = $i;
$char++;
}
}
protected function generateAlphabetWithUppercaseLetters(){
for($i = 1, $char = "A"; $i <= $this->keyRoom; $i++){
$this->uppercaseAplhapet[$char] = $i;
$char++;
}
}
protected function generateMoreExtraChars(){
$chars = array_diff(range("#","?"), array("<", ">", ";"));
$chars = implode("|", $chars);
$chars = explode("|", $chars);
for($i = 1; $i <= 26; $i++){
$this->moreChars[$chars[$i - 1]] = $i;
}
}
public function encrypt($plainText){
if(isset($plainText)){
$lettersArray = str_split($plainText);
foreach ($lettersArray as $letter) {
$letterTyp = null;
$i = 0;
if(array_key_exists($letter, $this->moreChars)){
$alphabet = $this->moreChars;
}else{
$alphabet = ctype_upper($letter) ? $this->uppercaseAplhapet : $this->lowercaseAlphabet;
}
if(array_key_exists($letter, $alphabet)){
$newPosition = ($alphabet[$letter] + $this->key) % $this->keyRoom;
if($newPosition === 0){
$newPosition = 26;
}
}else{
$newPosition = 0;
$letterTyp = $letter;
}
foreach ($alphabet as $cipherKey => $value) {
if($value === $newPosition){
$this->cipherText .= $cipherKey;
}else{
if($i < 1){
$this->cipherText .= $letterTyp;
$i++;
}
}
}
}
return $this->cipherText;
}
}
public function decrypt($cipherText){
if($cipherText){
$lettersArray = str_split($cipherText);
foreach ($lettersArray as $letter) {
$letterTyp = null;
$i = 0;
if(array_key_exists($letter, $this->moreChars)){
$alphabet = $this->moreChars;
}else{
$alphabet = ctype_upper($letter) ? $this->uppercaseAplhapet : $this->lowercaseAlphabet;
}
if(array_key_exists($letter, $alphabet)){
if(($alphabet[$letter] - $this->key) < 0){
$result = $alphabet[$letter] - $this->key;
$result += $this->keyRoom;
$oldPosition = $result % $this->keyRoom;
if($oldPosition == 0){
$oldPosition = 26;
}
}else{
$oldPosition = ($alphabet[$letter] - $this->key) % $this->keyRoom;
}
}else{
$oldPosition = 0;
$letterTyp = $letter;
}
foreach ($alphabet as $plainKey => $value) {
if($value === $oldPosition){
$this->decryptedText .= $plainKey;
}else{
if($i < 1){
$this->decryptedText .= $letterTyp;
$i++;
}
}
}
}
return $this->decryptedText;
}
}
}
Alles anzeigen
Schöne Grüße,
Stef