찾다
백엔드 개발PHP 튜토리얼PHP 데이터 압축, 암호화 및 복호화(압축, 압축 풀기)에 대한 자세한 설명

네트워크 통신 및 파일 저장에서 데이터가 교환되는 경우가 많습니다. 네트워크 통신 트래픽, 파일 저장 크기 및 암호화된 통신 규칙을 줄이기 위해 데이터 보안을 보장하기 위해 데이터의 양방향 암호화 및 복호화를 수행해야 하는 경우가 많습니다.
PHP에서 이 기능을 구현하는 데 필요한 주요 기능은 주로 데이터를 비트 문자열로 압축하는 pack 및 unpack 함수

pack
입니다.
구문: 문자열 팩(문자열 형식, 혼합 [인수]...);
반환 값: 문자열
이 함수는 데이터를 문자열로 압축하고 압축하는 데 사용됩니다.
a - NUL - 패딩된 문자열 [패딩된 문자열] 문자열 공백을 NULL 문자로 패딩
A - SPACE - 패딩된 문자열 [패딩된 문자열]
h - 16진수 문자열, 낮은 "니블 우선"(낮은 니블 우선 )
H - 16진수 문자열, 높은 "니블" [높은 니블 우선](높은 니블 우선)
c - 부호 있는 문자
C – 부호 없는 문자
s – 부호 있는 짧은 패턴 [short] (일반적으로 16비트, 머신 바이트 순서)
S – 부호 없는 부호 있는 짧은 모드 [short](일반적으로 16비트, 머신 바이트 정렬)
n - 부호 없는 짧은 모드 [short](일반적으로 16비트, 빅 엔디안 바이트 정렬)
v - 부호 없는 짧은 패턴 [short](보통 16비트, 리틀 엔디안 바이트 정렬)
i - 부호 있는 정수(크기 및 바이트 순서로 결정됨)
I - 부호 없는 정수(크기 및 바이트로 결정됨) order)
l – 부호 있는 긴 패턴 [long](보통 32비트, 머신 바이트 순서)
L – 부호 없는 긴 모드 [long](보통 32비트, 머신 바이트 순서)
N – 부호 없는 long 모드 [long](보통 32비트, 빅 에디안 바이트 순서)
V – 부호 없는 긴 모드 [long](보통 32비트, 리틀 에디안 바이트 순서)
f – 부동 소수점(크기 및 바이트 순서)
d – double (크기 및 바이트 순서로 결정) 바이트 순서로 결정)
x – NUL 바이트 [NUL 바이트]
>
비트 문자열 데이터를 압축 해제합니다.
구문: 문자열 팩(문자열 형식, 혼합 [인수]...);반환 값: 배열이 함수는 비트 문자열 데이터의 압축을 풀 때 사용됩니다. 이 함수는 동일한 이름의 Perl 함수와 기능 및 사용법이 완전히 동일합니다.


사례 1, pack은 파일 데이터 저장 크기 감소를 구현합니다


<?php 
//存储整数1234567890 
file_put_contents("test.txt", 1234567890);
이 때 test.txt의 파일 크기는 10byte입니다. 참고로 이때 파일 크기는 10바이트이고 실제 차지하는 공간은 1KB입니다. 위에 저장된 정수들은 실제로 test.txt 파일에 문자열 형태로 저장됩니다.
단, 정수 바이너리 문자열로 저장하면 4바이트로 줄어듭니다.

<?php 
print_r(unpack("i", file_get_contents("test.txt")));



사례 2, 데이터 암호화

의미 있는 데이터를 문자열 7-110-abcdefg-117 형식으로 저장합니다.
문자 "-"를 나눈 후 첫 번째 숫자는 문자열의 길이, 두 번째 숫자는 저장 위치, 세 번째 숫자는 실제 저장된 문자열, 네 번째 숫자는 끝 위치를 나타냅니다. rree

위 방법의 단점:

1. 데이터 저장 크기

2. 민감한 정보인 경우에는 접근이 안전하지 않을 수 있습니다. 3. 파일 저장 크기가 불규칙하게 증가합니다.
암호화:


