Data versleutelen en terughalen
Met onderstaand script kan ik een een woord versleutelen.
Nu, ik heb dit script uitgeprobeerd (komt van internet), maar telkens veranderd de ge encrypted string.
Hoe komt dat?
Ook begrijp ik niet veel functies, en op php.net is het niet echt duidelijk
Heeft iemand een tutorial voor deze functie?
Alvast bedankt !
Diov
Code (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
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
<?php
class Encryption
{
const CYPHER = MCRYPT_RIJNDAEL_256;
const MODE = MCRYPT_MODE_CBC;
const KEY = 'somesecretphrase';
public function encrypt($plaintext)
{
$td = mcrypt_module_open(self::CYPHER, '', self::MODE, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, self::KEY, $iv);
$crypttext = mcrypt_generic($td, $plaintext);
mcrypt_generic_deinit($td);
return base64_encode($iv.$crypttext);
}
public function decrypt($crypttext)
{
$crypttext = base64_decode($crypttext);
$plaintext = '';
$td = mcrypt_module_open(self::CYPHER, '', self::MODE, '');
$ivsize = mcrypt_enc_get_iv_size($td);
$iv = substr($crypttext, 0, $ivsize);
$crypttext = substr($crypttext, $ivsize);
if ($iv)
{
mcrypt_generic_init($td, self::KEY, $iv);
$plaintext = mdecrypt_generic($td, $crypttext);
}
return trim($plaintext);
}
}
$versleuteld = new Encryption();
$encrypted_string = $versleuteld->encrypt('123'); // Åž-\Ž“kcþ1ÿ4gî:Xƒã%
echo $encrypted_string;
echo '<br><br><br>';
$decrypted_string = $versleuteld->decrypt($encrypted_string); // this is a test
echo $decrypted_string;
?>
class Encryption
{
const CYPHER = MCRYPT_RIJNDAEL_256;
const MODE = MCRYPT_MODE_CBC;
const KEY = 'somesecretphrase';
public function encrypt($plaintext)
{
$td = mcrypt_module_open(self::CYPHER, '', self::MODE, '');
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
mcrypt_generic_init($td, self::KEY, $iv);
$crypttext = mcrypt_generic($td, $plaintext);
mcrypt_generic_deinit($td);
return base64_encode($iv.$crypttext);
}
public function decrypt($crypttext)
{
$crypttext = base64_decode($crypttext);
$plaintext = '';
$td = mcrypt_module_open(self::CYPHER, '', self::MODE, '');
$ivsize = mcrypt_enc_get_iv_size($td);
$iv = substr($crypttext, 0, $ivsize);
$crypttext = substr($crypttext, $ivsize);
if ($iv)
{
mcrypt_generic_init($td, self::KEY, $iv);
$plaintext = mdecrypt_generic($td, $crypttext);
}
return trim($plaintext);
}
}
$versleuteld = new Encryption();
$encrypted_string = $versleuteld->encrypt('123'); // Åž-\Ž“kcþ1ÿ4gî:Xƒã%
echo $encrypted_string;
echo '<br><br><br>';
$decrypted_string = $versleuteld->decrypt($encrypted_string); // this is a test
echo $decrypted_string;
?>
Modedit:
Even de code en topicstart omgekeerd, en de code tussen code-tags geplaatst
Gewijzigd op 27/08/2013 18:54:11 door - Ariën -
Als iets is gecodeerd kan je het helaas niet meer terughalen.
Michael R op 27/08/2013 17:06:05:
Als iets is gecodeerd kan je het helaas niet meer terughalen.
Dat geldt voor asymmetrische encryptie. In dit geval wordt echter symmetrische encryptie gebruikt: wie de geheime sleutel weet, kan versleutelde data weer ontsleutelen.
Diov, deze klasse is op zich simpel. Waar loop je vast?
Ook versta ik er niet veel van op php.net
Versleutelen en terughalen werkt wel,
maar stel:
Ik maak iets zoals WhatsApp, maar dan zijn de berichten versleuteld.
Hoe 'ontsleutel' ik dan terug de berichten?
Moet ik dan de key opslaan in de database? Wat ook niet echt veilig is volgens mij ...
- een geheime sleutel (secret key);
- een algoritme, bijvoorbeeld Rijndael;
- een codeersterkte (cipher strength), bijvoorbeeld 256.
In jouw klasse zijn dit constanten, maar je krijgt een flexibelere én veiligere opzet als je er eigenschappen met setters van maakt.
A en B kunnen versleutelde berichten uitwisselen als ze beide dezelfde geheime sleutel kennen. Daarvoor kun je de gedeelde sleutels opslaan in een database. In de huidige klasse is er namelijk maar één sleutel die door iedereen voor alles wordt gedeeld.
Maar als je alles moet versleutelen om data van de een naar de ander te brengen, kan je dan niet beter een SSL verbinding nemen?
Daar is het immers voor gemaakt.