Welkom, Gast. Je bent niet ingelogd.

tut Base64

Door iisys op 24 Dec 2006, 14:17

Base64 Encoding Torn Apart
© Copyright [meer dan 4 jaar geleden ], Ankit Fadia ([email protected])
Deze howto, tutorial of hoe je het ook wilt noemen mag van
mij overal gepubliceerd worden, als Ankit Fadia's naam (en mijne,
als je wilt) er maar bij staat

De meeste van jullie denken bij encryptie/encoding (Rene, zit daar verschil in? ): wow. Tovenarij.
En, nouja, misschien ook niet, boeie

Ik ga het hier hebben over de base64 encryptie.
Hij is relatief simpel, en met een eigen php functie makkelijk na te maken.
Ik ga eerst uitleggen hoe het werkt, en daarna een php(4) script geven om te laten zien
hoe het werkt.

Base64 is erg populair geworden sinds z'n introductie. Het wordt bijvoorbeeld gebruikt bij het coderen van bestanden die meegezonden worden met e-mails.
Er zijn natuurlijk véél meer toepassingen van base64, maar daar ga ik het hier niet over hebben

Toch is het een erg slechte beveiliging. Het is erg makkelijk te decoderen.

Base64 gebruikt een 64-character subset van US-ASCII, dat betekend 6 bits voor elk teken.
We nemen als bijvoorbeeld de letter 'i' (kleine letter). Deze heeft een base64 waarde van 34. Scroll naar benede voor het base64 alfabet. Niet dat je er nu al wat aan hebt, maar toch
Deze base64 waarde heeft een bitwaarde van 100010.

Verder naar een uitgebreider voorbeeld. We gaan de tekst 'bah' (kleine letters) handmatig coderen.
Teken 'b' heeft een ASCII waarde van 98.
Teken 'a' heeft een ASCII waarde van 97.
Teken 'h' heeft een ASCII waarde van 104.

Dat betekent dat het in decimale (ASCII) vorm 98 97 104 is. In binaire (ik noem het verder ff binary) vorm wordt dat dit:
01100010 01100001 01101000

Dit zijn vier 8-bit-bytes.
Als je deze achter elkaar plakt, krijg je één 24-bit-byte, of 'stroom'.
011000100110000101101000

Wat base64 dan doet, is de hele 'stroom' in stukken 'splitten' (hakken) van 6 bits.
Wij krijgen dan het volgende:
011000 100110 000101 101000

Nu hebben we vier 6-bit-bytes. Dat rekenen we terug naar ASCII vorm, en dan krijgen we dit:
24 38 5 40

Dan rekenen we deze waarden om naar het base64 alfabet:
24 = Y (hoofdletter)
38 = m
5 = F (hoofdletter)
40 = o

Dus codeer 'bah' met base64 en je krijgt 'YmFo'. Ook als je het met bijv de phpfunctie base64_encode() doet, krijg je 'YmFo'.

De base64 waarden:

Het decoderen werkt precies andersom:
1. Verander elk teken naar zijn base64 waarde.
2. Verander deze waarde naar binary.
3. Zet alle 6-bit-bytes achter elkaar in één string.
4. Split hem in groepjes van 8 bits.
5. Bereken van elke 8-bit-byte de ASCII waarde.
6. Zet elke ASCII waarde weer om naar ons alfabet.
7. Plak het resultaat achter elkaar.

Als iemand nog geïnteresseerd is in de handmatige decode functie in php, laat maar weten dan maak ik m wel (vast wel op internet te vinden, maar dit is leuker ).
Ohja, ik heb hier ook de C source code voor de base64 encoder/decoder, voor t geval iemand geïnteresseerd is.

Bron:
Blacksun.box.sk tutorials/encrypt/base64.htm (1000+ tut's ) (site is jammer genoeg offline)

Het script (ook hier beschikbaar):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<?php
# Maakt het beter leesbaar
# (dat anti-spam gepoep komt van Saven's spam beveiliging):
header('(anti-spam-(anti-spam-(anti-spam-(anti-spam-content-type:)))) text/plain'); 

# Variabelen. 
$i = $s = $binChar = $binString = $t = $encodedString = NULL; 
$a = array(); 
$b64 = array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'); 

# Voor het geval je dit script niet uitvoert in PHP5. 
# Functie van een usercomment van 'user at mockme dot com' op http://nl3.php.net/manual/en/function.str-split.php 
if (!function_exists('str_split')) 
{ 
    function str_split($string, $split_length = 1) 
    { 
        $count = strlen($string); 
        if($split_length < 1) 
        { 
            return false; 
        } elseif($split_length > $count) 
        { 
            return array($string); 
        } else 
        { 
            $num = (int)ceil($count/$split_length); 
            $ret = array(); 
            for($i=0;$i<$num;$i++) 
            { 
                $ret[] = substr($string,$i*$split_length,$split_length); 
            } 
            return $ret; 
        } 
    } 
} 

# String die je wilt coderen. 
$s = $_GET['encode'] ? $_GET['encode'] : 'iisysz.com!'; 

# Output info. 
echo " 
String".str_repeat(' ', strlen($s)+11)." =  ".$s." 
base64_encode('".$s."') =  ".base64_encode($s)."\n\n\n"; 

# Output 8-bit-bytes van $s. 
echo 'Tekens + ASCII waarden + 8-bit-bytes van '.$s.":n"; 
foreach (preg_split('//', $s, -1, PREG_SPLIT_NO_EMPTY) as $char) 
{
    $asciiVal = ord($char);
    $binChar = sprintf('%08d', decbin($asciiVal));     # Binary van elk teken, met voorloopnullen zodat het 8 bits lang blijft. 
    $binString .= $binChar;                            # Totale binary string aanvullen. 
    echo sprintf('   %s  = % 3d = %08d'."\n", $char, $asciiVal, $binChar); 
} 

# Output 6-bit groepen van $binString. 
echo "\n\n".'6-bit-bytes (string van alle 8-bit-bytes gesplit in groepen van 6 bits) + base64 waarde + base64 char:'."\n"; 
$a = str_split($binString, 6); 
foreach ($a as $sixBits) 
{ 
    # Voor het geval je met een oneven strlen($s) te maken hebt, krijg je bij de laatste 6-bit groep niet 6 bits, maar 2 of 4 bits. 
    # Wordt hier ff aangevult met nullen, zodat we de base64 waarde nog gewoon kunnen berekenen. 
    # $i++ is om later het aantal = te bepalen die erachter komen (totaal zinloos, maar de php versie van base64_encode heeft het ook). 
    while (strlen($sixBits) != 6) 
    { 
        $sixBits = $sixBits.'0'; 
        $i++; 
    } 
    $b64value = bindec($sixBits); 
    $encodedString .= $b64[$b64value].str_repeat('=', $i/2); 
    echo sprintf('   %06d = % 2d = %s'."\n", $sixBits, $b64value, $b64[$b64value]); 
} 

# Output het resultaat en controleer of het goed gegaan is door het weer te decoden met de php functie. 
echo " 

Handmatig gecodeerde base64 string =  ".$encodedString." 
base64_decode('\$encodedString')    =  ".base64_decode($encodedString); 
?>

Spel- en andere fouten voorbehouden

Ohja, ik zal dit script ook ff uploaden naar m'n server. Call m dan via
[url]http://www.iisysz.com/base64.php[/url]?encode={string}

Kijk is wat ik vond in mijn logs

/base64.php?encode=christan%20is%20ubergheil

Stfn
1th
Geplaatst op: 05 Jan 2007, 21:50

iisys schreef:

[...]
Dôh, standaard log script voor elke pagina
En ja, nu je het zegt, ik kan wel is een blog maken met een logscript

:\') Wacht er op xD

iisys
Hmhm, indeed. whtvr.
moderator
Geplaatst op: 02 Jan 2007, 23:18

DayDreamer schreef:

Heeft die een log in dat ding gebouwd :\') In de volgende blog laat je zien wat er allemaal in het log bestand staat ?

Dôh, standaard log script voor elke pagina
En ja, nu je het zegt, ik kan wel is een blog maken met een logscript

Stfn
1th
Geplaatst op: 02 Jan 2007, 22:14

Heeft die een log in dat ding gebouwd :\') In de volgende blog laat je zien wat er allemaal in het log bestand staat ?

iisys
Hmhm, indeed. whtvr.
moderator
Geplaatst op: 27 Dec 2006, 13:51

Spunk schreef:

Kan aan mij liggen, maar ik snap er nog steeds geen flikkah van :\')

Idd, ligt aan jou :\')

Died
Geplaatst op: 27 Dec 2006, 13:36

Kan aan mij liggen, maar ik snap er nog steeds geen flikkah van :\')

iisys
Hmhm, indeed. whtvr.
moderator
Geplaatst op: 27 Dec 2006, 12:17

Inuyasha schreef:

Als ik het zo goed begrijp (globaal):

ASCII > Binary (8-bit-bytes) > Stroom > Knippen (6-bit-bytes) > Cijfers > Base64 charset.



, en decoden precies andersom

Inuyasha
Wie anders? ^^
Geplaatst op: 25 Dec 2006, 18:57

Goede tutorial.
Saven.nl is pushed to a higher level.

Ik ga hem zeker ff doorlezen, dan duik ik weer wat oude vergeten kennis op :\')

Als ik het zo goed begrijp (globaal):

ASCII > Binary (8-bit-bytes) > Stroom > Knippen (6-bit-bytes) > Cijfers > Base64 charset.

[Laatst bewerkt door Inuyasha op maandag 25 december 2006, om 21:33]
iisys
Hmhm, indeed. whtvr.
moderator
Geplaatst op: 24 Dec 2006, 22:03

Christan schreef:

[...]

moest hem ff testen, ik snap er eigelijk niet zo veel van.


1. Je moet weten wat preg_split(\'//\', $s, -1, PREG_SPLIT_NO_EMPTY) doet. Niet noodzakelijk, maar wel handig.
2. Je moet weten wat codering/encryption is.
3. Je moet weten wat bits en bytes zijn en het verschil ertussen.
4. Je moet weten wat ASCII (waarden) zijn.

Als je dat allemaal weet, en je snapt het na 3 keer doorlezen nog niet, ben je dom :\')

Sharp
:')
moderator
Geplaatst op: 24 Dec 2006, 20:53

Wouser schreef:

aWlzeXN6IGhlZWZ0IGRlemUgdWJlciAxMzM3IHNjcmlwdCBnZW1hYWt0IF5fXg==

1
iisysz heeft deze uber 1337 script gemaakt ^_^

Wouser
Cadeau'tjes :r
Geplaatst op: 24 Dec 2006, 20:18

aWlzeXN6IGhlZWZ0IGRlemUgdWJlciAxMzM3IHNjcmlwdCBnZW1hYWt0IF5fXg==

Wel leuke tut maar wist allemaal al

Christan
Pwn erd
Geplaatst op: 24 Dec 2006, 19:35

ik heb hem met dit getest;

Y2hyaXN0YW4gaXMgdWJlcmdoZWls
dfdsfdsf
hjkhjk
asd

enz ik moest gewoon ff kijken wat er allaal veranderd enz.

Sharp
:')
moderator
Geplaatst op: 24 Dec 2006, 19:34

Christan schreef:

[...]

moest hem ff testen, ik snap er eigelijk niet zo veel van.


En dan test je hem met dat?
Nogal grote ego heb je dan :\')

Christan
Pwn erd
Geplaatst op: 24 Dec 2006, 19:32

Twizy schreef:

Quote:
/base64.php?encode=christan%20is%20ubergheil

Omfg

moest hem ff testen, ik snap er eigelijk niet zo veel van.

Sharp
:')
moderator
Geplaatst op: 24 Dec 2006, 19:21

Quote:
/base64.php?encode=christan%20is%20ubergheil

Omfg

AfcAjax
Geplaatst op: 24 Dec 2006, 18:54

Leuke tutt

Suma
heeft gelijk
Geplaatst op: 24 Dec 2006, 18:42

iisys schreef:

[...]
Zinloos, md5 en sha1 kan je niet decoden :\')

idd,

Mooie tut trouwens

*Saven krijgt hoger niveau xD*

iisys
Hmhm, indeed. whtvr.
moderator
Geplaatst op: 24 Dec 2006, 15:48

Twizy schreef:

[...]
Handig om te weten.
Ik ga een keer algoritme maken, met md5, sha1 en base64 :\')!

Zinloos, md5 en sha1 kan je niet decoden :\')

Sharp
:')
moderator
Geplaatst op: 24 Dec 2006, 15:40

Saven schreef:

Ziet er goed uit snap ik ook weer hoe die encryptie in elkaar zit

Handig om te weten.
Ik ga een keer algoritme maken, met md5, sha1 en base64 :\')!

Saven
admin
Geplaatst op: 24 Dec 2006, 15:10

Ziet er goed uit snap ik ook weer hoe die encryptie in elkaar zit

📫

Nieuw privébericht

🔥

Registreren


Login