PHP RSA加密解密算法原理解析
RSA是一种非对称加密算法,它使用两个密钥:公钥和私钥。公钥可以向外公开,用于加密数据;而私钥只由数据的持有者保管,用于解密数据。在本文中,我们会使用PHP实现RSA加密解密算法,并分享一些示例代码。
RSA加密解密算法原理
RSA加密解密算法的原理主要是基于数学中的大数分解问题和欧拉定理。以下是RSA算法的一般流程:
- 用随机数生成两个大质数p和q,并计算它们的乘积n=p*q;
- 根据欧拉定理计算n的欧拉函数phi(n)=(p-1)*(q-1);
- 选取一个小于phi(n)且与phi(n)互质的整数e,作为公钥;
- 计算满足d*e mod phi(n)=1的整数d,作为私钥;
- 公钥为(e, n),私钥为(d, n);
- 加密时,将明文M先转换成数字m,m必须小于n,然后用公钥对m进行加密,得到密文C;
- 解密时,用私钥对密文C进行解密,得到加密前的明文M。
RSA算法中,公钥可以向外公开,而私钥只由数据的持有者保管,所以RSA算法可以用于安全的数据传输。
PHP实现RSA加密解密算法
下面我们利用PHP语言来实现RSA算法。由于PHP的大数运算仅支持32位或64位系统,所以在实现时,我们需要使用PHP的openssl扩展,这是因为openssl扩展可以支持比PHP默认整数类型更大的数值。
RSA密钥生成
首先,我们需要通过openssl扩展生成RSA密钥对。下面是一个简单的示例:
$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"];
这个示例会生成一个4096位的RSA密钥对,并将私钥和公钥保存到字符串变量$private_key和$public_key中。
RSA加密解密
有了密钥之后,我们就可以进行RSA加密解密了。下面是一个简单的示例:
// 加密
$data = 'Hello World';
$encrypted = '';
openssl_public_encrypt($data, $encrypted, $public_key);
// 解密
$decrypted = '';
openssl_private_decrypt($encrypted, $decrypted, $private_key);
echo $decrypted;
这个示例会将明文"Hello World"使用公钥加密,然后使用私钥解密,并输出加密前的明文。
示例1:使用RSA加密公共配置数据
假设我们有一个网站,它需要使用一些公共的配置数据,比如数据库连接信息等。如果我们直接将这些数据保存在文件或数据库中,那么就有可能被黑客攻击窃取。所以,我们需要对这些数据进行加密处理,以防止泄露。下面是一个示例代码:
// 生成密钥对
$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"];
// 配置数据
$config_data = array(
'db_host' => 'localhost',
'db_user' => 'root',
'db_password' => '123456'
);
// 加密配置数据
$encrypted_config_data = '';
foreach ($config_data as $key => $value) {
openssl_public_encrypt($value, $encrypted_value, $public_key);
$encrypted_config_data[$key] = base64_encode($encrypted_value);
}
// 保存加密后的数据
$file = 'config_data.dat';
file_put_contents($file, serialize($encrypted_config_data));
// 读取加密后的数据并解密
$encrypted_config_data = unserialize(file_get_contents($file));
$decrypted_config_data = array();
foreach ($encrypted_config_data as $key => $value) {
$encrypted_value = base64_decode($value);
openssl_private_decrypt($encrypted_value, $decrypted_value, $private_key);
$decrypted_config_data[$key] = $decrypted_value;
}
// 输出解密后的配置数据
print_r($decrypted_config_data);
这个示例会生成一个RSA密钥对,然后将配置数据加密保存到文件config_data.dat中。接着,它会读取文件中的数据,并进行解密操作,最后输出解密后的配置数据。在实际应用中,我们可以通过加密后的配置数据来连接数据库等。
示例2:使用RSA加密敏感信息
RSA算法广泛应用于保护敏感信息,例如用户的账户密码等。下面是一个示例代码:
// 用户数据
$user_data = array(
'user_id' => 1,
'user_name' => '张三',
'password' => '123456'
);
// 公钥
$public_key = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/+QlbY/9qTCaQL3cMb4+zH69fBmGoOzqIeiZ54U2PbWxeLh/7vl+NEgh2c95F7RMTA47RaF6HhhyO/dDrOOiyUTiZxB6Th0t1qsJQ9a0l28cyWp3RCFQvW9vIpckQvKLtLRyn43tAaADTmgdaLmmvp+lwP+RDYvhsLgeJdNU/QIDAQAB';
// 加密用户密码
openssl_public_encrypt($user_data['password'], $encrypted_password, $public_key);
$user_data['password'] = base64_encode($encrypted_password);
// 存储用户数据
$file = 'user.dat';
file_put_contents($file, serialize($user_data));
// 读取用户数据并解密
$user_data = unserialize(file_get_contents($file));
$encrypted_password = base64_decode($user_data['password']);
openssl_private_decrypt($encrypted_password, $decrypted_password, $private_key);
$user_data['password'] = $decrypted_password;
// 输出用户数据
print_r($user_data);
这个示例会加密用户的账户密码,并将用户数据保存到文件user.dat中。接着,它会从文件中读取用户数据,并进行解密操作,最后输出解密后的用户数据。在实际应用中,我们可以通过这种方法来保护用户的敏感信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP rsa加密解密算法原理解析 - Python技术站