PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

mcrypt_get_block_size> <mcrypt_generic_init
Last updated: Fri, 20 Jun 2008

view this page in

mcrypt_generic

(PHP 4 >= 4.0.2, PHP 5)

mcrypt_generic — Chiffre les données

Description

string mcrypt_generic ( resource $td , string $data )

mcrypt_generic() chiffre les données data . Les données sont complétées par des "\0" pour obtenir une taille multiple de la taille d'un bloc. Elle retourne les données chiffrées. Notez que la longueur de la chaîne retournée peut être plus longue que celle passée en argument, à cause du complément.

Si vous voulez enregistrer les données chiffrées dans une base de données assurez-vous d'enregistrer la chaîne entière retournée par cette fonction, sinon la chaîne ne sera pas décryptée correctement. Si votre chaîne d'origine comporte 10 caractères et que la taille d'un bloc est de 8 (utilisez mcrypt_enc_get_block_size() pour déterminer cette taille), vous aurez besoin d'au moins 16 caractères dans le champ de votre base de données. Notez que la chaîne retournée par mdecrypt_generic() aura 16 caractères de long... utilisez rtrim($str, "\0") pour supprimer le complément.

Par exemple, si vous enregistrez les données dans une base de données MySQL, souvenez-vous que les champs de type varchar suppriment automatiquement les espaces en trop durant l'insertion. Comme les données chiffrés peuvent se terminer avec un espace (ASCII 32), les données seront endommagées par cette suppression. Stockez les données dans un champ de type tinyblob/tinytext (ou plus grand) pour que tout fonctionne normalement.

Le gestionnaire de chiffrement td doit être initialisé avec la fonction mcrypt_generic_init(), avec une clé et un VI, avant d'appeler cette fonction. Lorsque le chiffrement est réalisé, vous devez libérer les buffers en appelant la fonction mcrypt_generic_deinit(). Voyez mcrypt_module_open() pour un exemple.

Voir aussi mdecrypt_generic(), mcrypt_generic_init(), et mcrypt_generic_deinit().



mcrypt_get_block_size> <mcrypt_generic_init
Last updated: Fri, 20 Jun 2008
 
add a note add a note User Contributed Notes
mcrypt_generic
maxximus007 at gmail dot com
16-Aug-2007 05:21
Behaviour change: Since 5.2.x mcrypt_generic will issue a warning when the datastring is empty.
tmacedo at linux dot ime dot usp dot br
13-Nov-2006 06:22
completing  the post from Ryan Thomas, ryanrst at gmail dot com, if u post a cookie w/ HTTP method, its may be encoded;
As some chars in base64 will be encoded to another things, u can just replace them before encode and after decode;
Its a tweak from dawgeatschikin at hotmail dot com to original idea from massimo dot scamarcia at gmail dot com
(see @ http://www.php.net/manual/en/function.base64-encode.php):
<?php
function urlsafe_b64encode($string)
{
 
$data = base64_encode($string);
 
$data = str_replace(array('+','/','='),array('-','_','.'),$data);
  return
$data;
}
function
urlsafe_b64decode($string)
{
 
$data = str_replace(array('-','_','.'),array('+','/','='),$string);
 
$mod4 = strlen($data) % 4;
  if (
$mod4) {
   
$data .= substr('====', $mod4);
  }
  return
base64_decode($data);
}
?>
chad 0x40 herballure 0x2e com
12-Jul-2006 05:28
Addendum to my previous note: apparently there was some sort of character encoding breakage; PHP does not pad if no padding is needed, and the extra padding I saw was the result of chr(X) returning multiple bytes or something.

The pad/unpad functions I gave are still binary-safe, though, and are to the best of my knowledge completely compatible with NIST 800-38a.
chad 0x40 herballure 0x2e com
12-Jul-2006 04:36
If the data is already n*blocksize long, PHP pads with another full block of "\0", so there will be between 1 and mcrypt_enc_get_block_size($td) bytes of padding.

You can create binary-safe padding by unconditionally adding a 0x80 to the string, then stripping trailing "\0"s PHP added, plus the one 0x80 byte.

<?php
function pad($text) {
 
// Add a single 0x80 byte and let PHP pad with 0x00 bytes.
 
return pack("a*H2", $text, "80");
}
function
unpad($text) {
 
// Return all but the trailing 0x80 from text that had the 0x00 bytes removed
 
return substr(rtrim($text, "\0"), 0, -1);
}
?>
eric at ez-llc dot com
11-Mar-2006 09:55
I was able get php and perl to play together with blowfish using cipher block chaining.  The blowfish key needs to be atleast 8 chars (even though blowfish min is 8 bits, perl didn't like keys smaller than 8 chars) and max 56.  The iv must be exactly 8 chars and padding needs to be null because php pads with nulls.  Also, php needs libmcrypt >= 2.4.9 to be compatible with perl.

PERL
----

use Crypt::CBC;
$cipher = Crypt::CBC->new( {'key' => 'my secret key',
                                    'cipher'=> 'Blowfish',
                                    'iv' => '12345678',
                                    'regenerate_key' => 0,
                                    'padding' => 'null',
                                    'prepend_iv' => 0
                                    });
$cc = 'my secret text';
$encrypted = $cipher->encrypt($cc);
$decrypted = $cipher->decrypt($encrypted);

print "encrypted : ".$encrypted;
print "<br>";
print "decrypted : ".$decrypted;

PHP
---

$cc = 'my secret text';
$key = 'my secret key';
$iv = '12345678';

$cipher = mcrypt_module_open(MCRYPT_BLOWFISH,'','cbc','');

mcrypt_generic_init($cipher, $key, $iv);
$encrypted = mcrypt_generic($cipher,$cc);
mcrypt_generic_deinit($cipher);

mcrypt_generic_init($cipher, $key, $iv);
$decrypted = mdecrypt_generic($cipher,$encrypted);
mcrypt_generic_deinit($cipher);

echo "encrypted : ".$encrypted;
echo "<br>";
echo "decrypted : ".$decrypted;
Ryan Thomas, ryanrst at gmail dot com
05-Jan-2006 11:15
If you wish to store encrypted data in a cookie variable on the browser you will encounter problems when decrypting the data. This is because cookies will only store US-ASCII characters and your encrypted data may contain non-US-ASCII characters.

The solution:

base64_encode your encrypted string before you store it in the cookie and base64_decode the string stored in the cookie becore decrypting.

Example:

function setEncryptedCookie($cookieName, $data)
{
  setcookie($cookieName, base64_encode($this->encrypt($data)), time()+$this->expire); 
}

function getEncryptedCookie($cookieName)
{
  return $this->decrypt(base64_decode($_COOKIE[$cookieName]));
}
pauls at sellingsource dot com
15-May-2003 08:02
If you are encrypting binary and there is a null terminator partway through your encryption, you will loose the rest of the string.  A workaround is to base64_encode your binary string first.

We found this problem while trying to encrypt CC information.  Some CC values would not decrypt after we converted them to a binary string.

We were using the MCRYPT_RIJNDAEL_256 module to encrypt with.

Hope this helps someone.

mcrypt_get_block_size> <mcrypt_generic_init
Last updated: Fri, 20 Jun 2008
 
 
show source | credits | sitemap | contact | advertising | mirror sites