Maison  >  Article  >  développement back-end  >  La fonction de chiffrement symétrique PHP implémente le chiffrement et le décryptage des données

La fonction de chiffrement symétrique PHP implémente le chiffrement et le décryptage des données

高洛峰
高洛峰original
2017-01-07 16:32:432336parcourir

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. crypté et déchiffré à l'aide de la même clé.

É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 aussi à la sécurité de la clé.

Bien sûr, ce n'est pas que 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 et. 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. 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, 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 est probablement celui du système bancaire et de la plateforme 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 est préférable 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 la méthode externe ou modifier la méthode pour vérifier la récursive. appeler.

/**
 * 字符串加密以及解密函数
 * @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 représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. J'espère également que tout le monde soutiendra le site Web PHP chinois.

Pour plus d'articles liés aux fonctions de chiffrement symétrique PHP pour implémenter le chiffrement et le déchiffrement des données, veuillez faire attention au site Web PHP 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