Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie asymmetrische Verschlüsselung in PHP

So implementieren Sie asymmetrische Verschlüsselung in PHP

藏色散人
藏色散人Original
2020-08-29 09:35:531645Durchsuche

So implementieren Sie die asymmetrische Verschlüsselung in PHP: Erstellen Sie zunächst eine PHP-Beispieldatei. Verwenden Sie dann OpenSSL, um die asymmetrische Verschlüsselung zu implementieren.

So implementieren Sie asymmetrische Verschlüsselung in PHP

Empfohlen: „PHP-Video-Tutorial

PHP implementiert asymmetrische Verschlüsselung


Was asymmetrische Verschlüsselung ist, ich werde es hier nicht sagen, sondern einfach googeln. Was hier erklärt wird, ist, dass ich kürzlich an einem externen Aufladeverschlüsselungsdienst gearbeitet habe. Bei der Verschlüsselungsverarbeitung bin ich dabei auf ein paar kleine Probleme gestoßen, die ich also notiert habe, damit ich es beim nächsten Mal bequem überprüfen kann.

Detaillierter Code

<?php
/**
 * 使用openssl实现非对称加密
 * 
 * @since 2015-11-10
 */
class Rsa
{
    /**
     * 私钥
     * 
     */
    private $_privKey;
    /**
     * 公钥
     * 
     */
    private $_pubKey;
    /**
     * 保存文件地址
     */
    private $_keyPath;
    /**
     * 指定密钥文件地址
     * 
     */
    public function __construct($path)
    {
        if (empty($path) || !is_dir($path)) {
            throw new Exception(&#39;请指定密钥文件地址目录&#39;);
        }
        $this->_keyPath = $path;
    }
    /**
     * 创建公钥和私钥
     * 
     */
    public function createKey()
    {
        $config = [
            "config" => &#39;D:\wamp\bin\apache\apache2.4.9\conf\openssl.cnf&#39;,
            "digest_alg" => "sha512",
            "private_key_bits" => 4096,
            "private_key_type" => OPENSSL_KEYTYPE_RSA,
        ];
        // 生成私钥
        $rsa = openssl_pkey_new($config);
        openssl_pkey_export($rsa, $privKey, NULL, $config);
        file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . &#39;priv.key&#39;, $privKey);
        $this->_privKey = openssl_pkey_get_public($privKey);
        // 生成公钥
        $rsaPri = openssl_pkey_get_details($rsa);
        $pubKey = $rsaPri[&#39;key&#39;];
        file_put_contents($this->_keyPath . DIRECTORY_SEPARATOR . &#39;pub.key&#39;, $pubKey);
        $this->_pubKey = openssl_pkey_get_public($pubKey);
    }
    /**
     * 设置私钥
     * 
     */
    public function setupPrivKey()
    {
        if (is_resource($this->_privKey)) {
            return true;
        }
        $file = $this->_keyPath . DIRECTORY_SEPARATOR . &#39;priv.key&#39;;
        $privKey = file_get_contents($file);
        $this->_privKey = openssl_pkey_get_private($privKey);
        return true;
    }
    /**
     * 设置公钥
     * 
     */
    public function setupPubKey()
    {
        if (is_resource($this->_pubKey)) {
            return true;
        }
        $file = $this->_keyPath . DIRECTORY_SEPARATOR . &#39;pub.key&#39;;
        $pubKey = file_get_contents($file);
        $this->_pubKey = openssl_pkey_get_public($pubKey);
        return true;
    }
    /**
     * 用私钥加密
     * 
     */
    public function privEncrypt($data)
    {
        if (!is_string($data)) {
            return null;
        }
        $this->setupPrivKey();
        $result = openssl_private_encrypt($data, $encrypted, $this->_privKey);
        if ($result) {
            return base64_encode($encrypted);
        }
        return null;
    }
    /**
     * 私钥解密
     * 
     */
    public function privDecrypt($encrypted)
    {
        if (!is_string($encrypted)) {
            return null;
        }
        $this->setupPrivKey();
        $encrypted = base64_decode($encrypted);
        $result = openssl_private_decrypt($encrypted, $decrypted, $this->_privKey);
        if ($result) {
            return $decrypted;
        }
        return null;
    }
    /**
     * 公钥加密
     * 
     */
    public function pubEncrypt($data)
    {
        if (!is_string($data)) {
            return null;
        }
        $this->setupPubKey();
        $result = openssl_public_encrypt($data, $encrypted, $this->_pubKey);
        if ($result) {
            return base64_encode($encrypted);
        }
        return null;
    }
    /**
     * 公钥解密
     * 
     */
    public function pubDecrypt($crypted)
    {
        if (!is_string($crypted)) {
            return null;
        }
        $this->setupPubKey();
        $crypted = base64_decode($crypted);
        $result = openssl_public_decrypt($crypted, $decrypted, $this->_pubKey);
        if ($result) {
            return $decrypted;
        }
        return null;
    }
    /**
     * __destruct
     * 
     */
    public function __destruct() {
        @fclose($this->_privKey);
        @fclose($this->_pubKey);
    }
}
?>

Test

$rsa = new Rsa(&#39;ssl-key&#39;);
//私钥加密,公钥解密
echo "待加密数据:segmentfault.com\n";
$pre = $rsa->privEncrypt("segmentfault.com");
echo "加密后的密文:\n" . $pre . "\n";
$pud = $rsa->pubDecrypt($pre);
echo "解密后数据:" . $pud . "\n";
//公钥加密,私钥解密
echo "待加密数据:segmentfault.com\n";
$pue = $rsa->pubEncrypt("segmentfault.com");
echo "加密后的密文:\n" . $pue . "\n";
$prd = $rsa->privDecrypt($pue);
echo "解密后数据:" . $prd;

Wichtige Fragen

Hier sollte besonders darauf geachtet werden, die Dateiadresse von openssl.cnf in der Konfiguration anzugeben oder einfach die globale Variable OPENSSL_CONF festzulegen.

Das obige ist der detaillierte Inhalt vonSo implementieren Sie asymmetrische Verschlüsselung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn