Maison >développement back-end >Problème PHP >Comment implémenter le cryptage asymétrique en php

Comment implémenter le cryptage asymétrique en php

藏色散人
藏色散人original
2020-08-06 11:16:323335parcourir

Vous pouvez utiliser openssl pour réaliser un cryptage asymétrique en php. L'utilisation du cryptage asymétrique repose principalement sur la clé publique et la clé privée d'openssl, en utilisant le cryptage à clé publique et le déchiffrement à clé privée, ou le cryptage à clé privée et le déchiffrement à clé publique, Les algorithmes de chiffrement asymétriques simples nécessitent deux clés pour le chiffrement et le déchiffrement.

Comment implémenter le cryptage asymétrique en php

Recommandé : "Tutoriel vidéo PHP"

php utilise openssl pour réaliser un cryptage asymétrique

Expliquez d'abord ce qu'est le cryptage asymétrique :

Cryptage symétriqueAlgorithmeLa même clé secrète est utilisée pour le cryptage et le déchiffrement. L'algorithme de chiffrement asymétrique nécessite deux clés pour le cryptage et le déchiffrement. Ces deux clés secrètes sont la clé publique (clé publique, appelée clé publique en abrégé). clé privée (clé privée, appelée clé privée).




Processus de travail

Comme le montre l'image ci-dessus, un cryptage asymétrique est utilisé entre la partie A et la partie B pour compléter la transmission sécurisée des informations importantes.


1. La partie B génère une paire de clés (clé publique et clé privée) et divulgue la clé publique à d'autres parties. (L'autre partie est la partie de confiance)

2. La partie A qui obtient la clé publique utilise la clé pour crypter les informations confidentielles et les envoie ensuite à la partie B.

3. La partie B utilise ensuite une autre clé dédiée (clé privée) enregistrée par elle-même pour décrypter les informations cryptées. La partie B ne peut utiliser que sa clé privée (clé privée) pour décrypter les informations chiffrées par la clé publique correspondante.

Pendant le processus de transmission, même si l'attaquant intercepte le texte chiffré transmis et obtient la clé publique de B, il ne peut pas déchiffrer le texte chiffré car seule la clé privée de B peut déchiffrer le texte chiffré.

De même, si B veut répondre à des informations cryptées à A, alors A doit d'abord publier la clé publique de A à B pour le cryptage, et A lui-même enregistre la clé privée de A pour le déchiffrement.




Avantages et inconvénients

Le cryptage asymétrique offre une meilleure sécurité que le cryptage symétrique : dans les communications cryptées symétriquement, les deux parties utilisent la même clé secrète. Si la clé secrète de l'une des parties est divulguée, toute la communication sera craquée. Le chiffrement asymétrique utilise une paire de clés secrètes, une pour le chiffrement et une pour le déchiffrement. La clé publique est publique et la clé secrète est conservée par elle-même. Il n'est pas nécessaire de synchroniser la clé secrète avant la communication comme le chiffrement symétrique.

L'inconvénient du cryptage asymétrique est que le cryptage et le déchiffrement prennent beaucoup de temps et sont lents, et ne conviennent que pour crypter une petite quantité de données.

Les principaux algorithmes utilisés dans le chiffrement asymétrique sont : RSA, Elgamal, algorithme backpack, Rabin, D-H, ECC (algorithme de cryptographie à courbe elliptique), etc.

Différents algorithmes ont des mécanismes de mise en œuvre différents. Veuillez vous référer aux informations détaillées de l'algorithme correspondant.

L'utilisation du cryptage asymétrique repose principalement sur la clé publique et la clé privée d'openssl, en utilisant le cryptage à clé publique et le déchiffrement à clé privée, ou le cryptage à clé privée et le déchiffrement à clé publique.

1. Installez l'extension openssl d'openssl et php

2. Générer une clé privée : openssl genrsa est utilisé pour générer le fichier de clé privée rsa. La longueur de la clé privée et la protection par mot de passe peuvent être spécifiées lors. génération

openssl genrsa -out rsa_private_key.pem 1024

3. Générer une clé publique : la commande rsa est utilisée pour traiter les clés RSA, formater la conversion et imprimer les informations

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

4.

<?php
/**
 * 使用私钥加密,公钥解密
 * 密钥文件的路径
 */
$privateKeyFilePath = &#39;rsa_private_key.pem&#39;;
/**
 * 公钥文件的路径
 */
$publicKeyFilePath = &#39;rsa_public_key.pem&#39;;
extension_loaded(&#39;openssl&#39;) or die(&#39;php需要openssl扩展支持&#39;);
(file_exists($privateKeyFilePath) && file_exists($publicKeyFilePath)) or die(&#39;密钥或者公钥的文件路径不正确&#39;);
/**
 * 生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private(获取私钥)函数返回false
 */
$privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath));
/**
 * 生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public(获取公钥)函数返回false
 */
$publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));
($privateKey && $publicKey) or die(&#39;密钥或者公钥不可用&#39;);
/**
 * 原数据
 */
$originalData = &#39;啦啦啦&#39;;
/**
 * 加密以后的数据,
 */
$encryptData = &#39;&#39;;
//echo &#39;原数据为:&#39;, $originalData, PHP_EOL;
//openssl_private_encrypt — 使用私钥加密数据
//openssl_private_encrypt() 使用私钥 key 加密数据 data 并且将结果保存至变量 crypted中。
//加密后的数据可以通过openssl_public_decrypt()函数来解密。
if (openssl_private_encrypt($originalData, $encryptData, $privateKey)) {
    /**
     * 加密后 可以base64_encode后方便在网址中传输 或者打印  否则打印为乱码
     * PHP_EOL就是其中的一个,代表php的换行符,这个变量会根据平台而变,在windows下会是/r/n,在linux下是/n,在mac下是/r
     */
    echo &#39;加密成功,加密后数据(base64_encode后)为:&#39;, base64_encode($encryptData), PHP_EOL;
} else {
    die(&#39;加密失败&#39;);
}

5. Maintenant que nous avons terminé le cryptage, comment devons-nous le déchiffrer à ce moment-là ? Parce qu'il s'agit d'un cryptage à clé privée et d'un déchiffrement à clé publique,

donc tant que nous savons quelle est notre clé publique, nous pouvons utiliser le texte chiffré généré pour décrypter : (j'ai annoté les connaissances pertinentes en matière de décryptage sur le code, pour faciliter la compréhension de chacun)

/**
 * 解密以后的数据
 * openssl_public_decrypt使用公钥解密数据
 */
$publicKeyFilePath = &#39;rsa_public_key.pem&#39;;//生成的公钥文件
//openssl_pkey_get_public使用公钥解密
$publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));
//print_r($publicKey);exit;
($publicKey) or die(&#39;密钥或者公钥不可用&#39;);
//下面是我即将进行解密的密文
$encryptData=&#39;ldFrMgl9qLWbPEQDt8DMCfzq4WAR2eEfZFmjyE8XUh/+SmkzoDhhOitIr++5muxj8klCqH0KCQqUV6RLRW34z5R5SbYCy82hdIMLjmPqx32LKg2e8iRuR7HreC6rW0CGxaeUlrSDz9M72c/GKjnQLlg66Tsjp0XtwT6PTPXH9ws=&#39;;
//因为我们加密后数据展示的是base64_encode后(上一行),
//所以我们应该还原为原来的密文,如果直接将原本的密文copy过来解密的话也许会导致部分的密文丢失,进一步解密失败;
$encryptData=base64_decode($encryptData);
$decryptData =&#39;&#39;;
if (openssl_public_decrypt($encryptData, $decryptData, $publicKey)) {
    echo &#39;解密成功,解密后数据为:&#39;, $decryptData, PHP_EOL;
} else {
    die(&#39;解密失败&#39;);
}

S'il y a quelque chose qui ne va pas, veuillez le signaler, j'espère que cela sera utile à tout le monde.


Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn