Modul 5 oppgave 5
parent
e91e508e6b
commit
83ea06327d
|
@ -12,43 +12,80 @@
|
||||||
<h2>Kryptering</h2>
|
<h2>Kryptering</h2>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
$input = $_POST['input'] ?? 'standard påstand';
|
// Stringer med 'filler'-tegn og gyldige tegn den skal forskyve på:
|
||||||
$output = $_POST['output'] ?? '';
|
$randoms = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
|
||||||
|
$tegnString = "0123456789abcdefghijklmnopqrstuvwxyzæøåABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ -&.";
|
||||||
|
|
||||||
$randoms = "!#%&/()=?+*-:;";
|
// $tegnMatrise holder alle tegnene fra tegnString. $tegnTegn holder samme innhold, men med nøkkel og tegn flippet (kjappere å søke gjennom)
|
||||||
$asciiKoder = array(); // liste med 'godkjente' ascii koder som de kan rotere på.
|
$tegnMatrise = preg_split('//u', $tegnString, null, PREG_SPLIT_NO_EMPTY);
|
||||||
|
$tegnTegn = array_flip($tegnMatrise);
|
||||||
|
|
||||||
function krypter($input): String {
|
function krypter($input): String {
|
||||||
// Array med alle tegn i den insatte strengen.
|
global $tegnMatrise, $tegnTegn, $randoms;
|
||||||
|
|
||||||
|
// Matrise med alle tegn i den insatte strengen.
|
||||||
$karakterer = preg_split('//u', $input, null, PREG_SPLIT_NO_EMPTY);
|
$karakterer = preg_split('//u', $input, null, PREG_SPLIT_NO_EMPTY);
|
||||||
|
|
||||||
// Flytte på alle karakterene med 2/3-deler.
|
// Flytte på alle karakterene med 2/3-deler.
|
||||||
$karakterer = arrayMove($karakterer, 2/3);
|
$karakterer = arrayMove($karakterer, 2/3);
|
||||||
|
|
||||||
// gjøre hvert tegn om til ascii-tall med mb_ord
|
// forskyve hvert tegn basert på $tegnMatrise
|
||||||
// forskyve tallene til +30 per $asciiKoder
|
|
||||||
// sette inn tilfeldige random-tegn annenhvert tegn
|
|
||||||
|
|
||||||
foreach ($karakterer as &$tegn){
|
foreach ($karakterer as &$tegn){
|
||||||
// echo $tegn.": ".mb_ord($tegn)."<br>\n";
|
if(isset($tegnTegn[$tegn])){
|
||||||
$tegn = mb_ord($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);
|
unset($tegn);
|
||||||
|
|
||||||
return implode($karakterer);
|
// 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 {
|
function dekrypter($input): string {
|
||||||
// Array med alle tegn i den insatte strengen.
|
global $tegnMatrise, $tegnTegn;
|
||||||
|
|
||||||
|
// Matrise med alle karakterene til den gitte strengen.
|
||||||
$karakterer = preg_split('//u', $input, null, PREG_SPLIT_NO_EMPTY);
|
$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);
|
$karakterer = arrayMove($karakterer, 1/3);
|
||||||
|
|
||||||
return $input;
|
// 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rotere nøklene på en array med en satt forskyvning.
|
|
||||||
|
// Funksjon for å rotere nøklene på en array med en satt forskyvning.
|
||||||
function arrayMove($array, $forskyvning = 2/3): array {
|
function arrayMove($array, $forskyvning = 2/3): array {
|
||||||
$len = count($array);
|
$len = count($array);
|
||||||
$start = round($len*$forskyvning);
|
$start = round($len*$forskyvning);
|
||||||
|
@ -63,13 +100,29 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Ksort sorterer så nøklene setter seg på sin nå riktige plass.
|
||||||
ksort($ut);
|
ksort($ut);
|
||||||
|
|
||||||
return $ut;
|
return $ut;
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "<p>Ukryptert: <textarea>".$input."</textarea></p>";
|
// Inputs. Hvis det er et utkryptert input, krypter det og motsatt. Gitt en standardfrase hvis ingen av POST-parametrene er mottatt.
|
||||||
echo "<p>Kryptert: <textarea>".krypter($input)."</textarea></p>";
|
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>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue