шифрование и дешифрование php-rsa

PHP

1. Что такое шифрование RSA

RSA(Подробности см. в Википедии). Алгоритм является наиболее широко используемым криптографическим алгоритмом с открытым ключом на сегодняшний день, а также известен как самый безопасный алгоритм шифрования на планете.md5иsha1Иными словами, до сих пор было взломано только очень короткое шифрование RSA.
Итак, что такое алгоритм криптографии с открытым ключом?По способу использования ключа криптографию можно разделить на симметричную криптографию и криптографию с открытым ключом.Далее давайте кратко опишем их.
Симметричный шифр: шифрование и дешифрование с использованием одного и того же ключа, обычно используемые алгоритмыDESа такжеAES.
Криптография с открытым ключом: при шифровании и дешифровании используются разные криптографические методы, поэтому криптографию с открытым ключом часто называют асимметричной криптографией.RSA.

Поскольку в данной статье рассматриваетсяphpизRSAПримеры шифрования, которые здесь подробно описываться не будут, дляRSAДрузья, интересующиеся алгоритмом, могут просмотреть следующие статьи
«Взять вас, чтобы полностью понять принцип алгоритма RSA»
заphpДрузья, которые заинтересованы в дополнительных методах шифрования, могут просмотреть следующие статьи.
Технология шифрования данных PHP и управление безопасностью ключей

2. Сценарии использования

  • Написано для мобильных устройств (IOS, Android)APIинтерфейс

  • Связь с высокими требованиями безопасности, такими как оплата и проверка реальной информации

  • Передача важных данных другим третьим сторонам или партнерам

3. Сгенерируйте закрытый ключ и открытый ключ

теперь, когдаRSAявляется асимметричным шифрованием, то вы должны сначала сгенерировать требуемый закрытый ключ и открытый ключ дляubuntuНапример. Первая загрузка с открытым исходным кодомRSAинструмент генерации ключейopenssl(как правилоlinuxСистема идет в комплекте), если нет, то можно установить следующей командой

apt-get install openssl

когдаopensslПосле завершения установки мы можем начать генерировать закрытый ключ и открытый ключ. Сначала сгенерируйте оригиналRSAфайл закрытого ключа

openssl genrsa -out rsa_private_key.pem 1024

Примечание. Здесь генерируется ключ длиной 1024 бита, что составляет 128 байт при преобразовании в байты.

Во-вторых, оригиналRSAЗакрытый ключ преобразуется вpkcs8Формат

openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out private_key.pem

Наконец, сгенерируйтеRSAоткрытый ключ

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

Когда нам нужно его использовать, мы помещаем закрытый ключrsa_private_key.pemНа стороне сервера открытый ключ выдается стороне, которой необходимо общаться с нами, в зашифрованном виде.

Пример шифрования и расшифровки 4.php-rsa

Теперь мы можем использоватьphpпровестиRSAШифрование расшифровывается, но перед этим вы должны сначала посмотреть, установили ли вы его или включилиphpизopensslрасширение, может выводить через файлphpinfo()Или вывод через командную строкуphp -m | lessЧтобы узнать, установлено ли и включено ли это расширение, вы также можете передатьextension_loaded()функцию, чтобы определить, включено ли расширение, если нет, установите его с помощью этой команды (с помощьюubuntuпример):

apt-get install php7.0-openssl

Конечно, если выWindowsОперационная система, вы можете скачать соответствующую версиюphp_openssl.dll.

Ну а теперь давайте напишем серверную библиотеку классов php-RSA Работа этой библиотеки классов на самом деле очень проста, то есть инкапсулировать некоторыеphpпротивRSAФункция операции нам удобна для шифрования и расшифровки.

class Rsa
{
    private $_config = [
        'public_key' => '',
        'private_key' => '',
    ];

    public function __construct($private_key_filepath, $public_key_filepath) {
        $this->_config['private_key'] = $this->_getContents($private_key_filepath);
        $this->_config['public_key'] = $this->_getContents($public_key_filepath);
    }

    /**
     * @uses 获取文件内容
     * @param $file_path string
     * @return bool|string
     */
    private function _getContents($file_path) {
        file_exists($file_path) or die ('密钥或公钥的文件路径错误');
        return file_get_contents($file_path);
    }

    /**     
     * @uses 获取私钥
     * @return bool|resource     
     */ 
    private function _getPrivateKey() {
       $priv_key = $this->_config['private_key'];
       return openssl_pkey_get_private($priv_key);
    }

    /**     
     * @uses 获取公钥
     * @return bool|resource     
     */    
    private function _getPublicKey() {        
        $public_key = $this->_config['public_key'];
        return openssl_pkey_get_public($public_key);
    }

    /**     
     * @uses 私钥加密
     * @param string $data     
     * @return null|string     
     */    
    public function privEncrypt($data = '') {        
        if (!is_string($data)) {
            return null;       
        }
        return openssl_private_encrypt($data, $encrypted, $this->_getPrivateKey()) ? base64_encode($encrypted) : null;
    }

    /**     
     * @uses 公钥加密     
     * @param string $data     
     * @return null|string     
     */    
    public function publicEncrypt($data = '') {        
        if (!is_string($data)) {
            return null;        
        }        
        return openssl_public_encrypt($data, $encrypted, $this->_getPublicKey()) ? base64_encode($encrypted) : null;
    }

    /**     
     * @uses 私钥解密     
     * @param string $encrypted     
     * @return null     
     */    
    public function privDecrypt($encrypted = '') {        
        if (!is_string($encrypted)) {
            return null;        
        }
        return (openssl_private_decrypt(base64_decode($encrypted), $decrypted, $this->_getPrivateKey())) ? $decrypted : null;
    }    

    /**     
     * @uses 公钥解密     
     * @param string $encrypted     
     * @return null     
     */    
    public function publicDecrypt($encrypted = '') {        
        if (!is_string($encrypted)) {
            return null;        
        }        
           return (openssl_public_decrypt(base64_decode($encrypted), $decrypted, $this->_getPublicKey())) ? $decrypted : null;
    }
}

Хорошо, сейчас мы позвонимRsaкласс для шифрования и расшифровки данных

$private_key = 'private_key.pem'; // 私钥路径
$public_key = 'rsa_public_key.pem'; // 公钥路径
$rsa = new Rsa($private_key, $public_key);

$origin_data = '这是一条测试数据';

$ecryption_data = $rsa->privEncrypt($origin_data);

$decryption_data = $rsa->publicDecrypt($ecryption_data);

echo '私钥加密后的数据为:' . $ecryption_data;
echo PHP_EOL;
echo '公钥解密后的数据为: ' . $decryption_data;
echo PHP_EOL;

Наконец мы видим вывод:

Последнее, что следует отметить, это то, что как открытый ключ, так и закрытый ключ могут быть зашифрованы и расшифрованы. Среди них: Шифрование с открытым ключом требует дешифрования с закрытым ключом, что называется «шифрованием». Поскольку закрытый ключ не является открытым, обеспечивается конфиденциальность контента, а контент не может быть получен без закрытого ключа, шифрование закрытым ключом требует расшифровки открытым ключом, что называется «подписью». Поскольку открытый ключ является общедоступным, любой может расшифровать содержимое, но только с помощью открытого ключа издателя, подтверждая, что содержимое было отправлено издателем.