© 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'.
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):
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