加密是使用算法将明文转换为密文的过程,以防止未经授权的访问。
加密分为两种类型:
1、对称密钥加密
2、非对称加密(公钥加密)
加密算法的工作原理
加密算法是一种将明文转换为密文的数学函数,加密算法通常使用密钥来执行加密和解密操作。
1、加密过程
加密过程分为两个步骤:
明文输入
:将明文输入到加密算法中。
密文输出
:加密算法使用密钥对明文执行一系列复杂的数学运算,并将输出结果作为密文。
密文是加密算法输出的结果,它是用密钥加密后的明文,密文通常是无法直接读取的。
2、解密过程
解密过程与加密过程相反,它分为两个步骤:
密文输入
:将密文输入到解密算法中。
明文输出
:解密算法使用密钥对密文执行一系列复杂的数学运算,并将输出结果作为明文。
3、安全性
加密算法的安全性取决于密钥的强度,如果密钥足够强,则无法使用暴力破解等方法来破解密文。
4、应用
加密算法广泛应用于各种领域,包括网络安全、数据保护、身份认证等。
对称密钥加密
对称密钥加密是一种使用相同密钥进行加密和解密的数据加密方法。对称密钥加密通常用于大量数据的加密,因为它速度快且效率高。
对称密钥加密有两种主要类型:分组密码
和流密码
。
1、分组密码
分组密码使用密钥对固定大小的块(例如,64 或 128 位)中的数据进行加密。分组密码广泛用于各种应用,包括网络安全、数据库加密和文件加密。
常见的分组密码包括:
高级加密标准
(AES):AES 是最常用的分组密码,它支持 128、192 或 256 位的密钥长度。
三重 DES
(3DES):3DES 是 DES 的三重迭代版本,它提供了更高的安全性。
国际数据加密算法
(IDEA):IDEA 是一种快速有效的密码,但它已被 AES 取代。
2、流密码
流密码通常在连续流中逐位或逐字节加密数据。流密码通常用于实时应用,例如网络传输和音频/视频加密。
常见的流密码包括:
Rivest 密码
(RC4):RC4 是最常用的流密码,它速度快且效率高。
无线局域网安全
(WEP):WEP 是一种用于无线局域网 (WLAN) 的流密码,但它已被 WPA 和 WPA2 取代。
安全套接字层
(SSL):SSL 是一种用于加密网络通信的协议,它使用流密码来保护数据。
示例:AES(高级加密标准)
function encrypt($data="", $key="") {
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length("aes-256-cbc")); // 动态 iv (我们也可以设置静态 iv)
$encrypted = openssl_encrypt($data, "aes-256-cbc", $key, 0, $iv);
return base64_encode($iv . '!!' . $encrypted);
}
function decrypt( $data="", $key="") {
list($iv, $encryptedData) = explode('!!', base64_decode($data), 2);
return openssl_decrypt($encryptedData, "aes-256-cbc", $key, 0, $iv);
}
$plainData = [
'email' => 'codewithrubab@gmail.com',
'password' => 'codeOn@Vscode2024';
];
$saltKey = "asdckd44dbc228e16c2888436d17a";
$encryptedData = encrypt(json_encode($plainData), $saltKey);
echo $encryptedData;
$decryptedData = decrypt($encryptedData, $saltKey);
print_r($decryptedData);
注意:如果我们需要在相同的纯文本上重新生成相同的加密数据,那么需要始终使用相同的 Salt Key
和 IV
。否则,输出将会不同。
非对称加密(公钥加密):
它使用两种不同的密钥:用于加密的公钥和用于解密的私钥。
我们不用安全密钥交换来加密,因为它比对称加密慢,但对于数字签名和身份验证很有用,
常见的公钥加密技术:RSA
、ECC
(椭圆曲线加密)、Diffie-Hellman
。
下面是一个关于 RSA 算法的示例。
如果我们没有公钥和私钥,可以从命令行界面生成。
对于目录中的私钥文件生成:
openssl genrsa -out privateKey.pem 2048
对于公钥:
openssl rsa -in privateKey.pem -pubout
这里,privateKey.pem
和privateKey.pem
是生成的文件名。
生成的公钥是 RSA 结果。
私钥不是 RSA 结果,为了使其成为 RSA 结果,还需要编写一些代码。
首先,将此包安装到Laravel项目中。
Composer require "phpseclib/phpseclib": "~2.0"
use phpseclib\Crypt\RSA;
// 私钥: pem 转换为 rsa 代码
$privateKey = '设置pem文件数据';
$rsa = new RSA();
$rsa->loadKey($privateKey);
$rsaPrivateKey = $rsa->getPrivateKey();
dd($rsaPrivateKey);
此外,如果我们需要将公钥从 pem 转换为 RSA,那么我们可以使用此代码进行转换。
// 公钥: pem 转换为 rsa.
$publicKey = '设置pem文件数据';
$rsa = new RSA();
$rsa->loadKey($publicKey);
$rsa->setPublicKey($publicKey);
$rsaPublicKey = $rsa->getPublicKey();
dd($rsaPublicKey);
让我们看看非对称加密的现实实现:
商家与银行进行交易时,需要使用公钥加密和私钥解密来保护数据的安全。
银行向商家提供公钥,商家将公钥分享给银行。商家使用私钥加密交易请求数据,并将加密的数据发送给银行。银行使用商家提供的公钥解密数据。
银行处理数据后,使用私钥向商家发送加密响应。商家使用银行的公钥解密响应,以获得简单的回复。
此外,银行还要求商家在每个交易请求中发送签名。商家使用私钥和 PKCS1Padding
算法来解密已解码的敏感数据。签名使用 SHA256withRSA
签名算法生成。
现在将进行 api 调用以向银行端发起交易。
public function signatureGenerate($data){
$private_key = "-----您的RSA私钥-----";
openssl_sign(json_encode($data), $signature, $private_key, OPENSSL_ALGO_SHA256);
return base64_encode($signature);
}
public function encryptDataWithPublicKey($data){
$public_key = "-----您的公钥-----";
openssl_public_encrypt(json_encode($data), $encryptedData, $public_key, OPENSSL_PKCS1_PADDING);
return base64_encode($encryptedData);
}
public function decryptDataWithPrivateKey($cryptText){
$private_key = "-----您的RSA 私钥-----";
openssl_private_decrypt(base64_decode($cryptText), $plainText, $private_key, OPENSSL_PKCS1_PADDING);
return json_decode($plainText, true);
}
public function HttpPostMethod($postURL, $postData, $authToken = null)
{
try {
$curl = curl_init($postURL);
$postData = json_encode($postData);
$header = array(
'Content-Type:application/json'
);
if($authToken){
$header[] = 'token:' . $authToken;
}
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
$resultdata = curl_exec($curl);
$err = curl_error($curl);
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
$curlErrorNo = curl_errno($curl);
$ResultArray = json_decode($resultdata, true);
curl_close($curl);
return $ResultArray;
} catch (\Exception $exception) {
echo '无法与银行连接,请稍后再试';
exit;
}
}
initTransaction($merchantId, $merchantAccountNumber, $orderId){
$postUrl = 'api.your-bank.com/api/payment/initialize';
$plainData = array(
'merchant_id' => $merchantId,
'order_id' => $orderId
);
$postData = array(
'account_number' => $merchantAccountNumber,
'sensitiveData' => $this->encryptDataWithPublicKey($sensitiveData),
'signature' => $this->signatureGenerate($sensitiveData)
);
return $this->HttpPostMethod($postUrl, $postData);
}
$encryptedResponse = $this->initTransaction('MER1234', 'ACC12345', 'ORD123456');
$plainResponse = $this->decryptDataWithPrivateKey($encryptedResponse['sensitiveData']);
dd($plainResponse);
选择加密算法时要考虑的事项:
1、需要的安全级别。
2、加密和解密的速度。
3、密钥管理复杂性。
4、资源限制。
使用加密算法的地方
1、安全通信(例如电子邮件、VPN)
2、数据存储(例如数据库、文件系统)
3、金融交易(例如网上银行)
4、密码保护
5、数字签名
发表评论