Skip to content Skip to sidebar Skip to footer

Php Caesar Cipher

(jsfiddle example here: caesar cipher) I am making a Caesar cipher - it's an alphabetic shift, basically; a shift parameter of 3 is as follows: a => d, b => e, c => f, ...

Solution 1:

First,change

$string = "hello";

to

$string = $_POST['msg'];

and

$newstring = "hello";

to

$newstring = $string;

Then, read the value of shift parameter:

$sp = $_POST['sp']

Now, instead of doing

$ascii++;

increment its value by the value of shift parameter. if the value of $sp is 8, the final $ascii value would be $ascii + 8

Or you can do what "elclanrs" has suggested : $char = 'a'; ++$char; //=> "b". But instead of ++$char; do $char+=$sp;

While incrementing the value of $ascii, you must check for the bounds. May be use a loop and increment the value of $ascii by 1.

So Inside your for loop:

for ($i=0;$i<strlen($string);$i++) {...}

there will be another for loop and all the conditions for the bound would go inside it. Something like :

for ($i=0;$i<strlen($string);$i++) {

  $ascii = ord($string[$i]);
  for($j=0;$j<$sp;$j++){
    if($ascii == 90) { //uppercase bound
      $ascii = 65; //reset back to 'A' 
    } 
    elseif($ascii == 122) { //lowercase bound
      $ascii = 97; //reset back to 'a' 
    } 
    else {
      $ascii++;
    }
  }
  $newstring[$i] = chr($ascii);

}

