翼度科技»论坛 编程开发 PHP 查看内容

PHP三种方式读取RSA密钥加解密、签名验签完整教程

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
第一步、生成公私钥

在线生成公钥私钥对,RSA公私钥生成-ME2在线工具
密钥长度

  • RSA 密钥通常有不同的长度,通常以位数来表示,如 1024 位、2048 位等。一般来说,密钥长度越长,加密强度越高,但同时也会增加加密和解密的计算复杂度。一般推荐使用 2048 位或更长的 RSA 密钥来确保较高的安全性。
密钥格式

  • OpenSSL 中的私钥通常采用 PEM 格式(Privacy-Enhanced Mail,即隐私增强邮件)存储。PEM 格式的密钥是经过 Base64 编码的文本字符串,通常以
    1. -----BEGIN PRIVATE KEY-----
    复制代码
    开头,以
    1. -----END PRIVATE KEY-----
    复制代码
    结尾。
  • 另外,私钥也可以存储在 PKCS#12 格式的证书文件中,通常以
    1. .p12
    复制代码
    1. .pfx
    复制代码
    结尾。这些文件通常包含私钥、公钥和证书链等信息。


第二步、三种方式读取RSA密钥


第1种:公私钥弄成一行,必须一行没有空格和换行
  1. $publicKey = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKZ1mKTymRoGKnHiP1xAy4aiyt5r0BscCZnDAonCrMFZ4kBGriPNHxEaLr5lfBnMKw7k6i+2dsFPSEZooTvqtPUCAwEAAQ==';
  2. $privateKey = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEApnWYpPKZGgYqceI/XEDLhqLK3mvQGxwJmcMCicKswVniQEauI80fERouvmV8GcwrDuTqL7Z2wU9IRmihO+q09QIDAQABAkBunx3nGHXYjppsfn++7iyTd+I7+Agfy/0xWyB3rpEiGGgfemjcRFaeq5SC2vUNXsrEOY5gbUSQmFxH//Cym18NAiEA1z1cZx/Q9cbIjFPwp1a+K5CVFDXDcfbi/AQgAkVs0/cCIQDF+2fr23AoBslcOC4S0yAx94AbgxCntYuRqztxybsrcwIgMW86ZcT87TX2oaQ1xXk6vC68zqN6fBZEE7Wu1Fa1pAkCIElmOJP3qfAc/AAlj+dIwLHlqWgJwl3674CU9Bfui2bDAiEA0CKJpF8x7KANCcopEQC93PsbIztuML322LOfDV1Lw/k=';
复制代码
转化能使用的密钥资源

  • 如果私钥不是资源类型,则将私钥进行处理,将其转换为 PEM 格式。这里使用
    1. chunk_split
    复制代码
    函数将私钥按照每行64个字符的长度进行分割,并在适当的位置插入换行符
    1. \n
    复制代码

  • 在拼接完整的 PEM 格式私钥之后,再使用
    1. openssl_pkey_get_private
    复制代码
    函数将 PEM 格式的私钥转换为 OpenSSL 的私钥资源
  1. $pem = chunk_split($privateKey, 64, "\n");
  2. $pem = "-----BEGIN PRIVATE KEY-----\n" . $pem. "-----END PRIVATE KEY-----\n";

  3. $pem2 = chunk_split($publicKey, 64, "\n");
  4. $pem2 = "-----BEGIN PUBLIC KEY-----\n" . $pem2 . "-----END PUBLIC KEY-----\n";
