OpenSSL 라이브러리 없이 PHP로만 구현된 간단한 암호화 > PHP
PHP

OpenSSL 라이브러리 없이 PHP로만 구현된 간단한 암호화

조회 992회 댓글 0건

간혹 PHP만 설치해서 사용하고 최대한 라이브러리 설치 하지 않게 사용하면서 간단하게 암호화할 필요가 있을 경우 사용 합니다. 가능하면 OpenSSL 라이브러리 사용하는 암호화 방식을 추천 합니다.  

그리고 어떤 방식이든 대칭형 암호화에서 키는 가능하면 길게 만들고 여기선 md5 사용 했지만 sha512 같은것 사용하면 더 좋고 시간, 또는 일마다 같은 문자도 암호화 결과가 다르게 만드는것이 좋습니다. 

그 부분은 개인의 상황에 맞게 별도의 메소드로 키를 생성하는 것을 만들면 좋습니다. 입력 받은 키에 부가적으로 더 넣어 줍니다.


이 간단한 암호화 방식은 암호화와 복호화 함수가 동일하게 작동합니다.



  /**
   * openssl 라이브러리 없이 PHP로만 구현된 간단한 암호화
   *   - 키의 길이는 구조상 256바이트 아래로 한다.
   *
   * @package
   */
  class Encryptor {
    private $key;

    public function __construct($key, $id) {
      $this->key = $this->genKey($key, $id);
    }

    /**
     * 사용할때의 특징에 맞게 키를 복잡하게 만들어 준다.
     * @param mixed $key
     * @param mixed $id
     * @return string
     */
    private function genKey($key, $id) {
      $ymd        = date('Y-m-d');
      $rand_key   = 'ad;fj32p;45u8osadjfsa;fkjsa;lkfja;sldjkf';
      return md5($key . $id . $rand_key);
    }

    private function initializeState() {
      $state = array();
      for ($i = 0; $i < 256; $i++) {
        $state[$i] = $i;
      }
      $j = 0;
      for ($i = 0; $i < 256; $i++) {
        $j = ($j + $state[$i] + ord($this->key[$i % strlen($this->key)])) % 256;
        $temp = $state[$i];
        $state[$i] = $state[$j];
        $state[$j] = $temp;
      }
      return $state;
    }

    public function encrypt($data, $type) {
      $state = $this->initializeState();
      $i = 0;
      $j = 0;
      $length = strlen($data);
      $encrypted = '';
      for ($y = 0; $y < $length; $y++) {
        $i = ($i + 1) % 256;
        $j = ($j + $state[$i]) % 256;
        $temp = $state[$i];
        $state[$i] = $state[$j];
        $state[$j] = $temp;
        $t = ($state[$i] + $state[$j]) % 256;
        $keystream = $state[$t];
        $encrypted .= chr(ord($data[$y]) ^ $keystream);
      }

      #
      if ( $type == 'en' ) return base64_encode($encrypted);
      else {
        return $encrypted;
      }
    }

    public function decrypt($data, $type) {
      if ( $type == 'de' ) $data = base64_decode($data);
      return $this->encrypt($data, $type);
    }
  }

  // 사용 예시
  $key = '암호화 키';
  $encryptor = new Encryptor($key, 'userid');

  $data = '암호화할 문자열';
  $encrypted = $encryptor->encrypt($data, 'en');
  echo "암호화된 문자열: " . $encrypted . "\n";

  $decrypted = $encryptor->decrypt($encrypted, 'de');
  echo "복호화된 문자열: " . $decrypted . "\n";
 
  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
