Slide 31
Slide 31 text
WHAT'S NEW IN PHP 7.2 • DECEMBER 19TH 2017 • PHP USERGROUP DRESDEN HOLGER WOLTERSDORF
SODIUM AUTHENTICATED EN/DECRYPTION
31
function deriveKeyFromPassword( string $password, string $salt ) : string
{
$outLength = SODIUM_CRYPTO_SIGN_SEEDBYTES;
$seed = sodium_crypto_pwhash(
$outLength,
$password,
$salt,
SODIUM_CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE,
SODIUM_CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE
);
return $seed;
}
function encrypt( string $plainText, string $password ) : string
{
$salt = random_bytes( SODIUM_CRYPTO_PWHASH_SALTBYTES );
$key = deriveKeyFromPassword( $password, $salt );
$nonce = random_bytes( SODIUM_CRYPTO_SECRETBOX_NONCEBYTES );
$cipherText = sodium_crypto_secretbox( $plainText, $nonce, $key );
return $salt . $nonce . $cipherText;
}
function decrypt( string $cipherText, string $password ) : string
{
$salt = substr(
$cipherText,
0,
SODIUM_CRYPTO_PWHASH_SALTBYTES
);
$nonce = substr(
$cipherText,
SODIUM_CRYPTO_PWHASH_SALTBYTES,
SODIUM_CRYPTO_SECRETBOX_NONCEBYTES
);
$encryptedText = substr(
$cipherText,
SODIUM_CRYPTO_PWHASH_SALTBYTES
+ SODIUM_CRYPTO_SECRETBOX_NONCEBYTES
);
$key = deriveKeyFromPassword( $password, $salt );
$plainText = sodium_crypto_secretbox_open(
$encryptedText,
$nonce,
$key
);
if ( false !!=== $plainText )
throw new \InvalidArgumentException( 'Bad cipher text' );
return $plainText;
}
$password = 'password';
$message = 'Ho-Ho-Ho';
$encrypted = encrypt( $message, $password );
var_dump( $encrypted );
$decrypted = decrypt( $encrypted, $password );
var_dump( $decrypted );