<?php 
file_put_contents("test.txt", "7-110-abcdefg-117");
는 데이터 조각을 저장합니다. 암호화 형식은 정수 2자리 문자열 10자리 길이 정수 1자리 길이입니다.
장점:

1. 데이터 크기 최적화
2. "i2a7i1"과 같은 압축 형식을 모르면 파일을 얻어도 제대로 읽을 수 없습니다. 바이너리 파일 변환 일반 텍스트의 경우. 3. 데이터가 증가하면 파일 저장 크기도 그만큼 늘어납니다. 매번 19바이트씩 증가합니다.

사례 3, 키-값 파일 저장

저장에서 생성되는 파일은 인덱스 파일, 데이터 파일 2가지
파일 내 데이터 저장 형식은 다음과 같다 :

코드 구현:

<?php 
file_put_contents("test.txt", pack("i2a7i1", 7, 110, "abcdefg", 117));
PHP 데이터 압축, 암호화 및 복호화(압축, 압축 풀기)에 대한 자세한 설명
사례 4, 소켓 통신 암호화

두 통신 당사자 모두 암호화 형식을 정의합니다.

예:

<?php 
error_reporting(E_ALL); 
 
class fileCacheException extends Exception{ 
 
} 
 
//Key-Value型文件存储 
class fileCache{ 
   private $_file_header_size = 14; 
   private $_file_index_name; 
   private $_file_data_name; 
   private $_file_index;//索引文件句柄 
   private $_file_data;//数据文件句柄 
   private $_node_struct;//索引结点结构体 
   private $_inx_node_size = 36;//索引结点大小 
 
   public function __construct($file_index="filecache_index.dat", $file_data="filecache_data.dat"){ 
     $this->_node_struct = array( 
        &#39;next&#39;=>array(1, &#39;V&#39;), 
        &#39;prev&#39;=>array(1, &#39;V&#39;), 
       &#39;data_offset&#39;=>array(1,&#39;V&#39;),//数据存储起始位置 
       &#39;data_size&#39;=>array(1,&#39;V&#39;),//数据长度 
       &#39;ref_count&#39;=>array(1,&#39;V&#39;),//引用此处,模仿PHP的引用计数销毁模式 
       &#39;key&#39;=>array(16,&#39;H*&#39;),//存储KEY 
     ); 
 
     $this->_file_index_name = $file_index; 
     $this->_file_data_name = $file_data; 
 
     if(!file_exists($this->_file_index_name)){ 
        $this->_create_index(); 
     }else{ 
        $this->_file_index = fopen($this->_file_index_name, "rb+"); 
     } 
 
     if(!file_exists($this->_file_data_name)){ 
        $this->_create_data(); 
     }else{ 
        $this->_file_data = fopen($this->_file_data_name, "rb+");//二进制存储需要使用b 
     } 
   } 
 
   //创建索引文件 
   private function _create_index(){ 
     $this->_file_index = fopen($this->_file_index_name, "wb+");//二进制存储需要使用b 
     if(!$this->_file_index)  
        throw new fileCacheException("Could&#39;t open index file:".$this->_file_index_name); 
 
     $this->_index_puts(0, &#39;<&#39;.&#39;?php exit()?&#39;.&#39;>&#39;);//定位文件流至起始位置0, 放置php标记防止下载 
     $this->_index_puts($this->_file_header_size, pack("V1", 0)); 
   } 
 
 
   //创建存储文件 
   private function _create_data(){ 
     $this->_file_data = fopen($this->_file_data_name, "wb+");//二进制存储需要使用b 
     if(!$this->_file_index)  
        throw new fileCacheException("Could&#39;t open index file:".$this->_file_data_name); 
 
     $this->_data_puts(0, &#39;<&#39;.&#39;?php exit()?&#39;.&#39;>&#39;);//定位文件流至起始位置0, 放置php标记防止下载 
   } 
 
   private function _index_puts($offset, $data, $length=false){ 
     fseek($this->_file_index, $offset); 
 
     if($length) 
     fputs($this->_file_index, $data, $length); 
     else 
     fputs($this->_file_index, $data); 
   } 
 
   private function _data_puts($offset, $data, $length=false){ 
     fseek($this->_file_data, $offset); 
     if($length) 
     fputs($this->_file_data, $data, $length); 
     else 
     fputs($this->_file_data, $data); 
   } 
 
   /** 
   * 文件锁 
   * @param $is_block 是否独占、阻塞锁 
   */ 
   private function _lock($file_res, $is_block=true){ 
     flock($file_res, $is_block ? LOCK_EX : LOCK_EX|LOCK_NB); 
   } 
 
   private function _unlock($file_res){ 
     flock($file_res, LOCK_UN); 
   } 
 
   public function add($key, $value){ 
     $key = md5($key); 
     $value = serialize($value); 
     $this->_lock($this->_file_index, true); 
     $this->_lock($this->_file_data, true); 
 
     fseek($this->_file_index, $this->_file_header_size); 
 
     list(, $index_count) = unpack(&#39;V1&#39;, fread($this->_file_index, 4)); 
 
     $data_size = filesize($this->_file_data_name); 
 
     fseek($this->_file_data, $data_size); 
 
     $value_size = strlen($value); 
 
     $this->_data_puts(filesize($this->_file_data_name), $value); 
 
     $node_data =  
     pack("V1V1V1V1V1H32", ($index_count==0) ? 0 : $index_count*$this->_inx_node_size, 0, filesize($this->_file_data_name), strlen($value), 0, $key); 
 
     $index_count++; 
 
     $this->_index_puts($this->_file_header_size, $index_count, 4); 
 
     $this->_index_puts($this->get_new_node_pos($index_count), $node_data); 
 
     $this->_unlock($this->_file_data); 
     $this->_unlock($this->_file_index); 
   } 
 
   public function get_new_node_pos($index_count){ 
     return $this->_file_header_size + 4 + $this->_inx_node_size * ($index_count-1); 
   } 
 
   public function get_node($key){ 
     $key = md5($key); 
     fseek($this->_file_index, $this->_file_header_size); 
     $index_count = fread($this->_file_index, 4); 
 
     if($index_count>0) { 
        for ($i=0; $i < $index_count ; $i++) {  
          fseek($this->_file_index, $this->_file_header_size + 4 + $this->_inx_node_size * $i); 
          $data = fread($this->_file_index, $this->_inx_node_size); 
          $node = unpack("V1next/V1prev/V1data_offset/V1data_size/V1ref_count/H32key", $data); 
 
          if($key == $node[&#39;key&#39;]){ 
             return $node; 
          } 
        } 
     }else{ 
        return null; 
     } 
   } 
 
   public function get_data($offset, $length){ 
     fseek($this->_file_data, $offset); 
     return unserialize(fread($this->_file_data, $length)); 
   } 
} 
 
//使用方法 
$cache = new fileCache(); 
$cache->add(&#39;abcdefg&#39; , &#39;testabc&#39;); 
$data = $cache->get_node(&#39;abcdefg&#39;); 
print_r($data); 
echo $cache->get_data($data[&#39;data_offset&#39;], $data[&#39;data_size&#39;]);

서버와 클라이언트는 COMMAND 형식을 구문 분석하여 해당 DATA 디코딩 방법을 찾고 올바른 데이터를 얻습니다.

위는 자세한 설명입니다. PHP 데이터 압축 및 처리 Decrypt(pack, unpack) 컨텐츠에 대한 자세한 내용은 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP 이메일 : 단계별 보내기 안내서PHP 이메일 : 단계별 보내기 안내서May 09, 2025 am 12:14 AM

phpisusedforendingemailsduetoitsintegrationwithsermailservices 및 externalsmtpproviders, 1) setupyourphpenvironmentwitheberverandphp, temailfuncpp를 보장합니다

PHP를 통해 이메일을 보내는 방법 : 예 및 코드PHP를 통해 이메일을 보내는 방법 : 예 및 코드May 09, 2025 am 12:13 AM

이메일을 보내는 가장 좋은 방법은 Phpmailer 라이브러리를 사용하는 것입니다. 1) Mail () 함수를 사용하는 것은 간단하지만 신뢰할 수 없으므로 이메일이 스팸으로 입력되거나 배송 할 수 없습니다. 2) Phpmailer는 더 나은 제어 및 신뢰성을 제공하며 HTML 메일, 첨부 파일 및 SMTP 인증을 지원합니다. 3) SMTP 설정이 올바르게 구성되었는지 확인하고 (예 : STARTTLS 또는 SSL/TLS) 암호화가 보안을 향상시키는 데 사용됩니다. 4) 많은 양의 이메일의 경우 메일 대기열 시스템을 사용하여 성능을 최적화하십시오.

고급 PHP 이메일 : 사용자 정의 헤더 및 기능고급 PHP 이메일 : 사용자 정의 헤더 및 기능May 09, 2025 am 12:13 AM

CustomHeadersAndAdAncedFeaturesInpHeAmailEnhanceFectionality.1) 1) CustomHeadersAdDmetAdataFortrackingand Categorization.2) htmlemailsallowformattingandinteractivity.3) attachmentSentUsingLibraries likePhpMailer.4) smtpauthenticimprpr

PHP & SMTP와 함께 이메일 보내기 안내서PHP & SMTP와 함께 이메일 보내기 안내서May 09, 2025 am 12:06 AM

PHP 및 SMTP를 사용하여 메일을 보내는 것은 PHPMailer 라이브러리를 통해 달성 할 수 있습니다. 1) phpmailer 설치 및 구성, 2) SMTP 서버 세부 정보 설정, 3) 이메일 컨텐츠 정의, 4) 이메일 보내기 및 손잡이 오류. 이 방법을 사용하여 이메일의 신뢰성과 보안을 보장하십시오.

PHP를 사용하여 이메일을 보내는 가장 좋은 방법은 무엇입니까?PHP를 사용하여 이메일을 보내는 가장 좋은 방법은 무엇입니까?May 08, 2025 am 12:21 AM

TheBesteptroachForendingeMailsInphPisusingThephPmailerlibraryDuetoitsReliability, featurerichness 및 reaseofuse.phpmailersupportssmtp, proversDetailErrorHandling, supportSattachments, andenhancessecurity.foroptimalu

PHP의 종속성 주입을위한 모범 사례PHP의 종속성 주입을위한 모범 사례May 08, 2025 am 12:21 AM

의존성 주입 (DI)을 사용하는 이유는 코드의 느슨한 커플 링, 테스트 가능성 및 유지 관리 가능성을 촉진하기 때문입니다. 1) 생성자를 사용하여 종속성을 주입하고, 2) 서비스 로케이터 사용을 피하고, 3) 종속성 주입 컨테이너를 사용하여 종속성을 관리하고, 4) 주입 종속성을 통한 테스트 가능성을 향상 시키십시오.

PHP 성능 튜닝 팁 및 요령PHP 성능 튜닝 팁 및 요령May 08, 2025 am 12:20 AM

phpperformancetuningiscrucialbecauseitenhancesspeedandefficies, thearevitalforwebapplications.1) cachingsdatabaseloadandimprovesResponsetimes.2) 최적화 된 databasequerieseiesecessarycolumnsingpeedsupedsupeveval.

PHP 이메일 보안 : 이메일 보내기 모범 사례PHP 이메일 보안 : 이메일 보내기 모범 사례May 08, 2025 am 12:16 AM

theBestPracticesForendingEmailsSecurelyPinphPinclude : 1) usingecureconfigurations와 whithsmtpandstarttlSencryption, 2) 검증 및 inputSpreverventInseMeStacks, 3) 암호화에 대한 암호화와 비도시를 확인합니다

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

VSCode Windows 64비트 다운로드

VSCode Windows 64비트 다운로드

Microsoft에서 출시한 강력한 무료 IDE 편집기

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구