(I'm not a PHP developer, so the syntax might be wrong.)

Solution 2:

This my solution (ceaser/ Vigenere cipher)

<?php/**
 * Class cryptSentence
 *
 * Permet de crypter et de déchiffrer un texte
 */classcryptSentence{
    /**
     * @var String $text
     *
     * Texte à crypter
     */protected$text;

    /**
     * @var string $privateKey
     *
     * Clef secrete pour crypter le texte
     * A NE JAMAIS DIVULGUER
     */protected$privateKey = "johnny";


    publicfunctioncipher($text)
    {
        $textNumber = $this->convertLetterToNumber($text);
        $textOffset = $this->offsetLetter($textNumber);
        $finalText = $this->convertNumberToLetter($textOffset);

        return$finalText;
    }

    publicfunctiondecipher($text)
    {
        $textNumber = $this->convertLetterToNumber($text);
        $textOffsetReverse = $this->offsetReverseLetter($textNumber);
        $finalText = $this->convertNumberToLetter($textOffsetReverse);

        return$finalText;
    }

    /**
     * Convertit une phrase en chiffre
     *
     * @param string $text Le texte à convertir
     * @return string $finalText
     */privatefunctionconvertLetterToNumber($text)
    {
        // Init$textToNumber = [];
        $patterns = [];
        $finalText = '';

        // Création de l'alphabet$alphabet = array_merge(range('a', 'z'));

        // Suppression des phrases lisibles//// Récupération des positions des phrases visibles$positionPhrases = $this->getPositionLisibleSentence($text);
        //// S'il y a des phrases lisiblesif ($positionPhrases[1][0] !== false) {
            //// Récupération des morceaux de phrases qui ne seront pas cryptésforeach ($positionPhrasesas$pos) {
                $patterns[] = substr($text, $pos[0] + 2, $pos[1] - $pos[0] - 2);
            }
            //// Remplacement des morceaux de phrases qui ne doivent pas être cryptésforeach ($patternsas$pattern) {
                $text = str_replace($pattern, '', $text);
            }
        }

        // Transformation du texte en tableau$textAsArray = str_split($text);

        // Transformation des caractères alphabétique par des caracteres numériquesforeach ($textAsArrayas$letter) {
            if (in_array($letter, $alphabet)) {
                $textToNumber[] = "%".array_search($letter, $alphabet, true)."%"; // Stockage de la clef
            } else {
                $textToNumber[] = (string)$letter; // Les caractères spéciaux sont stockés dans un tableau
            }
        }

        // Ajout des phrases lisibles//// S'il y a des phrases lisiblesif ($positionPhrases[1][0] !== false) {
            $findPattern = 0;
            $loopIndex = 0;
            foreach ($textToNumberas$key => $num) {
                if ($num === '#') {
                    $findPattern += 1;
                    if ($findPattern === 2) {
                        $textToNumber[$key] = "#".$patterns[$loopIndex];
                        $loopIndex += 1;
                    } elseif ($findPattern === 4) {
                        $findPattern = 0;
                    }
                }
            }
        }

        // Transformation du tableau en texteforeach ($textToNumberas$word) {
            $finalText .= $word;
        }


        return$finalText;
    }


    /**
     * Permet de récupérer le couples de positions des phrases visibles
     *
     * @param string $text Texte à crypter
     * @return array Tableau contenant les couples de positions des phrases lisibles
     */privatefunctiongetPositionLisibleSentence($text)
    {
        // Texte temporaire qui est modifié dans cette fonction$tempText = $text;

        // Pour passer au moins une fois dans la boucle au cas où le motif ## est en 1ere positiondo {
            $posLisibleSentence[] = stripos($tempText, '##'); // Stockage de la position du motif ##// Remplacement de toute la phrase jusqu'au motif inclut par un caractere arbitraire % afin de conserver// la postion des caracteres et supprimer le motif ##$tempText = substr_replace(
                $tempText,
                str_repeat('%', stripos($tempText, '##') + 2),
                0,
                stripos($tempText, '##') + 2
            );

        } while (stripos($tempText, '##'));

        // Association des positions 2 par 2 (début, fin)$position = $this->createPair($posLisibleSentence);

        return$position;
    }

    /**
     * Permet de créer des couples de valeurs
     *
     * @param array $array Tableau pour créer les couples
     * @return array Tableau contenant les couples
     */privatefunctioncreatePair($array)
    {
        $newArray = [];
        $posArray = 1;

        for ($i = 0; $i < count($array); $i++) {
            if ($i % 2 === 1) {
                $newArray[$posArray][] = $array[$i];
                $posArray += 1;
            } else {
                $newArray[$posArray][] = $array[$i];
            }
        }

        return$newArray;
    }

    /**
     * Décale la position d'un chiffre par rapport à la clef privé (sens ->)
     *
     * @param string $text Le texte convertit en nombre à crypter
     * @return string $text Texte crypté
     */privatefunctionoffsetLetter($text)
    {
        // Init$hashText = [];
        $keyToNumber = $this->convertLetterToNumber($this->privateKey);
        $finalText = '';

        // Conversion du texte en tableau$textAsArray = preg_split("/(%\d+%)/i", $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
        $keyToNumber = preg_split("/(%\d+%)/i", $keyToNumber, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

        // Récupération de la longueur de la clef$privateKeyLength = count($keyToNumber);

        // Position initial du curseur sur la clef privée$positionPrivateKey = 0;

        // Bouclage sur le tableau pour énuméré un à un les caractères de la phraseforeach ($textAsArrayas$number) {
            // Si c'est un nombre, on applique le code de vigenereif (preg_match("/(%\d+%)/i", $number)) {
                $n = explode("%", $number);
                $nKey = explode("%", $keyToNumber[$positionPrivateKey]);


                // Calcul$nFinal = (int)$n[1] + (int)$nKey[1];

                // Si dépassement de la lettre zif ($nFinal > 25) {
                    $nFinal = $nFinal - 25;
                }


                $hashText[] = "%".($nFinal)."%";
            } else { // Sinon on ne touche pas au caractère (majuscule, ponctuation, espace)$hashText[] = $number;
            }

            // Incrementation du curseur pour la position de la clef privée$positionPrivateKey += 1;
            // Si le curseur a dépassé le nombre de caractere de la clef privéif ($positionPrivateKey >= $privateKeyLength) {
                $positionPrivateKey = 0; // On repart de 0
            }
        }

        // Transformation du tableau en texteforeach ($hashTextas$word) {
            $finalText .= $word;
        }

        return$finalText;
    }

    /**
     * Décale la position d'un chiffre par rapport à la clef privé (sens <-)
     *
     * @param string $text Le texte convertit en nombre à crypter
     * @return string $text Texte crypté
     */privatefunctionoffsetReverseLetter($text)
    {
        // Init$hashText = [];
        $keyToNumber = $this->convertLetterToNumber($this->privateKey);
        $finalText = '';

        // Conversion du texte en tableau$textAsArray = preg_split("/(%\d+%)/i", $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
        $keyToNumber = preg_split("/(%\d+%)/i", $keyToNumber, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

        // Récupération de la longueur de la clef$privateKeyLength = count($keyToNumber);

        // Position initial du curseur sur la clef privée$positionPrivateKey = 0;

        // Bouclage sur le tableau pour énuméré un à un les caractères de la phraseforeach ($textAsArrayas$number) {
            // Si c'est un nombre, on applique le code de vigenereif (preg_match("/(%\d+%)/i", $number)) {
                $n = explode("%", $number);
                $nKey = explode("%", $keyToNumber[$positionPrivateKey]);


                // Calcul$nFinal = (int)$n[1] - (int)$nKey[1];

                // Si dépassement de la lettre zif ($nFinal < 0) {
                    $nFinal = $nFinal + 25;
                }


                $hashText[] = "%".($nFinal)."%";
            } else { // Sinon on ne touche pas au caractère (majuscule, ponctuation, espace)$hashText[] = $number;
            }

            // Incrementation du curseur pour la position de la clef privée$positionPrivateKey += 1;
            // Si le curseur a dépassé le nombre de caractere de la clef privéif ($positionPrivateKey >= $privateKeyLength) {
                $positionPrivateKey = 0; // On repart de 0
            }
        }

        // Transformation du tableau en texteforeach ($hashTextas$word) {
            $finalText .= $word;
        }

        return$finalText;
    }

    /**
     * Permet de convertir un texte avec des nombres en texte lisible
     *
     * @param string $text Le texte en nombre
     * @return string Le texte convertit
     */privatefunctionconvertNumberToLetter($text)
    {
        // Init$alphabet = array_merge(range('a', 'z'));
        $numberToText = [];
        $finalText = '';

        // Convertit le texte en tableau$textAsArray = preg_split("/(%\d+%)/i", $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

        // Bouclage sur chaque lettreforeach ($textAsArrayas$letter) {
            // Si c'est un nombre cryptéif (preg_match("/(%\d+%)/i", $letter)) {
                $n = explode("%", $letter); // Récupération que du nombre$numberToText[] = $alphabet[$n[1]]; // On repere sa place dans l'alphabet
            } else { // Sino c'est une lettre majuscule ou un signe de ponctuation ou un espace$numberToText[] = $letter;
            }
        }

        // Transformation du tableau en texteforeach ($numberToTextas$word) {
            $finalText .= $word;
        }

        return$finalText;
    }
}

Only lowercase (but keeps uppercase, ponctuations, spaces)

Post a Comment for "Php Caesar Cipher"