is115-php/modul5/index5_5.php

131 lines
4.4 KiB
PHP

<?php include '../common.php'; ?><!DOCTYPE html>
<html lang="no">
<head>
<title><?=title();?></title>
<link rel="stylesheet" href="../index.css">
</head>
<body>
<div class="container">
<h1><?=title();?></h1>
<h4><?=getNavigation();?></h4>
<h2>Kryptering</h2>
<?php
// Stringer med 'filler'-tegn og gyldige tegn den skal forskyve på:
$randoms = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$tegnString = "0123456789abcdefghijklmnopqrstuvwxyzæøåABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ -&.";
// $tegnMatrise holder alle tegnene fra tegnString. $tegnTegn holder samme innhold, men med nøkkel og tegn flippet (kjappere å søke gjennom)
$tegnMatrise = preg_split('//u', $tegnString, null, PREG_SPLIT_NO_EMPTY);
$tegnTegn = array_flip($tegnMatrise);
function krypter($input): String {
global $tegnMatrise, $tegnTegn, $randoms;
// Matrise med alle tegn i den insatte strengen.
$karakterer = preg_split('//u', $input, null, PREG_SPLIT_NO_EMPTY);
// Flytte på alle karakterene med 2/3-deler.
$karakterer = arrayMove($karakterer, 2/3);
// forskyve hvert tegn basert på $tegnMatrise
foreach ($karakterer as &$tegn){
if(isset($tegnTegn[$tegn])){
// gå x-antall trinn opp i matrisen. Start på begynnelsen hvis den går over enden av matrisen.
$tegnNkl = $tegnTegn[$tegn]+10;
if($tegnNkl >= count($tegnMatrise)){
$tegnNkl -= count($tegnMatrise);
}
// Oppdater matrisen med det nye tegnet.
$tegn = $tegnMatrise[$tegnNkl];
}
}
unset($tegn);
// Sette inn tilfeldige tegn fra $randoms, annenhvert tegn
$output = "";
foreach ($karakterer as $kar){
$output .= $kar.$randoms[ rand(0,strlen($randoms)-1) ];
}
return $output;
}
function dekrypter($input): string {
global $tegnMatrise, $tegnTegn;
// Matrise med alle karakterene til den gitte strengen.
$karakterer = preg_split('//u', $input, null, PREG_SPLIT_NO_EMPTY);
// Fjern hvert andre tegn, da de er 'fillers'. (De bare fyller opp så stringen blir lengre)
foreach ($karakterer as $k => $v){
if($k % 2 !== 0){
unset($karakterer[$k]);
}
}
// Flytt karakterene tilbake til dems opprinnelige posisjon
$karakterer = arrayMove($karakterer, 1/3);
// Justere tegnene tilbake med x-antall tegn. Se krypter() for flere kommentarer.
foreach ($karakterer as &$tegn){
if(isset($tegnTegn[$tegn])){
$tegnNkl = $tegnTegn[$tegn]-10;
if($tegnNkl < 0){
$tegnNkl += count($tegnMatrise);
}
$tegn = $tegnMatrise[$tegnNkl];
}
}
// Slå sammen $karakterer til en string igjen. Dette er stringen dekryptert.
return implode($karakterer);
}
// Funksjon for å rotere nøklene på en array med en satt forskyvning.
function arrayMove($array, $forskyvning = 2/3): array {
$len = count($array);
$start = round($len*$forskyvning);
$ut = array();
foreach ($array as $value){
$ut[$start] = $value;
$start++;
if($start>=$len){
$start = 0;
}
}
// Ksort sorterer så nøklene setter seg på sin nå riktige plass.
ksort($ut);
return $ut;
}
// Inputs. Hvis det er et utkryptert input, krypter det og motsatt. Gitt en standardfrase hvis ingen av POST-parametrene er mottatt.
if(isset($_POST['krypter'])){
$ukryptert = $_POST['krypter'];
$kryptert = krypter($ukryptert);
}
elseif(isset($_POST['dekrypter'])){
$kryptert = $_POST['dekrypter'];
$ukryptert = dekrypter($kryptert);
}
else {
$ukryptert = 'En konduktør sliter når hanen galer.';
$kryptert = krypter($ukryptert);
}
echo "<form method='post'><p><textarea style='height: 100px; width: 400px;' name='krypter'>".$ukryptert."</textarea><br><input type='submit' value='Krypter...'></p></form>";
echo "<form method='post'><p><input type='submit' value='Dekrypter...'><br><textarea style='height: 100px; width: 400px;' name='dekrypter'>".$kryptert."</textarea></p></form>";
?>
</div>
</body>
</html>