- 生成密钥和公钥
开始前需要准备openssl环境
1.1 linux 需要安装openssl工具包,传送门http://www.openssl.org/source/
1.2 window 下需要安装openssl的程序,传送门http://slproweb.com/products/Win32OpenSSL.html
1.3 密钥生成
openssl genrsa 用于生成rsa私钥文件,生成是可以指定私钥长度和密码保护,具体参数请参考文档。
openssl genrsa -out private_key.pem 1024
-out 指定生成的密钥的文件名,可以随意定义,但是最好为意义的名字,在此生成的密钥文件为 private_key.pem
在此生成一个1024长度的密钥,密钥长度越长越安全,但加解密所耗时间亦变长。
生成的密钥private_key.pem文件的内容为:
—–BEGIN RSA PRIVATE KEY—–
MIICXAIBAAKBgQCxLKt87Xxt+tjZqggwy5xBqd7hMrVNGWxDmEC8N02VLKjydwB8
fU4OooKgtGpSNHy2o4L1S0AAxyplPQbcoou4Aa4NaiqvSrbfotZHIgoMK3UnfxcD
xH9f9rJdiD3UTPrh+9sijhjusRc8lWLSOGvHio2/Xj4/yZAZVYQEnWcGfQIDAQAB
AoGANWU3/Xt5H5AU4Gxs8X+7hNKUGBx3JVg/F5QAFnk4SXffJsuUevAsoR567cHR
tRqaZ1SZ+CEIlfNwJHii48WdA4QkzoJp8leIHEnDcwlutM7zQBFTLI9keE2Fdi2n
ArNFu//R7wRk5NNscZst0DV/kksUbP//4TSRePqWiD6cKkECQQDXy7s+TDRrVkVt
kD4/3ae5H3ExoKcyBwwkhvBAzGjfiZYSfNDHX04Sv4zJf0BT1Gu48kO/AcfSzEKa
vxbW6ujtAkEA0i7qCXAQsyW1T9xZrFkhw8vXgI2NDaQ7RbKG8OxnzsA6TYjmTy79
YQF+Q1KQ52F7IABY5JtlIBBoT5XHC3+x0QJATCap6d8MdIBaOcK4JON8Z5iP4lp2
BfJ0t4Miz0sTCydLXTTMnD6ml3kfHpAYTDze0sIzY/kl4d6Q9njOf4MgNQJAeIQh
+etiB/bVMcd9O4+YBra5CKMhf/LtcZdePIKxOyGJzK90r26YJqk+hsevAp0ohj7s
uZhIscv2o7uT+AnuIQJBAKUDl8ZyOPz/75dCVVTMFKhhMQ/AR+uhqu2AEQCzOgU3
5/iNjbvKOzHLgXit78jNr7kCOYfb5G4OBTtzo0ZYYaQ=
—–END RSA PRIVATE KEY—–
1.4 公钥生成
Rsa命令用于处理RSA密钥、格式转换和打印信息
openssl rsa -in private_key.pem -pubout -out public_key.pem
-in filename:输入的RSA密钥文件,在此为上面生成的密钥 private_key.pem。
-pubout:设置此选项后,保存公钥值到输出文件中。
-out filename:输出文件,在此我们定义成public_key.pem
生成的公钥public_key.pem文件的内容为:
—–BEGIN PUBLIC KEY—–
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDt8lasjepyr1vq/Q87iNJCv7ge
QXI2rgAB7lVFS02FxLNwgtqQ1cf+NH6mP88ufxxDVI2oL1RcH48dZPG7MGS4c0YT
EDOpIeTCZ8fW+AiPYTaq1axtS51LNwXeYIak28L8mEZoQjmn+nb3vfmTAKTUKrzz
XIDT3R83+lX4xxxQXwIDAQAB
—–END PUBLIC KEY—–
PHP用RSA加解密
开始前需要准备php openssl环境,开启PHP openssl扩展,window将php的配置文件php.ini中的
;extension=php_openssl.dll
改为
extension=php_openssl.dllPHP-RAS加解密示例
class RSA
{
public function __construct()
{
// 判断openssl扩展存在
extension_loaded('openssl') or die('openssl extension does not exist');
}
/**
* rsa加密
* @param string $str 原始明文
* @param string $need_base64_encode 是否需要base64_encode
* @return string
*/
public static function encrypt($str, $need_base64_encode = TRUE)
{
// 公钥存放路径
$public_key_path = SpringConstant::LIBRARY_PATH . "/rsa/public_key.pem";
file_exists($public_key_path) or die('public key file path is not correct');
// 生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public函数返回false
$public_key = openssl_pkey_get_public(file_get_contents($public_key_path));
$encrypt_data = '';
if (@openssl_public_encrypt($str, $encrypt_data, $public_key))
{
// 加密后 可以base64_encode后方便在网址中传输 或者打印 否则打印为乱码
if ($need_base64_encode)
{
$encrypt_data = base64_encode($encrypt_data);
}
}
else
{
die('encrypt failed');
}
return $encrypt_data;
}
/**
* rsa解密
* @param string $str rsa密文
* @param string $need_base64_decode 是否需要base64_decode解密
* @return string
*/
public static function decrypt($str, $need_base64_decode = TRUE)
{
// 公钥存放路径
$private_key_path = SpringConstant::LIBRARY_PATH . "/rsa/private_key.pem";
file_exists($private_key_path) or die('private key file path is not correct');
// 生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private函数返回false
$private_key = openssl_pkey_get_private(file_get_contents($private_key_path));
$decrypt_data = '';
$encrypt_data = $str;
if($need_base64_decode)
{
$encrypt_data = base64_decode($encrypt_data);
}
//解密
@openssl_private_decrypt($encrypt_data, $decrypt_data, $private_key, OPENSSL_PKCS1_PADDING) or die('decrypt failed');
return $decrypt_data;
}
}
4.使用PHP-RAS加解密
$str = 'niky';
$encrypt_str = RSA::encrypt($str,true);
$decrypt_str = RSA::decrypt($encrypt_str,true);
var_dump($str,$encrypt_str,$decrypt_str);exit;