PHP三種方式讀取RSA密鑰加解密、簽名驗(yàn)簽完整教程
第一步、生成公私鑰
在線生成公鑰私鑰對(duì),RSA公私鑰生成-ME2在線工具
密鑰長(zhǎng)度:
- RSA 密鑰通常有不同的長(zhǎng)度,通常以位數(shù)來(lái)表示,如 1024 位、2048 位等。一般來(lái)說(shuō),密鑰長(zhǎng)度越長(zhǎng),加密強(qiáng)度越高,但同時(shí)也會(huì)增加加密和解密的計(jì)算復(fù)雜度。一般推薦使用 2048 位或更長(zhǎng)的 RSA 密鑰來(lái)確保較高的安全性。
密鑰格式:
- OpenSSL 中的私鑰通常采用 PEM 格式(Privacy-Enhanced Mail,即隱私增強(qiáng)郵件)存儲(chǔ)。PEM 格式的密鑰是經(jīng)過(guò) Base64 編碼的文本字符串,通常以
-----BEGIN PRIVATE KEY-----開(kāi)頭,以-----END PRIVATE KEY-----結(jié)尾。 - 另外,私鑰也可以存儲(chǔ)在 PKCS#12 格式的證書(shū)文件中,通常以
.p12或.pfx結(jié)尾。這些文件通常包含私鑰、公鑰和證書(shū)鏈等信息。

