Maison >développement back-end >tutoriel php >Explication détaillée du cryptage et du décryptage php

Explication détaillée du cryptage et du décryptage php

小云云
小云云original
2018-05-11 15:26:426606parcourir

Je ne sais pas ce que vous savez sur le cryptage et le décryptage PHP. Cet article partage principalement avec vous des connaissances sur le cryptage et le décryptage PHP, dans l'espoir de vous aider.

Un chiffrement symétrique

1. Chiffrement symétrique de mycyrpt :

/** 
* @param $key  //数据加密密钥 由自己定义,长度有限制 string 
* @param $string  //需要进行加解密的字符串 string 
* @param $decrypt //加密还是解密 (最简单的,0代表加密,1代表解密) 
* @return string */
function encryptDecrypt($key, $string, $decrypt)
{   
 if(!$decrypt){        
 //加密        
 $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));        
 return $encrypted;    
 }else{       
 //解密        
 $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "12");        
 return $decrypted;    
 }

}//使用方法:echo encryptDecrypt('passwordgg', 'Hello欢迎您',0);  
//加密  
ZbKOQy8uarg6nsIrpjZnJvaIDMuAAIBH3sjhBEqYujM=echo encryptDecrypt('passwordgg', 'ZbKOQy8uarg6nsIrpjZnJvaIDMuAAIBH3sjhBEqYujM=',1);  
//解密  
Hello欢迎您

Remarque : Cette méthode a été abandonnée depuis php7.1, et openssl_encrypt et openssl_decrypt , la recommandation officielle est d'utiliser la famille openssl pour le cryptage et le déchiffrement

2. Cryptage symétrique dans l'extension OpenSSL

/** 
* @param string $data 需要加解密的数据字符串 string
* @param int $yes 加密还是解密(1表示加密,0表示解密) 
* @param string $key 数据加密密钥 
* @param string $iv 初始化向量 //注:这里为了显示效果,暂时将iv存储到session中, 
* @param string $iv 实际应用中,应该将iv和加密后的字符串都存储在数据库 
* @param string $encryptMethod  
数据加密方式 100余种,可通过openssl_get_cipher_methods()函数获取, 
* @param string $encryptMethod  选择其中一种(如果选择cbc结尾的加密算法,
需要初始化向量iv,如本例) 
* @return string 
*/
function openssl_crypt($data='',$yes=1,$key='secret',$iv='',$encryptMethod='aes-256-cbc'){    
if($yes)
{        
$ivLength = openssl_cipher_iv_length($encryptMethod); //获取该加密算法iv应该具有的长度        
$iv = openssl_random_pseudo_bytes($ivLength, $isStrong); //生成iv(初始化向量)       
 if (false === $iv && false === $isStrong) 
 {            
 die('IV generate failed');        
 }        
//加密        
$encrypted = openssl_encrypt($data, $encryptMethod, $key, 0, $iv);        
$_SESSION['iv']=$iv; //将iv存到session中        
return $encrypted;    
}else{       
 //解密        
 $decrypted = openssl_decrypt($data, $encryptMethod, $key, 0, $iv);        
 return $decrypted;    
 }
}//使用方法
echo $a=openssl_crypt('我爱北京天安门 /我爱祖国',1,'passG506'); //加密 
LMcwSGlTFijXRdcPaccYoc08xgr7NydtZ+Wrhdv/145gF3/ayKQCJvRLmvhs5ec8echo "<br>";
echo openssl_crypt($a,0,&#39;passG506&#39;,$_SESSION[&#39;iv&#39;]); //解密 我爱北京天安门 /我爱祖国

Remarque : 1. Pourquoi iv est-il généré et quel est le rôle de iv

[

En regardant la liste des algorithmes de chiffrement renvoyée par openssl_get_cipher_methods(), il existe de nombreux noms avec le mot « CBC » au milieu. Ces algorithmes de chiffrement utilisent le même mode de chiffrement, qui. est le mode de chaînage de blocs de chiffrement (Cipher Block Chaining).

Dans l'algorithme de cryptage du mode CBC, le texte en clair sera divisé en plusieurs groupes et crypté en groupes. Le processus de chiffrement de chaque groupe dépend des données du groupe précédent : il doit être effectué en XOR avec les données du groupe précédent pour générer le texte chiffré de ce groupe. Alors sur qui s’appuie le premier groupe ? Cela dépend du IV, c'est pourquoi le IV est appelé vecteur d'initialisation. IV est l'abréviation du vecteur d'initialisation

IV doit être généré aléatoirement, donc le code utilise openssl_random_pseudo_bytes() pour générer IV. Cette fonction reçoit un int représentant la longueur du IV qui doit être généré.
La longueur IV varie en fonction des algorithmes de cryptage. La plupart des gens ne se souviennent pas des longueurs IV requises par tant d’algorithmes. Utilisez donc directement la fonction openssl_cipher_iv_length(). Cette fonction renvoie un int, indiquant la longueur IV requise par l'algorithme de chiffrement :

echo openssl_cipher_iv_length(&#39;AES-256-CBC&#39;); // 16
echo openssl_cipher_iv_length(&#39;BC-CBC&#39;); // 8
echo openssl_cipher_iv_length(&#39;AES-128-ECB&#39;); // 0

Par exemple, AES-256-CBC nécessite un 16 bits. IV, BC-CBC nécessite IV 8 bits, mais AES-128-ECB ne nécessite pas IV, donc 0 est renvoyé.

2. Problèmes auxquels il faut prêter attention lors de l'utilisation

Lors de l'exécution du cryptage et du déchiffrement, à l'exception du premier paramètre, les autres paramètres des deux fonctions doivent être différents. Ce n'est que s'ils sont identiques que le décryptage peut réussir. Enfin, lorsque vous utilisez un algorithme de chiffrement qui nécessite un IV, vous devez noter :
Le paramètre $iv doit être passé, sinon PHP lancera un avertissement
IV doit être généré aléatoirement (par exemple, en utilisant openssl_random_pseudo_bytes() ), Il ne peut pas être défini artificiellement
Le IV doit être régénéré pour chaque cryptage. Ne soyez pas paresseux et utilisez le même IV pour plusieurs cryptages
Le IV doit être enregistré avec le texte chiffré (sinon il ne pourra pas le faire). être déchiffré). Il peut être directement attaché au texte chiffré. Après la chaîne de texte, vous pouvez également l'enregistrer séparément

Si vous ne comprenez pas, vous pouvez vous référer au cryptage symétrique

Deux cryptages asymétriques

Le cryptage asymétrique couramment utilisé est l'algorithme RSA. Le cryptage et le décryptage asymétriques utilisent des clés différentes, dont l'une est publique en tant que clé publique et l'autre n'appartient qu'au propriétaire privé en tant que clé publique. clé privée.

Les informations chiffrées avec une clé privée ne peuvent être déchiffrées que par la clé publique, ou à l'inverse, les informations chiffrées avec une clé publique ne peuvent être déchiffrées que par la clé privée.

Avant le cryptage et le déchiffrement RSA, vous devez générer une paire de clés publiques et privées. Vous pouvez également utiliser l'outil de génération de clés RSA openssl fourni avec Linux pour obtenir une paire de clés publiques et privées. utilisez la fonction d'extension PHP openssl pour générer une paire de clés publiques et privées.

Veuillez vous référer à : Chiffrement asymétrique RSA

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

Si vous souhaitez bénéficier d'une vitesse de cryptage rapide mais que vous souhaitez également vous assurer que les données sont plus sécurisées que le cryptage symétrique, vous pouvez utiliser le cryptage hybride. (C'est-à-dire, effectuez un cryptage symétrique sur les données et un cryptage asymétrique sur la clé)

Lors du déchiffrement, utilisez d'abord le cryptage asymétrique pour obtenir la clé, puis utilisez la clé pour déchiffrer le texte chiffré afin d'obtenir le texte en clair.

Recommandations associées :

Comment PHP utilise des clés personnalisées pour crypter et déchiffrer les données

Fonctions MySQL sur le cryptage et le décryptage

Partage du processus de mise en œuvre du cryptage et du décryptage des chaînes PHP

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