复制代码
第2种:直接复制生成公私钥
  1. $publicKeyString = "-----BEGIN PUBLIC KEY-----
  2. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp1ffL+kUEedBLTzQrKU+
  3. 8oq9IZSUroxhmnWrXa1XMGtlbeVCHQNljujqwGuLELyk7i78cGczwCyGE2SVj9oI
  4. tBzGn02fWZNCb3bHPv6ofliTvqYcZOFaFTWB+tTKuOmopCk/bgQVe7HC6+74s/3x
  5. Q4tM1jVbNPYSY11++DLjEQ8KaA3pNJwoFTxER3GVEgmfhi5xUTTaBa5ZOIaNfsFr
  6. 0fGzvGbmRpqoIor6MlSxXbMO4k2pMzB7YJYYr7zRC28DoeJCj5XnXkq4XPIJzo8/
  7. g79163dp0y9m7cDn4NfRDdBsFeHy6n+hKps6hSVf1z1ZtQtlfk0mRE/EchubDcuH
  8. +QIDAQAB
  9. -----END PUBLIC KEY-----";

  10. $privateKeyString = "-----BEGIN PRIVATE KEY-----
  11. MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCnV98v6RQR50Et
  12. PNCspT7yir0hlJSujGGadatdrVcwa2Vt5UIdA2WO6OrAa4sQvKTuLvxwZzPALIYT
  13. ZJWP2gi0HMafTZ9Zk0Jvdsc+/qh+WJO+phxk4VoVNYH61Mq46aikKT9uBBV7scLr
  14. 7viz/fFDi0zWNVs09hJjXX74MuMRDwpoDek0nCgVPERHcZUSCZ+GLnFRNNoFrlk4
  15. ho1+wWvR8bO8ZuZGmqgiivoyVLFdsw7iTakzMHtglhivvNELbwOh4kKPledeSrhc
  16. 8gnOjz+Dv3Xrd2nTL2btwOfg19EN0GwV4fLqf6EqmzqFJV/XPVm1C2V+TSZET8Ry
  17. G5sNy4f5AgMBAAECggEAd5rFiV/EmXs4yVVzLEI7OG1S+oJQtmTdieFaZuzyqUfJ
  18. Sf+W/lekKb1ts7PpxD+gfiCVCt2oTk1EUu4MO7GxkNIUYF3Ba+tli3dQt0SaNxum
  19. FZhyKOQsV4ZT7WxTrFBM2XAlxsMie7M0xx6ZIUR6QTV56IxgMP1DbUOw8UKlqlV2
  20. p3Vdckfjt2pWyLqM2yZUoC3+AjfqpJus/dpyIRGtLd8rLoFCrPgM2naEWxYCAeyI
  21. CpHgzYCCAbWyXZOkFOWIFPm53ZDbdZpupzKjS29rYGjiZ7St6sdCegGoZ+aYeUwA
  22. Bb1RKZjkBeLrxbuIZHlSbrBO12yE8gZ+VPzgSy1CVQKBgQDWHjj/7Yur/m+d9yJ0
  23. 9S14TK5KX3EX2cl46It8FMJEKTk1IhgYB6Dmk10pDrV2glJ3zLfwYeu82p9Zgswh
  24. F34mU3o67medJ3OJP+/qHYvEm4WOKw1973v8GEQhqTvr7yPYVC/cRoyN49FKbKfC
  25. sF7Scw7EaTObxtWMDJyaa+JDPwKBgQDIE3DhYzx1YahEHktYgVw9OaDdykzYZV2J
  26. KO8rkAwS0oXY6yi2J1nCrq3N5Ro7PAMCESRabgAps7n2GazLNfrtG/DcH87M0kYz
  27. AEwo1DvI3XVIAjiPmZXBeU2xp1o40OOxZXeHP3VzuU2ydyR6yp3Y2WCClmgf3Vuz
  28. O1uGk2A+xwKBgCZzbPcAuJldarvqWoS4Vr8Ivi/a7dtDn/uXfxz8OVq2MHDLO5pt
  29. HEbr5cnuu0WZ56dd2xZO71+Nvxn69B9pMZ0+Vm/oyjCdmhDmq3XWcngPGa/LKXQZ
  30. IqHF1c5ZrsoSutQpYiLjhHAinj4IPyQmOhD+2oMJBVyPG2A4D5Nnlk1PAoGBAIXH
  31. ognC3hEqzGVH0F+Ml82EdBD5DOsA1Es7KLj7J2eKht7lVqJ9q2ImhKaQkzqaRPSj
  32. 26fvt4Iq36QzxLtYC8FxllrJlfCUhUXi5AnE53jGw33zpjg2nNDyOEYavZQR8L2U
  33. OBkiEHnhpJc5XRYR1vvBVevbgCIWVBODFA7nCkrPAoGAK2oIQ5SLu5OfAB4qcN6v
  34. vHERc8JXGZWL/o2Z/4t0OX1X6NwDdAl87LCyQ6ab3dqmgemtjdd2Z9DDn2m9oPtO
  35. yuNvlxYNiCqgsNyUCwy6Q1yy1fOvhiUJF8rkq4UTSeQ8gSrf8hf3ajHmzhA1r5B7
  36. Y5MUPUHIS6ckWMTF+pAXAgQ=
  37. -----END PRIVATE KEY-----";
复制代码
  1. openssl_pkey_get_public
复制代码
  1. openssl_pkey_get_private
复制代码
是PHP OpenSSL扩展提供的两个函数。
  1. openssl_pkey_get_public