第二步、三種方式讀取RSA密鑰
第1種:公私鑰弄成一行,必須一行沒(méi)有空格和換行
$publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKZ1mKTymRoGKnHiP1xAy4aiyt5r0BscCZnDAonCrMFZ4kBGriPNHxEaLr5lfBnMKw7k6i+2dsFPSEZooTvqtPUCAwEAAQ=='; $privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEApnWYpPKZGgYqceI/XEDLhqLK3mvQGxwJmcMCicKswVniQEauI80fERouvmV8GcwrDuTqL7Z2wU9IRmihO+q09QIDAQABAkBunx3nGHXYjppsfn++7iyTd+I7+Agfy/0xWyB3rpEiGGgfemjcRFaeq5SC2vUNXsrEOY5gbUSQmFxH//Cym18NAiEA1z1cZx/Q9cbIjFPwp1a+K5CVFDXDcfbi/AQgAkVs0/cCIQDF+2fr23AoBslcOC4S0yAx94AbgxCntYuRqztxybsrcwIgMW86ZcT87TX2oaQ1xXk6vC68zqN6fBZEE7Wu1Fa1pAkCIElmOJP3qfAc/AAlj+dIwLHlqWgJwl3674CU9Bfui2bDAiEA0CKJpF8x7KANCcopEQC93PsbIztuML322LOfDV1Lw/k=';
轉(zhuǎn)化能使用的密鑰資源
- 如果私鑰不是資源類(lèi)型,則將私鑰進(jìn)行處理,將其轉(zhuǎn)換為 PEM 格式。這里使用
chunk_split函數(shù)將私鑰按照每行64個(gè)字符的長(zhǎng)度進(jìn)行分割,并在適當(dāng)?shù)奈恢貌迦霌Q行符\n。 - 在拼接完整的 PEM 格式私鑰之后,再使用
openssl_pkey_get_private函數(shù)將 PEM 格式的私鑰轉(zhuǎn)換為 OpenSSL 的私鑰資源
$pem = chunk_split($privateKey, 64, "\n"); $pem = "-----BEGIN PRIVATE KEY-----\n" . $pem. "-----END PRIVATE KEY-----\n"; $pem2 = chunk_split($publicKey, 64, "\n"); $pem2 = "-----BEGIN PUBLIC KEY-----\n" . $pem2 . "-----END PUBLIC KEY-----\n";
第2種:直接復(fù)制生成公私鑰
$publicKeyString = "-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp1ffL+kUEedBLTzQrKU+ 8oq9IZSUroxhmnWrXa1XMGtlbeVCHQNljujqwGuLELyk7i78cGczwCyGE2SVj9oI tBzGn02fWZNCb3bHPv6ofliTvqYcZOFaFTWB+tTKuOmopCk/bgQVe7HC6+74s/3x Q4tM1jVbNPYSY11++DLjEQ8KaA3pNJwoFTxER3GVEgmfhi5xUTTaBa5ZOIaNfsFr 0fGzvGbmRpqoIor6MlSxXbMO4k2pMzB7YJYYr7zRC28DoeJCj5XnXkq4XPIJzo8/ g79163dp0y9m7cDn4NfRDdBsFeHy6n+hKps6hSVf1z1ZtQtlfk0mRE/EchubDcuH +QIDAQAB -----END PUBLIC KEY-----"; $privateKeyString = "-----BEGIN PRIVATE KEY----- MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCnV98v6RQR50Et PNCspT7yir0hlJSujGGadatdrVcwa2Vt5UIdA2WO6OrAa4sQvKTuLvxwZzPALIYT ZJWP2gi0HMafTZ9Zk0Jvdsc+/qh+WJO+phxk4VoVNYH61Mq46aikKT9uBBV7scLr 7viz/fFDi0zWNVs09hJjXX74MuMRDwpoDek0nCgVPERHcZUSCZ+GLnFRNNoFrlk4 ho1+wWvR8bO8ZuZGmqgiivoyVLFdsw7iTakzMHtglhivvNELbwOh4kKPledeSrhc 8gnOjz+Dv3Xrd2nTL2btwOfg19EN0GwV4fLqf6EqmzqFJV/XPVm1C2V+TSZET8Ry G5sNy4f5AgMBAAECggEAd5rFiV/EmXs4yVVzLEI7OG1S+oJQtmTdieFaZuzyqUfJ Sf+W/lekKb1ts7PpxD+gfiCVCt2oTk1EUu4MO7GxkNIUYF3Ba+tli3dQt0SaNxum FZhyKOQsV4ZT7WxTrFBM2XAlxsMie7M0xx6ZIUR6QTV56IxgMP1DbUOw8UKlqlV2 p3Vdckfjt2pWyLqM2yZUoC3+AjfqpJus/dpyIRGtLd8rLoFCrPgM2naEWxYCAeyI CpHgzYCCAbWyXZOkFOWIFPm53ZDbdZpupzKjS29rYGjiZ7St6sdCegGoZ+aYeUwA Bb1RKZjkBeLrxbuIZHlSbrBO12yE8gZ+VPzgSy1CVQKBgQDWHjj/7Yur/m+d9yJ0 9S14TK5KX3EX2cl46It8FMJEKTk1IhgYB6Dmk10pDrV2glJ3zLfwYeu82p9Zgswh F34mU3o67medJ3OJP+/qHYvEm4WOKw1973v8GEQhqTvr7yPYVC/cRoyN49FKbKfC sF7Scw7EaTObxtWMDJyaa+JDPwKBgQDIE3DhYzx1YahEHktYgVw9OaDdykzYZV2J KO8rkAwS0oXY6yi2J1nCrq3N5Ro7PAMCESRabgAps7n2GazLNfrtG/DcH87M0kYz AEwo1DvI3XVIAjiPmZXBeU2xp1o40OOxZXeHP3VzuU2ydyR6yp3Y2WCClmgf3Vuz O1uGk2A+xwKBgCZzbPcAuJldarvqWoS4Vr8Ivi/a7dtDn/uXfxz8OVq2MHDLO5pt HEbr5cnuu0WZ56dd2xZO71+Nvxn69B9pMZ0+Vm/oyjCdmhDmq3XWcngPGa/LKXQZ IqHF1c5ZrsoSutQpYiLjhHAinj4IPyQmOhD+2oMJBVyPG2A4D5Nnlk1PAoGBAIXH ognC3hEqzGVH0F+Ml82EdBD5DOsA1Es7KLj7J2eKht7lVqJ9q2ImhKaQkzqaRPSj 26fvt4Iq36QzxLtYC8FxllrJlfCUhUXi5AnE53jGw33zpjg2nNDyOEYavZQR8L2U OBkiEHnhpJc5XRYR1vvBVevbgCIWVBODFA7nCkrPAoGAK2oIQ5SLu5OfAB4qcN6v vHERc8JXGZWL/o2Z/4t0OX1X6NwDdAl87LCyQ6ab3dqmgemtjdd2Z9DDn2m9oPtO yuNvlxYNiCqgsNyUCwy6Q1yy1fOvhiUJF8rkq4UTSeQ8gSrf8hf3ajHmzhA1r5B7 Y5MUPUHIS6ckWMTF+pAXAgQ= -----END PRIVATE KEY-----";
openssl_pkey_get_public和openssl_pkey_get_private是PHP OpenSSL擴(kuò)展提供的兩個(gè)函數(shù)。
openssl_pkey_get_public函數(shù)用于獲取公鑰,它可以從一個(gè)證書(shū)文件或PEM格式的公鑰字符串中提取公鑰信息,并返回一個(gè)公鑰資源
$publicKeyResource = openssl_pkey_get_public($publicKeyString); $privateKeyResource = openssl_pkey_get_private($privateKeyString);
第3種;復(fù)制密鑰存儲(chǔ)為.pem文件后綴

