Encrypten en decrypten met persoonlijke sleutel

Gepost door Bart Brouwer op 23-12-2009 14:01.

Met dit script kun je strings omzetten in een gecodeerde base64 string, die geencrypt is met een persoonlijke sleutel.

Script is handig voor het opslaan van o.a. vertrouwelijke informatie.

De gehashte sleutel bestaat momenteel uit een 320 bits SHA1 hash. Deze is naar eigen wens te creeƫren.
Geef nooit vrij hoe je sleutel gemaakt wordt.

Bestanden van dit script

index.php

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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
<?php
    
    class EncryptedString
    {
        var $sKey;    
        var $sData;
        
        function EncryptedString($sData, $sKey)
        {
            $this->sKey = sha1($sKey) . sha1($sKey . substr(sha1($sKey),2,1)); // Create a combined 320 bits key 
                                                                               // 320 bits is save for longer encryption strings    
            $this->sData = $sData;
        }
        
        function Encrypt() 
        {
            
            // Encryp the data by your personal key
            $sResult = '';
            for($i=0; $i<strlen($this->sData); $i++) 
            {
                $char = substr($this->sData, $i, 1);
                $sKeychar = substr($this->sKey, ($i % strlen($this->sKey))-1, 1);
                $char = chr(ord($char)+ord($sKeychar));
                $sResult .= $char;
            }
            
            $this->sData = base64_encode($sResult); // Encode the result into an Base64 string and store it
            
            return $this->sData;
        }

        function Decrypt() 
        {
            $sResult = '';
            $this->sData = base64_decode($this->sData); // Decode the data from Base64
            
            // Decryp the data by your personal key
            for($i=0; $i<strlen($this->sData); $i++) 
            {
                $char = substr($this->sData, $i, 1);
                $sKeychar = substr($this->sKey, ($i % strlen($this->sKey))-1, 1);
                $char = chr(ord($char)-ord($sKeychar));
                $sResult.=$char;
            }
            
            $this->sData = $sResult; // Store the decrypted / original string
            
            return $this->sData;
        } 
    } // End of class
    
    
    
    
    /*
     * USE OF THE ENCRYPT CLASS
     * ------------------------
     * 
     * For encrypting: 
     *   - Create clear string
     *   - Create clear key
     *   - Create EncryptedString object
     *      * @params: string, key
     *   - Call class function Encrypt()
     *      * @return: encrypted string
     * 
     * For decrypting
     *   - Create encrypted string
     *   - Create clear key
     *   - Create EncryptedString object
     *      * @params: encrypted string, key
     *   - Call class function Decrypt()
     *      * @return: decrypted string
     * 
     * 
     */
    
    $sKey = "pHpFRe@kZ"; // The personal key will be transformed to a combined SHA1 key in the constructor
     
     
    // Example of encrypting a string
    $sString = "TOP SECRET";
    $oEncrypt = new EncryptedString($sString, $sKey);
    $oEncrypt->Encrypt(); // returns encrypted string: tYSAWbl5dbd4uA==
    
    // Example of decrypting a string
    $sString = "tYSAWbl5dbd4uA=="; // Encryption of "TOP SECRET"
    $oDecrypt = new EncryptedString($sString, $sKey);
    $oDecrypt->Decrypt(); // returns decrypted string: TOP SECRET
    
    
?>

Commentaar

23-12-2009 22:42

"Geef nooit vrij hoe je sleutel gemaakt wordt."
Ok, dit is dus een typisch gevalletje "security through obscurity. Er wordt wat data vernaggeld, maar veel meer dan dat is het ook niet. In het geval van "encryptie" maakt het niet uit of iemand de volledige implementatie kent. Zie de grote jongens van RSA en de verschillende DES smaken bijvoorbeeld.

1
2
3
Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding. 

Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan.
27-12-2009 23:14

Het gaat toch erom dat je persoonlijke sleutel geheim blijft? Zonder die sleutel kun je nog de broncode hebben, volgens mij kan je dan nog de tekst niet decrypten...

1
<? ?>
28-12-2009 21:25

"Het gaat toch erom dat je persoonlijke sleutel geheim blijft? Zonder die sleutel kun je nog de broncode hebben, volgens mij kan je dan nog de tekst niet decrypten..."

Dat heet dus "security through obscurity", want het is veilig totdat iemand de sleutel weet te bemachtigen. Typisch gevalletje hiervan is de OV-chipkaart. Het was veilig totdat men de "geheime code" wist te bemachtigen.
Het blijft komisch om te zien hoe knullig die beveiliging is :)
Zie: http://video.google.com/videoplay?docid=4252367680974396650

Echte beveiliging is niet afhankelijk van deze schijnveiligheid.

1
<?php ?>
28-12-2009 22:19

> Dat heet dus "security through obscurity", want het is veilig > totdat iemand de sleutel weet te bemachtigen.

Maar dan is dat bij alle encryptie/beveiliging toch het geval: als je het wachtwoord/de sleutel weet, dan kan je bij de gevoelige inhoud komen.

1
2
3
Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding. 

Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan.
29-12-2009 08:22

Het gaat hier om een dubbele encryptie namelijk die aan de hostkant en die aan de gebruikerskant.
Als iemand dus in de database weet te komen ziet hij enkel een gecodeerd bestand staan. Hier kan hij niets mee.

Omdat het met een door de gebruikergekozen sleutel encrypt is moet hij eerst de sleutel zien te achterhalen welke niet aanwezig is.

Probeer dan maar iets met dat stuk tekst te doen, en de mensen die nog steeds roepen dat het gemakkelijk te kraken is, succes:

Wat staat hier: ktLWWc6cnYWboq1UlafJoVOoo9TTVKSVUKjPnKHIn1eaysbVr6mpy9Q=

1
2
3
Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding. 

Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan.
29-12-2009 23:11

"en de mensen die nog steeds roepen dat het gemakkelijk te kraken is"

Ik geloof niet dat iemand hier heeft beweerd dat het gemakkelijk te kraken is, of heb ik ergens overheen gelezen?

1
<?php ?>
11-03-2010 20:19

Deze vorm van versleuteling is niet veilig voor vertrouwelijke informatie. Encryptie algorithmen dienen alleen in uitzonderlijke gevallen ontwikkeld te worden door specialisten.

Dit algorithme heeft een zwakte en kan alleen worden gebruikt voor korte strings (en zelfs dat is discutabel). Bij gebruik van hele teksten is de encryptie veel makkelijker te kraken.

Het gebruik van deze code levert een vals gevoel van veiligheid op. Voor gebruik van encryptie algorithem raad ik de Mcryptextensie aan: http://nl.php.net/manual/en/ref.mcrypt.php

Begrijp me niet verkeerd, eigen encryptie algorithmen maken is erg leuk, maar deze zijn niet toepasbaar voor commercieel gebruiken of voor het versleutelen van vertrouwelijke data.

1
2
3
Post hier de source-code van je script. Alle informatie tussen <? ... ?> en <?php ... ?> zal automatisch worden getoond in color-coding. 

Let op! Het is niet de bedoeling om hier een link naar je website te plaatsen. Post hier gewoon de code, veel simpeler, sneller en meer kans dat het blijft staan.
Inloggen wachtwoord vergeten? Aanmelden