复制代码
函数用于获取公钥,它可以从一个证书文件或PEM格式的公钥字符串中提取公钥信息,并返回一个公钥资源
  1. $publicKeyResource = openssl_pkey_get_public($publicKeyString);
  2. $privateKeyResource = openssl_pkey_get_private($privateKeyString);
复制代码
第3种;复制密钥存储为.pem文件后缀

  1. $publicKeyString = file_get_contents('public.pem');$privateKeyString = file_get_contents('private.pem'); $publicKeyResource = openssl_pkey_get_public($publicKeyString);
  2. $privateKeyResource = openssl_pkey_get_private($privateKeyString);
复制代码
第三步、RSA加解密

RSA加密
公钥加密
  1. openssl_public_encrypt
复制代码
=> 私钥解密
  1. openssl_private_decrypt
复制代码
私钥加密
  1. openssl_private_encrypt
复制代码
=> 公钥解密
  1. openssl_public_decrypt
复制代码
1. 公钥加密、私钥解密:
   - 使用公钥加密数据:发送方使用接收方的公钥对数据进行加密。
   - 使用私钥解密数据:只有拥有相应私钥的接收方才能使用私钥解密并获取原始数据。
2. 私钥加密、公钥解密:
   - 使用私钥加密数据:发送方使用自己的私钥对数据进行加密。
   - 使用公钥解密数据:接收方使用发送方的公钥来解密并获取原始数据。
  1. <?php



  2. // 待加密的数据
  3. $data = "Hello, RSA!";

  4. // 使用公钥加密数据
  5. openssl_public_encrypt($data, $encryptedWithPublicKey, $publicKey);

  6. // 使用私钥解密数据
  7. openssl_private_decrypt($encryptedWithPublicKey, $decryptedWithPrivateKey, $privateKey);

  8. // 使用私钥加密数据
  9. openssl_private_encrypt($data, $encryptedWithPrivateKey, $privateKey);

  10. // 使用公钥解密数据
  11. openssl_public_decrypt($encryptedWithPrivateKey, $decryptedWithPublicKey, $publicKey);

  12. // 输出结果
  13. echo "原始数据: " . $data . "\n";
  14. echo "公钥加密,私钥解密结果: " . $decryptedWithPrivateKey . "\n";
  15. echo "私钥加密,公钥解密结果: " . $decryptedWithPublicKey . "\n";
  16. ?>
复制代码
第四步、RSA签名以及验证签名

  1.     /**
  2.      * 构造签名
  3.      * @param string $dataString 被签名数据
  4.      * @return string
  5.      */
  6.     public function sign($dataString)
  7.     {
  8.       
  9.         $signature = false;
  10.         openssl_sign($dataString, $signature, $privKey);
  11.         return base64_encode($signature);
  12.     }

  13.     /**
  14.      * 验证签名
  15.      * @param string $dataString 被签名数据
  16.      * @param string $signString 已经签名的字符串
  17.      * @return number 1签名正确 0签名错误
  18.      */
  19.     public function verify($dataString, $signString)
  20.     {
  21.       
  22.         $signature = base64_decode($signString);
  23.         $flg = openssl_verify($dataString, $signature, $PubKey);
  24.         return $flg;
  25.      }