$publicKeyString = file_get_contents('public.pem');
$privateKeyString = file_get_contents('private.pem');
$publicKeyResource = openssl_pkey_get_public($publicKeyString);
$privateKeyResource = openssl_pkey_get_private($privateKeyString);第三步、RSA加解密
RSA加密
公鑰加密 openssl_public_encrypt => 私鑰解密 openssl_private_decrypt
私鑰加密 openssl_private_encrypt => 公鑰解密 openssl_public_decrypt
1. 公鑰加密、私鑰解密:
- 使用公鑰加密數(shù)據(jù):發(fā)送方使用接收方的公鑰對(duì)數(shù)據(jù)進(jìn)行加密。
- 使用私鑰解密數(shù)據(jù):只有擁有相應(yīng)私鑰的接收方才能使用私鑰解密并獲取原始數(shù)據(jù)。
2. 私鑰加密、公鑰解密:
- 使用私鑰加密數(shù)據(jù):發(fā)送方使用自己的私鑰對(duì)數(shù)據(jù)進(jìn)行加密。
- 使用公鑰解密數(shù)據(jù):接收方使用發(fā)送方的公鑰來(lái)解密并獲取原始數(shù)據(jù)。
<?php // 待加密的數(shù)據(jù) $data = "Hello, RSA!"; // 使用公鑰加密數(shù)據(jù) openssl_public_encrypt($data, $encryptedWithPublicKey, $publicKey); // 使用私鑰解密數(shù)據(jù) openssl_private_decrypt($encryptedWithPublicKey, $decryptedWithPrivateKey, $privateKey); // 使用私鑰加密數(shù)據(jù) openssl_private_encrypt($data, $encryptedWithPrivateKey, $privateKey); // 使用公鑰解密數(shù)據(jù) openssl_public_decrypt($encryptedWithPrivateKey, $decryptedWithPublicKey, $publicKey); // 輸出結(jié)果 echo "原始數(shù)據(jù): " . $data . "\n"; echo "公鑰加密,私鑰解密結(jié)果: " . $decryptedWithPrivateKey . "\n"; echo "私鑰加密,公鑰解密結(jié)果: " . $decryptedWithPublicKey . "\n"; ?>
第四步、RSA簽名以及驗(yàn)證簽名
/**
* 構(gòu)造簽名
* @param string $dataString 被簽名數(shù)據(jù)
* @return string
*/
public function sign($dataString)
{
$signature = false;
openssl_sign($dataString, $signature, $privKey);
return base64_encode($signature);
}
/**
* 驗(yàn)證簽名
* @param string $dataString 被簽名數(shù)據(jù)
* @param string $signString 已經(jīng)簽名的字符串
* @return number 1簽名正確 0簽名錯(cuò)誤
*/
public function verify($dataString, $signString)
{
$signature = base64_decode($signString);
$flg = openssl_verify($dataString, $signature, $PubKey);
return $flg;
}第五步、封裝完整代碼

