RSA Algorithm in PHP
Hello,
two days ago i need to implement RSA encryption public/private key management and i was stuck where should i begin what should i need and so on so i wrote this tutorial for it in php
first php support it by default using openssl
first you need to generate keys private/public key per user
two days ago i need to implement RSA encryption public/private key management and i was stuck where should i begin what should i need and so on so i wrote this tutorial for it in php
first php support it by default using openssl
first you need to generate keys private/public key per user
// generate a 2048 bit rsa private key, returns a php resource, save to file
$privateKey = openssl_pkey_new(array(
'private_key_bits' => 2048,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
));
openssl_pkey_export_to_file($privateKey, 'private_key.pem');
// get the public key $keyDetails['key'] from the private key;
$keyDetails = openssl_pkey_get_details($privateKey);
file_put_contents('public_key.pem', $keyDetails['key']);
after this you should have private_key.pem , public_key.pem files you can use them for encryption and decryption key length used in key generation was 2048 awesome it's hard for bruteforce attack and/or cryptanalysis applications
/**
* @param $plainText
* @return string
*/
public function encryption($plainText)
{
$public_key = openssl_pkey_get_public(file_get_contents('public_key.pem'));
$public_key_details = openssl_pkey_get_details($public_key);
// there are 11 bytes overhead for PKCS1 padding
$encrypt_chunk_size = ceil($public_key_details['bits'] / 8) - 11;
$output = '';
// loop through the long plain text, and divide by chunks
while ($plainText) {
$chunk = substr($plainText, 0, $encrypt_chunk_size);
$plainText = substr($plainText, $encrypt_chunk_size);
$encrypted = '';
if (!openssl_public_encrypt($chunk, $encrypted, $public_key))
die('Failed to encrypt data');
$output .= $encrypted;
}
openssl_free_key($public_key);
return base64_encode($output);
}
/**
* @param $cipherText
* @return string
*/
public function decryption($cipherText)
{
// decode the text to bytes
$encrypted = base64_decode($cipherText);
// read the private key
$private_key = openssl_pkey_get_private(file_get_contents('private_key.pem'));
$private_key_details = openssl_pkey_get_details($private_key);
// there is no need to minus the overhead
$decrypt_chunk_size = ceil($private_key_details['bits'] / 8);
$output = '';
// decrypt it back chunk-by-chunk
while ($encrypted) {
$chunk = substr($encrypted, 0, $decrypt_chunk_size);
$encrypted = substr($encrypted, $decrypt_chunk_size);
$decrypted = '';
if (!openssl_private_decrypt($chunk, $decrypted, $private_key))
die('Failed to decrypt data');
$output .= $decrypted;
}
openssl_free_key($private_key);
return $output;
}
well that's it
GoodBye , Happy Hacking !
Comments
Post a Comment