复制代码
第五步、封装完整代码

  1. <?phpclass  RSA{    protected $publicKey;    protected $privateKey;    //$type  1长类型 2完整key  3文件内完整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;    }    /**     * 构造签名     * @param string $dataString 被签名数据     * @return string     */    public function sign($dataString)    {        $signature = false;        openssl_sign($dataString, $signature, $this->privateKey);        return base64_encode($signature);    }     /**     * 验证签名     * @param string $dataString 被签名数据     * @param string $signString 已经签名的字符串     * @return number 1签名正确 0签名错误     */    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==';
  2. $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-----
  3. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp1ffL+kUEedBLTzQrKU+
  4. 8oq9IZSUroxhmnWrXa1XMGtlbeVCHQNljujqwGuLELyk7i78cGczwCyGE2SVj9oI
  5. tBzGn02fWZNCb3bHPv6ofliTvqYcZOFaFTWB+tTKuOmopCk/bgQVe7HC6+74s/3x
  6. Q4tM1jVbNPYSY11++DLjEQ8KaA3pNJwoFTxER3GVEgmfhi5xUTTaBa5ZOIaNfsFr
  7. 0fGzvGbmRpqoIor6MlSxXbMO4k2pMzB7YJYYr7zRC28DoeJCj5XnXkq4XPIJzo8/
  8. g79163dp0y9m7cDn4NfRDdBsFeHy6n+hKps6hSVf1z1ZtQtlfk0mRE/EchubDcuH
  9. +QIDAQAB
  10. -----END PUBLIC KEY-----";

  11. $privateKeyString = "-----BEGIN PRIVATE KEY-----
  12. MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCnV98v6RQR50Et
  13. PNCspT7yir0hlJSujGGadatdrVcwa2Vt5UIdA2WO6OrAa4sQvKTuLvxwZzPALIYT
  14. ZJWP2gi0HMafTZ9Zk0Jvdsc+/qh+WJO+phxk4VoVNYH61Mq46aikKT9uBBV7scLr
  15. 7viz/fFDi0zWNVs09hJjXX74MuMRDwpoDek0nCgVPERHcZUSCZ+GLnFRNNoFrlk4
  16. ho1+wWvR8bO8ZuZGmqgiivoyVLFdsw7iTakzMHtglhivvNELbwOh4kKPledeSrhc
  17. 8gnOjz+Dv3Xrd2nTL2btwOfg19EN0GwV4fLqf6EqmzqFJV/XPVm1C2V+TSZET8Ry
  18. G5sNy4f5AgMBAAECggEAd5rFiV/EmXs4yVVzLEI7OG1S+oJQtmTdieFaZuzyqUfJ
  19. Sf+W/lekKb1ts7PpxD+gfiCVCt2oTk1EUu4MO7GxkNIUYF3Ba+tli3dQt0SaNxum
  20. FZhyKOQsV4ZT7WxTrFBM2XAlxsMie7M0xx6ZIUR6QTV56IxgMP1DbUOw8UKlqlV2
  21. p3Vdckfjt2pWyLqM2yZUoC3+AjfqpJus/dpyIRGtLd8rLoFCrPgM2naEWxYCAeyI
  22. CpHgzYCCAbWyXZOkFOWIFPm53ZDbdZpupzKjS29rYGjiZ7St6sdCegGoZ+aYeUwA
  23. Bb1RKZjkBeLrxbuIZHlSbrBO12yE8gZ+VPzgSy1CVQKBgQDWHjj/7Yur/m+d9yJ0
  24. 9S14TK5KX3EX2cl46It8FMJEKTk1IhgYB6Dmk10pDrV2glJ3zLfwYeu82p9Zgswh
  25. F34mU3o67medJ3OJP+/qHYvEm4WOKw1973v8GEQhqTvr7yPYVC/cRoyN49FKbKfC
  26. sF7Scw7EaTObxtWMDJyaa+JDPwKBgQDIE3DhYzx1YahEHktYgVw9OaDdykzYZV2J
  27. KO8rkAwS0oXY6yi2J1nCrq3N5Ro7PAMCESRabgAps7n2GazLNfrtG/DcH87M0kYz
  28. AEwo1DvI3XVIAjiPmZXBeU2xp1o40OOxZXeHP3VzuU2ydyR6yp3Y2WCClmgf3Vuz
  29. O1uGk2A+xwKBgCZzbPcAuJldarvqWoS4Vr8Ivi/a7dtDn/uXfxz8OVq2MHDLO5pt
  30. HEbr5cnuu0WZ56dd2xZO71+Nvxn69B9pMZ0+Vm/oyjCdmhDmq3XWcngPGa/LKXQZ
  31. IqHF1c5ZrsoSutQpYiLjhHAinj4IPyQmOhD+2oMJBVyPG2A4D5Nnlk1PAoGBAIXH
  32. ognC3hEqzGVH0F+Ml82EdBD5DOsA1Es7KLj7J2eKht7lVqJ9q2ImhKaQkzqaRPSj
  33. 26fvt4Iq36QzxLtYC8FxllrJlfCUhUXi5AnE53jGw33zpjg2nNDyOEYavZQR8L2U
  34. OBkiEHnhpJc5XRYR1vvBVevbgCIWVBODFA7nCkrPAoGAK2oIQ5SLu5OfAB4qcN6v
  35. vHERc8JXGZWL/o2Z/4t0OX1X6NwDdAl87LCyQ6ab3dqmgemtjdd2Z9DDn2m9oPtO
  36. yuNvlxYNiCqgsNyUCwy6Q1yy1fOvhiUJF8rkq4UTSeQ8gSrf8hf3ajHmzhA1r5B7
  37. Y5MUPUHIS6ckWMTF+pAXAgQ=
  38. -----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 "验证签结果:".$res6;  
复制代码
以上就是PHP三种方式读取RSA密钥加解密、签名验签完整教程的详细内容,更多关于PHP RSA密钥的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/program/319043zsc.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具