<?php
class RSA{
protected $publicKey;
protected $privateKey;
//$type 1長(zhǎng)類(lèi)型 2完整key 3文件內(nèi)完整key
public function __construct($publicKey = '', $privateKey = '', $type=1){
$this->setKey($publicKey, $privateKey, $type);
}
public function setKey($publicKey = null, $privateKey = null, $type=1)
{
if (!is_null($publicKey)) {
$this->setupPubKey($publicKey, $type);
}
if (!is_null($privateKey)) {
$this->setupPrivKey($privateKey, $type);
}
}
private function setupPrivKey($privateKey, $type)
{
if (is_resource($this->privateKey)) {
return true;
}
if ($type == 1) {
$pem = chunk_split($privateKey, 64, "\n");
$pem = "-----BEGIN PRIVATE KEY-----\n" . $pem . "-----END PRIVATE KEY-----\n";
$this->privateKey = openssl_pkey_get_private($pem);
} elseif ($type == 2) {
$this->privateKey = openssl_pkey_get_private($privateKey);
} elseif ($type == 3) {
$privateKeyString = file_get_contents($privateKey);
$this->privateKey= openssl_pkey_get_private($privateKeyString);
}
return true;
}
private function setupPubKey($publicKey, $type=1)
{
if (is_resource($this->publicKey)) {
return true;
}
if ($type == 1) {
$pem = chunk_split($publicKey, 64, "\n");
$pem = "-----BEGIN PUBLIC KEY-----\n" . $pem . "-----END PUBLIC KEY-----\n";
$this->publicKey = openssl_pkey_get_public($pem);
} elseif ($type == 2) {
$this->publicKey= openssl_pkey_get_public($publicKey);
} elseif ($type == 3) {
$pubString = file_get_contents($publicKey);
$this->publicKey= openssl_pkey_get_public($pubString);
}
return true;
}
public function privEncrypt($data)
{
if (!is_string($data) || empty($this->privateKey)) {
return null;
}
$r = openssl_private_encrypt($data, $encrypted, $this->privateKey);
if ($r === true) {
return base64_encode($encrypted);
}
return null;
}
public function privDecrypt($encrypted)
{
if (!is_string($encrypted) || empty($this->privateKey)) {
return null;
}
$encrypted = base64_decode($encrypted);
$r = openssl_private_decrypt($encrypted, $decrypted, $this->privateKey);
if ($r === true) {
return $decrypted;
}
return null;
}
public function pubEncrypt($data)
{
if (!is_string($data) || empty($this->publicKey)) {
return null;
}
$r = openssl_public_encrypt($data, $encrypted, $this->publicKey);
if ($r === true) {
return base64_encode($encrypted);
}
return null;
}
public function pubDecrypt($crypted)
{
if (!is_string($crypted) || empty($this->publicKey)) {
return null;
}
$crypted = base64_decode($crypted);
$r = openssl_public_decrypt($crypted, $decrypted, $this->publicKey);
if ($r === true) {
return $decrypted;
}
return null;
}
/**
* 構(gòu)造簽名
* @param string $dataString 被簽名數(shù)據(jù)
* @return string
*/
public function sign($dataString)
{
$signature = false;
openssl_sign($dataString, $signature, $this->privateKey);
return base64_encode($signature);
}
/**
* 驗(yàn)證簽名
* @param string $dataString 被簽名數(shù)據(jù)
* @param string $signString 已經(jīng)簽名的字符串
* @return number 1簽名正確 0簽名錯(cuò)誤
*/
public function verify($dataString, $signString)
{
$signature = base64_decode($signString);
$flg = openssl_verify($dataString, $signature, $this->publicKey);
return $flg;
}
public function __destruct()
{
is_resource($this->privateKey) && @openssl_free_key($this->privateKey);
is_resource($this->publicKey) && @openssl_free_key($this->publicKey);
}
}
/*$publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKZ1mKTymRoGKnHiP1xAy4aiyt5r0BscCZnDAonCrMFZ4kBGriPNHxEaLr5lfBnMKw7k6i+2dsFPSEZooTvqtPUCAwEAAQ==';
$privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEApnWYpPKZGgYqceI/XEDLhqLK3mvQGxwJmcMCicKswVniQEauI80fERouvmV8GcwrDuTqL7Z2wU9IRmihO+q09QIDAQABAkBunx3nGHXYjppsfn++7iyTd+I7+Agfy/0xWyB3rpEiGGgfemjcRFaeq5SC2vUNXsrEOY5gbUSQmFxH//Cym18NAiEA1z1cZx/Q9cbIjFPwp1a+K5CVFDXDcfbi/AQgAkVs0/cCIQDF+2fr23AoBslcOC4S0yAx94AbgxCntYuRqztxybsrcwIgMW86ZcT87TX2oaQ1xXk6vC68zqN6fBZEE7Wu1Fa1pAkCIElmOJP3qfAc/AAlj+dIwLHlqWgJwl3674CU9Bfui2bDAiEA0CKJpF8x7KANCcopEQC93PsbIztuML322LOfDV1Lw/k=';
$rsa = new RSA($publicKey, $privateKey, 1);*/
$publicKeyString = "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp1ffL+kUEedBLTzQrKU+
8oq9IZSUroxhmnWrXa1XMGtlbeVCHQNljujqwGuLELyk7i78cGczwCyGE2SVj9oI
tBzGn02fWZNCb3bHPv6ofliTvqYcZOFaFTWB+tTKuOmopCk/bgQVe7HC6+74s/3x
Q4tM1jVbNPYSY11++DLjEQ8KaA3pNJwoFTxER3GVEgmfhi5xUTTaBa5ZOIaNfsFr
0fGzvGbmRpqoIor6MlSxXbMO4k2pMzB7YJYYr7zRC28DoeJCj5XnXkq4XPIJzo8/
g79163dp0y9m7cDn4NfRDdBsFeHy6n+hKps6hSVf1z1ZtQtlfk0mRE/EchubDcuH
+QIDAQAB
-----END PUBLIC KEY-----";
$privateKeyString = "-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCnV98v6RQR50Et
PNCspT7yir0hlJSujGGadatdrVcwa2Vt5UIdA2WO6OrAa4sQvKTuLvxwZzPALIYT
ZJWP2gi0HMafTZ9Zk0Jvdsc+/qh+WJO+phxk4VoVNYH61Mq46aikKT9uBBV7scLr
7viz/fFDi0zWNVs09hJjXX74MuMRDwpoDek0nCgVPERHcZUSCZ+GLnFRNNoFrlk4
ho1+wWvR8bO8ZuZGmqgiivoyVLFdsw7iTakzMHtglhivvNELbwOh4kKPledeSrhc
8gnOjz+Dv3Xrd2nTL2btwOfg19EN0GwV4fLqf6EqmzqFJV/XPVm1C2V+TSZET8Ry
G5sNy4f5AgMBAAECggEAd5rFiV/EmXs4yVVzLEI7OG1S+oJQtmTdieFaZuzyqUfJ
Sf+W/lekKb1ts7PpxD+gfiCVCt2oTk1EUu4MO7GxkNIUYF3Ba+tli3dQt0SaNxum
FZhyKOQsV4ZT7WxTrFBM2XAlxsMie7M0xx6ZIUR6QTV56IxgMP1DbUOw8UKlqlV2
p3Vdckfjt2pWyLqM2yZUoC3+AjfqpJus/dpyIRGtLd8rLoFCrPgM2naEWxYCAeyI
CpHgzYCCAbWyXZOkFOWIFPm53ZDbdZpupzKjS29rYGjiZ7St6sdCegGoZ+aYeUwA
Bb1RKZjkBeLrxbuIZHlSbrBO12yE8gZ+VPzgSy1CVQKBgQDWHjj/7Yur/m+d9yJ0
9S14TK5KX3EX2cl46It8FMJEKTk1IhgYB6Dmk10pDrV2glJ3zLfwYeu82p9Zgswh
F34mU3o67medJ3OJP+/qHYvEm4WOKw1973v8GEQhqTvr7yPYVC/cRoyN49FKbKfC
sF7Scw7EaTObxtWMDJyaa+JDPwKBgQDIE3DhYzx1YahEHktYgVw9OaDdykzYZV2J
KO8rkAwS0oXY6yi2J1nCrq3N5Ro7PAMCESRabgAps7n2GazLNfrtG/DcH87M0kYz
AEwo1DvI3XVIAjiPmZXBeU2xp1o40OOxZXeHP3VzuU2ydyR6yp3Y2WCClmgf3Vuz
O1uGk2A+xwKBgCZzbPcAuJldarvqWoS4Vr8Ivi/a7dtDn/uXfxz8OVq2MHDLO5pt
HEbr5cnuu0WZ56dd2xZO71+Nvxn69B9pMZ0+Vm/oyjCdmhDmq3XWcngPGa/LKXQZ
IqHF1c5ZrsoSutQpYiLjhHAinj4IPyQmOhD+2oMJBVyPG2A4D5Nnlk1PAoGBAIXH
ognC3hEqzGVH0F+Ml82EdBD5DOsA1Es7KLj7J2eKht7lVqJ9q2ImhKaQkzqaRPSj
26fvt4Iq36QzxLtYC8FxllrJlfCUhUXi5AnE53jGw33zpjg2nNDyOEYavZQR8L2U
OBkiEHnhpJc5XRYR1vvBVevbgCIWVBODFA7nCkrPAoGAK2oIQ5SLu5OfAB4qcN6v
vHERc8JXGZWL/o2Z/4t0OX1X6NwDdAl87LCyQ6ab3dqmgemtjdd2Z9DDn2m9oPtO
yuNvlxYNiCqgsNyUCwy6Q1yy1fOvhiUJF8rkq4UTSeQ8gSrf8hf3ajHmzhA1r5B7
Y5MUPUHIS6ckWMTF+pAXAgQ=
-----END PRIVATE KEY-----";
//$rsa = new RSA($publicKeyString, $privateKeyString, 2);
$rsa = new RSA("public.pem", "private.pem", 3);
echo "私鑰加密 公鑰解密";
echo "<br/>";
$s = $rsa->privEncrypt("abc");
echo $rsa->pubDecrypt($s);
echo "<br/>";
echo "公鑰加密,私鑰解密";
echo "<br/>";
$d = $rsa->pubEncrypt("dfg");
echo $rsa->privDecrypt($d);
echo "<br/>";
echo "簽名";
echo "<br/>";
$str="a=1&b=2";
$sign=$rsa->sign($str);
echo $sign;
$res6=$rsa->verify($str,$sign);
echo "<br/>";
echo "驗(yàn)證簽結(jié)果:".$res6;
以上就是PHP三種方式讀取RSA密鑰加解密、簽名驗(yàn)簽完整教程的詳細(xì)內(nèi)容,更多關(guān)于PHP RSA密鑰的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
php中將網(wǎng)址轉(zhuǎn)換為超鏈接的函數(shù)
php中將網(wǎng)址轉(zhuǎn)換為超鏈接的函數(shù),需要的朋友可以參考下。2011-09-09
php中選擇什么接口(mysql、mysqli)訪問(wèn)mysql
我們知道,mysqli是PHP 5中新提供的MySQL接口,此接口使用了面向?qū)ο蟮乃枷?。使用mysqli接口的代碼可讀性更強(qiáng),其執(zhí)行效率比mysql接口高2013-02-02
PHP圖像處理之使用imagecolorallocate()函數(shù)設(shè)置顏色例子
這篇文章主要介紹了PHP圖像處理之使用imagecolorallocate()函數(shù)設(shè)置顏色例子,本文給出了十進(jìn)制和十六進(jìn)制2種設(shè)置顏色的方法,需要的朋友可以參考下2014-11-11
php數(shù)據(jù)庫(kù)備份還原類(lèi)分享
這篇文章主要介紹了php數(shù)據(jù)庫(kù)備份還原類(lèi),需要的朋友可以參考下2014-03-03
PHP基于phpqrcode類(lèi)生成二維碼的方法示例詳解
這篇文章主要介紹了PHP基于phpqrcode類(lèi)生成二維碼的方法詳解,文章通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08

