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;
Наконец мы видим вывод:
Последнее, что следует отметить, это то, что как открытый ключ, так и закрытый ключ могут быть зашифрованы и расшифрованы. Среди них: Шифрование с открытым ключом требует дешифрования с закрытым ключом, что называется «шифрованием». Поскольку закрытый ключ не является открытым, обеспечивается конфиденциальность контента, а контент не может быть получен без закрытого ключа, шифрование закрытым ключом требует расшифровки открытым ключом, что называется «подписью». Поскольку открытый ключ является общедоступным, любой может расшифровать содержимое, но только с помощью открытого ключа издателя, подтверждая, что содержимое было отправлено издателем.