在ThinkPHP框架下进行RSA加密和解密,可以使用PHP的openssl扩展库。
首先,需要生成RSA密钥对。可以使用openssl命令行工具或者PHP的openssl扩展函数生成。
生成密钥对的示例代码如下:
$config = array(
"digest_alg" => "sha512",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
// 生成密钥对
$res = openssl_pkey_new($config);
// 获取私钥
openssl_pkey_export($res, $private_key);
// 获取公钥
$public_key = openssl_pkey_get_details($res);
$public_key = $public_key["key"];
生成密钥对后,可以使用公钥加密数据,使用私钥解密数据。
加密示例代码如下:
$data = 'hello world';
// 加载公钥
$public_key = openssl_pkey_get_public($public_key);
// 加密数据
openssl_public_encrypt($data, $encrypted, $public_key);
// 转换为base64编码
$encrypted = base64_encode($encrypted);
解密示例代码如下:
// 加载私钥
$private_key = openssl_pkey_get_private($private_key);
// 解密数据
openssl_private_decrypt(base64_decode($encrypted), $decrypted, $private_key);
需要注意的是,加密的数据长度不能超过密钥长度减去一定的值。可以使用openssl_pkey_get_details函数获取公钥长度,然后减去11就是最大加密数据长度。
$public_key_info = openssl_pkey_get_details($public_key);
$max_len = $public_key_info['bits'] / 8 - 11;
此外,为了加强安全性,可以使用Padding进行填充。常用的Padding有PKCS1_PADDING和OAEP_PADDING。可以在加密和解密时指定Padding类型。
加密示例代码如下:
$data = 'hello world';
// 加载公钥
$public_key = openssl_pkey_get_public($public_key);
// 加密数据
openssl_public_encrypt($data, $encrypted, $public_key, OPENSSL_PKCS1_PADDING);
// 转换为base64编码
$encrypted = base64_encode($encrypted);
解密示例代码如下:
// 加载私钥
$private_key = openssl_pkey_get_private($private_key);
// 解密数据
openssl_private_decrypt(base64_decode($encrypted), $decrypted, $private_key, OPENSSL_PKCS1_PADDING);