어떻게 PHP 에서 AES 암호 화 알고리즘 을 사용 하여 데 이 터 를 암호 화 합 니까?

Discuz 를 연구 할 때 Discuz 는 상당히 완벽 한 암호 화 알고리즘(상대 적 으로)을 가지 고 있 음 을 발견 했다.이 알고리즘 은 데 이 터 를 암호 화한 후 저장 할 수 있 으 며 필요 할 때 이전에 암호 화 된 비밀 키 로 복원 할 수 있 습 니 다.
이 외 에 도 AES 라 는 알고리즘 은 데 이 터 를 잘 암호 화 할 수 있어 전송 과정 에서 쉽게 풀 리 지 않 습 니 다.
PHP 에 서 는 mcrypt 모듈 을 먼저 설치 하고 해당 버 전의 확장 을 php 에 추가 해 야 합 니 다.자세 한 내용 은 PHP 를 다시 컴 파일 하지 않 고 Mcrypt 확장 을 설치 하 는 것 을 볼 수 있 습 니 다.
AES 암호 화 모드 와 충전 방식 은 다음 과 같 지만 전부 가 아 닙 니 다.

  /  /          16               16       
AES/CBC/NoPadding       16                
AES/CBC/PKCS5Padding     32             16
AES/CBC/ISO10126Padding    32             16
AES/CFB/NoPadding       16                   
AES/CFB/PKCS5Padding     32             16
AES/CFB/ISO10126Padding    32             16
AES/ECB/NoPadding       16                
AES/ECB/PKCS5Padding     32             16
AES/ECB/ISO10126Padding    32             16
AES/OFB/NoPadding       16                   
AES/OFB/PKCS5Padding     32             16
AES/OFB/ISO10126Padding    32             16
AES/PCBC/NoPadding      16                
AES/PCBC/PKCS5Padding     32             16
AES/PCBC/ISO10126Padding   32             16
다음은 PHP 에서 AES 를 사용 하여 데 이 터 를 암호 화 하 는 것 입 니 다.
AES-CBC 암호 화 방안

<?php
$privateKey = "1234567812345678";
$iv 	= "1234567812345678";
$data 	= "Test String";

//  
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $data, MCRYPT_MODE_CBC, $iv);
echo(base64_encode($encrypted));
echo '<br/>';

//  
$encryptedData = base64_decode("2fbwW9+8vPId2/foafZq6Q==");
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateKey, $encryptedData, MCRYPT_MODE_CBC, $iv);
echo($decrypted);
?>
AES-ECB 암호 화 방안

<?php 
//    
$key = '1234567890123456';  
$content = 'hello';  
$padkey = pad2Length($key,16);  
$cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');  
$iv_size = mcrypt_enc_get_iv_size($cipher);  
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); #IV    ?  
echo '    iv   :'.strlen($iv).' :'.bin2hex($iv).'<br>';  
if (mcrypt_generic_init($cipher, pad2Length($key,16), $iv) != -1)  
{  
  // PHP pads with NULL bytes if $content is not a multiple of the block size..  
  $cipherText = mcrypt_generic($cipher,pad2Length($content,16) );  
  mcrypt_generic_deinit($cipher);  
  mcrypt_module_close($cipher);  
    
  // Display the result in hex.  
  printf("128-bit encrypted result:n%snn",bin2hex($cipherText));  
  print("<br />");  
    
}  
//    
$mw = bin2hex($cipherText);  
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');  
if (mcrypt_generic_init($td, $padkey, $iv) != -1)  
{  
  $p_t = mdecrypt_generic($td, hexToStr($mw));  
  mcrypt_generic_deinit($td);  
  mcrypt_module_close($td);  
    
  $p_t = trimEnd($p_t);  
  echo '  :';  
  print($p_t);  
  print("<br />");  
  print(bin2hex($p_t));  
  echo '<br><br>';  
}  
// $text  $padlen       
function pad2Length($text, $padlen){  
  $len = strlen($text)%$padlen;  
  $res = $text;  
  $span = $padlen-$len;  
  for($i=0; $i<$span; $i++){  
    $res .= chr($span);  
  }  
  return $res;  
}  
//           (               block_size   )  
function trimEnd($text){  
  $len = strlen($text);  
  $c = $text[$len-1];  
  if(ord($c) <$len){  
    for($i=$len-ord($c); $i<$len; $i++){  
      if($text[$i] != $c){  
        return $text;  
      }  
    }  
    return substr($text, 0, $len-ord($c));  
  }  
  return $text;  
}  
//16     2       
function hexToStr($hex)   
{   
  $bin="";   
  for($i=0; $i<strlen($hex)-1; $i+=2)   
  {  
    $bin.=chr(hexdec($hex[$i].$hex[$i+1]));   
  }  
  return $bin;   
}
AES-ECB 암호 화 방안

<?php    
$key = '1234567890123456';  
$key = pad2Length($key,16);  
$iv = 'asdff';  
$content = 'hello';  
$content = pad2Length($content,16);  
$AESed = bin2hex( mcrypt_encrypt(MCRYPT_RIJNDAEL_128,$key,$content,MCRYPT_MODE_ECB,$iv) ); #    
echo "128-bit encrypted result:".$AESed.'<br>';  
$jiemi = mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$key,hexToStr($AESed),MCRYPT_MODE_ECB,$iv); #    
echo '  :';  
echo trimEnd($jiemi);   
?> 
이상 은 제 가 열거 한 간단 한 3 가지 암호 화 방법 일 뿐 입 니 다.사실은 많은 방법 이 있 습 니 다.우 리 는 계속 공부 해 야 합 니 다.암호학 의 길 은 아직 책임 이 무 겁 고 갈 길이 멀다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기