전체 205건 1 페이지
  • profile_image dll 파일명은 gd2가 아니라 gd로 되어 있는데 샘플의 php.ini 에선 gd2로 되어 있는 경우가 있습니다.이런 경우는 파일명에 맞게 gd로 변경해 주면 됩니다.php.ini 에서 extension=fileinfoextension=gd제 경우는 윈도우환경에서 이런 문제가 있었습니다.
  • profile_image 파일 구조가 복잡한 경우 어디서 어떤 프로그램이 include(포함) 되어 있는지 찾기 힘든 경우가 있습니다.이런 경우는 최종적으로 읽혀지는 파일에 전체 include 되는 목록을 출렧하면 되는데요. 프로그램은 아래와 같습니다.이렇게 하면 어느파일이 include 되는지 알 수 있습니다.  $allowed_ip = '222.111.222.123';  $user_ip = $_SERVER['REMOTE_ADDR'];  if ($user_ip == $allowed_ip) {    // 포함된 파일 목록을 배열로 반환    $included_files = get_included_files();    // 포함된 파일 목록 출력…
  • profile_image 파싱을 제대로 해야 하는데 잘 안될때가 있는데 그런경우 사용하는 방법중 하나 입니다.전체를 출력하고 그곳에서 필요한 부분만 사용을 하는데 보통 링크 같은 경우는 이렇게 해도 큰 문제가 되지 않습니다.프로그램을 잘 한다는것은 문제 해결을 잘 한다는 것입니다.문제 해결을 잘하는 사람은 코딩도 잘하는 편이지만 약간 다를 수 있기도 합니다.한번 사용하면 그만인 프로그램을 만들때는 빠르게 처리하여 마무리하는것이 제일 좋은 방법이겠습니다.    $dom = new DOMDocument('1.0', 'UTF-8');    @$dom->loadHTML($html);    $xpath = new DOMXPath($dom);    …
  • profile_image 많은 문자열에서 비교할때 문자열의 글자길이가 짧은것인 긴것안에 포함 되어 체크 할때 문제가 발생하는 경우가 있는데 사람 같이 지능이 있는 경우 비교할때 판단을 할 수 있지만 프로그램은 그렇지 못하기 때문에 비교 순서를 글자길이가 긴것을 먼저 비교하면 좋아지는 경우가 있는데 이런 경우 사용하는 방법 입니다.  if ( $MODE == 'test' ) {    $aString    = ['한글' => 1, '국어공부' => 2, '산수틀' => 1, '노력하기중' => 2];    print_r($aString);    uksort($aString, function($a, $b) {        re…
  • profile_image 아파치 로그에서 특정페이지(URL) 호출의 횟수를 알아봐야 하는 경우 아래 프로그램을 자신의 환경에 맞게 수정하여 사용하면 됩니다.그리고 저 같은 경우 로그의 갯수가 몇만개 밖에 안되서 문제 되지 않지만 더 많을 경우 1차 2차 필터링 과정을 거치는 방식을 사용해서 처리 해야 하는것 참고하 주세요.기본 방식이 중요하기 때문에 아래를 응용해서 사용하면 됩니다.  $urlCounts = [];  while ($line = fgets(STDIN)) {      if (preg_match('/^.*"GET ([^"]+) HTTP/', $line, $matches)) {          $url = urldecode($match…
  • profile_image 프로그램이 멈추는 경우도 있기 때문에 이런 경우는try {} catch {} 로 잡아서 멈추지 않게 처리 해야 합니다.● 오류 로그와 관련하야 PHP 8 에서 중요한 부분은 아래와 같습니다.- 에러 출력을 위한 설정 - 반드시 로그를 남기는 것이 있어야 화면에 출력이 되질 않는다.- 그리고 예외처리 해서 잡은 것은 당연하게 echo 찍은 것이면 화면에 출력이 된다. 그렇기 때문에 웹사이트 제작시에는 적합하지 않기 때문에 함수 안에서 오류를 돌려 주고 필요한 경우만 출력하게 해야 합니다.     # error 출력을 위한 설정 - 반드시 로그를 남기는 것이 있어야 화면에 출력이 되질 않는다.    ini_set('disp…
  • profile_image 두가지 방식을 사용 할 수 있는데요. 가능하면 약간 복잡스러워도 새로 나온것을 사용하세요.● finfo Fileinfo 확장의 여러 기능을 사용할 수 있도록 하며 특히 FILEINFO_MIME_TYPE 외에도 FILEINFO_MIME 등의 옵션을 사용하여 더 많은 정보를 제공할 수 있습니다. 따라서 더 유연하고 강력한 기능을 제공합니다.● mime_content_type  이 함수는 단순히 파일의 MIME 타입을 반환하는데 사용됩니다. 이 함수는 매우 간단하며 추가적인 설정 옵션이 없습니다.    # 1) finfo     function getFileType($filePath) {        $finfo = finf…