Avatar billede gertnissen Nybegynder
04. marts 2006 - 18:04 Der er 7 kommentarer og
1 løsning

crypt og decrypt med kendt nøgle

Er det muligt at lave en simpel crypt / decrypt funktion (standard php4 kode) der anvender en kendt nøgle (dvs kun kendt af både afsender og modtager).

Det behøver ikke at være super sikkert eller umuligt at bryde - men meget gerne simpelt uden include af ekstra classer og lign.

ala
$text="eksperten";
$key="den kender vi begge";
$crypt=crypt($text,$key);

$decrypt=decrypt($crypt,$key);
Så skulle $decrypt gerne indeholde "eksperten".
Avatar billede fixxxer Nybegynder
04. marts 2006 - 18:07 #1
Prøv at kigge på http://dk.php.net/mcrypt

Som du kan se kræver det et library i din PHP installation, og hvis du ikke har det, kan du ikke bruge det.
Avatar billede gertnissen Nybegynder
04. marts 2006 - 18:08 #2
og ikke mcrypt
Avatar billede fixxxer Nybegynder
04. marts 2006 - 18:20 #3
Ok.. Nogen gange er det måske bare nemmere at google?

http://www.google.dk/search?hl=da&q=php+encrypt+decrypt&btnG=S%C3%B8g&meta=
Avatar billede gertnissen Nybegynder
04. marts 2006 - 19:50 #4
Det har du ret i, men efter en dag på Google havde jeg stadig ikke fundet et sindsygt simpelt eksempel. http://www.google.dk/search?hl=da&q=php+encrypt+decrypt+-class+-mcrypt+script+tutorial&btnG=S%C3%B8g&meta=

Men 30 min pause med at spise aftensmad gav en meget simpel ide.
<?PHP
    function encrypt($text,$key)
    {
        $text2="";$key=str_shuffle($key);
        for ($i=0;$i<=strlen($text);$i++)
        {
            $text2.=substr($text,$i,1).substr($key,$i,1);
        }
        return base64_encode($text2);
    }

    function decrypt($text)
    {
        $text3="";
        $text2=base64_decode($text);
        for ($i=0;$i<=strlen($text2)-2;$i++)
        {
            $text3.=substr($text2,$i,1);
            $i++;
        }
        return $text3;
    }

    $encrypted = encrypt('test data','ekspertenxxxx'); //encrypts the data using the key
    echo $encrypted.'<hr>';

    $decrypted = decrypt($encrypted); //decrypts the data using the key
    echo $decrypted;
?>

Hvor output er
dGVla3NzdHAgZWRyYXR0ZWFueA==
test data

Dvs. faktisk vil den "krypterede" streng være forskellig fra gang til gang, og output det samme. Der er ikke den store sikkerhed (ingen), men umiddelbart kunne det godt give det rigtige indtryk (for lægmand). Scriptet indeholder flere "fejl", f.eks. bliver nøglen ikke brugt i "dekrypteringen".

Input til simple forbedringer modtages meget gerne, f.eks. med anvendelse af nøgle i "dekrypteringen".
Avatar billede gertnissen Nybegynder
04. marts 2006 - 20:04 #5
Hmm, jeg havde overset denne side som jeg faldt over i anden omgang
http://www.weberdev.com/get_example-4118.html
Den tror jeg at jeg vil benytte selv om det ikke indeholder en fælles nøgle.

Faktisk fandt jeg tidligere denne side, men jeg forstår desværre ikke helt hvad der sker i koden. http://www.phpbuilder.com/board/showthread.php?t=10317050
Avatar billede coderdk Praktikant
04. marts 2006 - 20:08 #6
Her er en jeg synes mere om:

<?php

    function doCrypt( $text, $key )
    {
        $nk = strlen( $key );
        $nt = strlen( $text );
        $c = 0;
        $tmp = '';
        for ( $i = 0; $i < $nt; $i++ )
        {
            $tmp .= $text[$i] ^ $key[$c];
            $c++;
            $c %= $nk;
        }
        return $tmp;
    }
   
    function enCrypt( $text, $key )
    {
        return base64_encode( doCrypt( $text, $key ) );
    }

    function deCrypt( $text, $key )
    {
        return doCrypt( base64_decode( $text ), $key );
    }

    echo enCrypt( 'coderdk er underlig', 'coderdk' ) . "<br><br>";
    echo deCrypt( 'AAAAAAAAAEMKFkUHCg8GHQgMFQ==', 'coderdk' );

?>
Avatar billede gertnissen Nybegynder
04. marts 2006 - 22:33 #7
Stærkt coder, det virker jo perfekt. Kort og simpelt, og du løser også et andet problem i min kode med $c %= $nk; så du automatisk starter forfra på $key[$c]; når du når til slutningen.

Tak for hjælpen, smider du et svar ?
- gerne med lidt yderligere forklaring til ^ (XOR)
Avatar billede coderdk Praktikant
04. marts 2006 - 22:44 #8
Ok :) XOR er ganske simpelt - 10101 XOR 11100 = 01001 og 01001 XOR 11100 = 10101
Du får med andre ord altid det samme når du XOR'er med samme "nøgle"

Sandhedstabellen for XOR:

  1 0
1 0 1
0 1 0
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester