Maison  >  Article  >  développement back-end  >  Explication détaillée de la fonction de chiffrement symétrique PHP pour implémenter le chiffrement et le déchiffrement des données

Explication détaillée de la fonction de chiffrement symétrique PHP pour implémenter le chiffrement et le déchiffrement des données

墨辰丷
墨辰丷original
2018-05-31 10:05:322432parcourir

Cet article présente en détail une fonction de chiffrement symétrique simple en PHP pour implémenter le chiffrement et le déchiffrement des données. Il présente également en détail le chiffrement symétrique et le chiffrement asymétrique. Vous pouvez en savoir plus si vous en avez besoin.

Il y a un endroit dans le projet où la nécessité de crypter l'identifiant de l'utilisateur et de le transmettre au prochain point de contact pour le décryptage est utilisée. (Pardonnez-moi de ne pas trop en révéler -_- !) La première chose qui m'est venue à l'esprit était une fonction dans Kangsheng Ucenter. Plus tard, j'ai cherché et trouvé une méthode simple dans Concise Magic, je l'ai donc intégrée pour former une fonction que vous utilisez.

1. Cryptage symétrique

L'expéditeur utilise la clé et l'algorithme pour traiter le texte brut en texte chiffré et l'envoie, et le destinataire utilise la clé et l'algorithme pour traiter le texte chiffré en texte brut, l'expéditeur et le destinataire utilisent la même clé pour chiffrer et déchiffrer les données.

Étant donné que la même clé est utilisée pour le cryptage et le déchiffrement, la sécurité n'est pas seulement liée à l'algorithme, mais la sécurité de la clé est également très importante.

Bien sûr, plus la clé est complexe, mieux c'est. Au contraire, la clé est généralement plus petite, car même si plus la clé est grande, plus le cryptage est fort, mais plus le cryptage est lent. processus de décryptage, la taille de la clé est donc à la fois sécuritaire et efficace.

Après tout, les caractéristiques de l'algorithme de cryptage symétrique sont que l'algorithme est public, la quantité de calcul est faible, la vitesse de cryptage est rapide et l'efficacité du cryptage est élevée, sans l'avantage d'une efficacité élevée. il est préférable d'utiliser directement le cryptage asymétrique.

De plus, chaque fois qu'une paire d'utilisateurs utilise un algorithme de cryptage symétrique, ils doivent utiliser une clé unique inconnue de l'autre personne. Cela entraînera une augmentation du nombre de clés détenues par les expéditeurs et les destinataires. augmentent de façon exponentielle. La gestion devient un fardeau pour les utilisateurs.

Les algorithmes de chiffrement symétriques sont difficiles à utiliser sur les systèmes de réseaux distribués, principalement parce que la gestion des clés est difficile et que le coût d'utilisation est élevé.

2. Le cryptage asymétrique

Le cryptage asymétrique est relativement plus sûr Il utilise une paire de clés, une clé publique et une clé privée, utilisées respectivement pour le cryptage et le déchiffrement. . La clé privée ne peut être conservée en toute sécurité que par une seule partie et ne peut être divulguée, tandis que la clé publique peut être envoyée à toute personne qui en fait la demande.

Le cryptage asymétrique le plus courant devrait concerner les systèmes bancaires et les plateformes de paiement. Par exemple, lorsque nous demandons une interface de paiement Alipay ou UnionPay, nous obtiendrons une clé publique. Lors d'un paiement dans le centre commercial, nous utilisons la clé publique pour crypter les informations et les soumettre à la plateforme. pour décrypter vos informations et effectuer des opérations de paiement.

Bien que le cryptage asymétrique soit très sécurisé, il est très lent par rapport au cryptage symétrique. Par conséquent, lorsque nous y traitons généralement, la plupart d'entre nous utilisent le cryptage symétrique pour transmettre des messages, mais la clé utilisée dans le cryptage symétrique est nous. Il peut être envoyé via un cryptage asymétrique. Pensez à l'interface de paiement pour laquelle vous avez demandé. Vous a-t-elle donné une paire de clés ? ^.^

3. Utilisez-le en combinaison avec

Le cryptage symétrique est rapide et meilleur lors de l'envoi de grandes quantités de données. Le chiffrement et le déchiffrement asymétriques prennent beaucoup de temps et sont lents et ne conviennent que pour chiffrer une petite quantité de données. Cependant, la sécurité du chiffrement asymétrique est extrêmement élevée.

Tirez le meilleur parti de vos points forts et évitez les faiblesses : chiffrez la clé de chiffrement symétrique à l'aide de la clé publique de chiffrement asymétrique, puis envoyez-la. Le destinataire utilise la clé privée pour déchiffrer afin d'obtenir la clé de chiffrement symétrique, et. alors les deux parties peuvent utiliser un cryptage symétrique pour communiquer.

Il n'est pas approprié de divulguer les méthodes utilisées dans le projet, mais seuls deux autres exemples sont répertoriés ici. Le premier vient d’ucenter et le second est vu dans Concise Magic.

Il convient de noter que, comme il s'agit d'un algorithme base64, la chaîne cryptée peut apparaître + Si elle est utilisée dans l'URL, elle n'est pas conviviale. Vous pouvez utiliser des méthodes externes ou modifiées, une récursion de vérification régulière. .

/**
 * 字符串加密以及解密函数
 * @param string $string 原文或者密文
 * @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE
 * @param string $key 密钥
 * @param int $expiry 密文有效期, 加密时候有效, 单位 秒,0 为永久有效
 * @return string 处理后的 原文或者 经过 base64_encode 处理后的密文
 */
function _authcode ($string, $operation = 'DECODE', $key = 'Ruesin', $expiry = 0)
{
 $ckey_length = 4;
 
 $key = md5($key);
 $keya = md5(substr($key, 0, 16));
 $keyb = md5(substr($key, 16, 16));
 $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, 
   $ckey_length) : substr(md5(microtime()), - $ckey_length)) : '';
 
 $cryptkey = $keya . md5($keya . $keyc);
 $key_length = strlen($cryptkey);
 
 $string = $operation == 'DECODE' ? base64_decode(
   substr($string, $ckey_length)) : sprintf('%010d', 
   $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) .
    $string;
 $string_length = strlen($string);
 
 $result = '';
 $box = range(0, 255);
 
 $rndkey = array();
 for ($i = 0; $i <= 255; $i ++) {
  $rndkey[$i] = ord($cryptkey[$i % $key_length]);
 }
 
 for ($j = $i = 0; $i < 256; $i ++) {
  $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  $tmp = $box[$i];
  $box[$i] = $box[$j];
  $box[$j] = $tmp;
 }
 
 for ($a = $j = $i = 0; $i < $string_length; $i ++) {
  $a = ($a + 1) % 256;
  $j = ($j + $box[$a]) % 256;
  $tmp = $box[$a];
  $box[$a] = $box[$j];
  $box[$j] = $tmp;
  $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
 }
 
 if ($operation == &#39;DECODE&#39;) {
  if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&
     substr($result, 10, 16) ==
     substr(md5(substr($result, 26) . $keyb), 0, 16)) {
   return substr($result, 26);
  } else {
   return &#39;&#39;;
  }
 } else {
  return $keyc . str_replace(&#39;=&#39;, &#39;&#39;, base64_encode($result));
 }
}

/*********************************************************************
函数名称:encrypt
函数作用:加密解密字符串
使用方法:
加密  :encrypt(&#39;str&#39;,&#39;E&#39;,&#39;nowamagic&#39;);
解密  :encrypt(&#39;被加密过的字符串&#39;,&#39;D&#39;,&#39;nowamagic&#39;);
参数说明:
$string :需要加密解密的字符串
$operation:判断是加密还是解密:E:加密 D:解密
$key  :加密的钥匙(密匙);
*********************************************************************/
function encrypt($string,$operation,$key=&#39;&#39;)
{
 $key=md5($key);
 $key_length=strlen($key);
 $string=$operation==&#39;D&#39;?base64_decode($string):substr(md5($string.$key),0,8).$string;
 $string_length=strlen($string);
 $rndkey=$box=array();
 $result=&#39;&#39;;
 for($i=0;$i<=255;$i++)
 {
  $rndkey[$i]=ord($key[$i%$key_length]);
  $box[$i]=$i;
 }
 for($j=$i=0;$i<256;$i++)
 {
  $j=($j+$box[$i]+$rndkey[$i])%256;
  $tmp=$box[$i];
  $box[$i]=$box[$j];
  $box[$j]=$tmp;
 }
 for($a=$j=$i=0;$i<$string_length;$i++)
 {
  $a=($a+1)%256;
  $j=($j+$box[$a])%256;
  $tmp=$box[$a];
  $box[$a]=$box[$j];
  $box[$j]=$tmp;
  $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256]));
 }
 if($operation==&#39;D&#39;)
 {
  if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8))
  {
   return substr($result,8);
  }
  else
  {
   return&#39;&#39;;
  }
 }
 else
 {
  return str_replace(&#39;=&#39;,&#39;&#39;,base64_encode($result));
 }
}

Ce qui précède est tout le contenu de cet article, je j'espère que cela sera utile à tout le monde. L'apprentissage aide.


Recommandations associées :

Classe singleton de la fonction de sélection multi-bibliothèque Redis implémentée en PHP (explication détaillée)

Définition et utilisation du modèle de stratégie PHP (explication détaillée)

Explication détaillée de la méthode de fonction personnalisée PHP pour déterminer si elle est soumise par Get/ Post/Ajax

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