PHP 7.1 에 서 는 Mcrypt 대신 OpenSSL 을 이용 하여 복호화 하 는 방법 에 대해 자세히 설명 합 니 다.

개요:
php 7.1 발표 후 새로운 특성 이 많은 PHPer 를 끌 어 들 여 새로운 특성 이 가 져 온 장점 과 편리 함 에 대해 토론 하고 있다.그러나 php 7.0 에서 php 7.1 로 업그레이드 되 어 과거 에 보편적으로 사용 되 었 던 확장(mcrypt 확장)이 폐기 되 었 습 니 다.정 부 는 상응하는 해결 제 시 를 제 공 했 지만 더 상세 한 해결 방법 을 제공 하지 않 았 다.그래서 구덩이 가 왔 다.
오늘 위 챗 오픈 플랫폼 을 사용 하여 콘 텐 츠 관리 시스템 을 연결 할 때 공중 번 호 를 연결 할 때 계속 실 패 했 습 니 다.
원인:
디 버 깅 을 할 때 직접적인 원인 은 오픈 플랫폼 에 기 재 된 권한 수여 사건(이 권한 수여 사건 은 10 분 에 한 번 씩 사건 을 보 내 서 ticket 을 업데이트 하기 때 문 입 니 다).즉,:

이 곳 에서 작성 한 url,디 버 깅 결과 이 URL 이 맞습니다.위 챗 도 10 분 마다 보 내 왔 지만 끝까지 ticket 을 받 지 못 했 습 니 다.코드 를 보 니 위 챗 에서 온 데 이 터 를 복호화 할 때 잘못 보 고 했 기 때 문 입 니 다.

<?php 
 
function aes_decode($message, $encodingaeskey = '', $appid = '') { 
 $key = base64_decode($encodingaeskey . '='); 
 
 $ciphertext_dec = base64_decode($message); 
 $iv = substr($key, 0, 16); 
 
 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 
 mcrypt_generic_init($module, $key, $iv); 
 $decrypted = mdecrypt_generic($module, $ciphertext_dec); 
 mcrypt_generic_deinit($module); 
 mcrypt_module_close($module); 
 
 $pad = ord(substr($decrypted, -1)); 
 if ($pad < 1 || $pad > 32) { 
 $pad = 0; 
 } 
즉,이곳 은 내 환경 이 PHP 7.1 이기 때문에 자 료 를 찾 아 보 니 PHP 7.1 이 Mcrypt 을 폐 기 했 기 때문에 이 코드 안의 mcrypt *실행 할 수 없습니다.
해결:
자 료 를 찾 아 보면 Mcrypt 대신 OpenSSL 을 사용 할 수 있 습 니 다.(전 제 는 OpenSSL 확장 이 설치 되 어 있 지만 기본 으로 설치 되 어 있 습 니 다)
openssl 은 강력 한 기능 을 가 진 공구 꾸러미 로 많은 암호 알고리즘 과 실 용적 인 도 구 를 통합 시 켰 다.저 희 는 명령 대 도 구 를 이용 하여 키,인증 서 를 만 들 고 파일 을 암호 화 할 수 있 으 며,제 공 된 API 인 터 페 이 스 를 이용 하여 코드 에서 전송 정 보 를 암호 화 할 수 있 습 니 다.
그래서 위의 코드 는 다음 과 같이 바 꿀 수 있 습 니 다.

<?php 
 
function aes_decode($message, $encodingaeskey = '', $appid = '') { 
 $key = base64_decode($encodingaeskey . '='); 
 
 $ciphertext_dec = base64_decode($message); 
 $iv = substr($key, 0, 16); 
 
 /* mcrypt       PHP7.1      ,       openssl    
 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 
 mcrypt_generic_init($module, $key, $iv); 
 $decrypted = mdecrypt_generic($module, $ciphertext_dec); 
 mcrypt_generic_deinit($module); 
 mcrypt_module_close($module); 
 */ 
 $decrypted = openssl_decrypt($ciphertext_dec, 'AES-256-CBC', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); 
 
 $pad = ord(substr($decrypted, -1)); 
 if ($pad < 1 || $pad > 32) { 
 $pad = 0; 
 } 
보충:
위의 복호화 가 수정 되 었 습 니 다.이에 대응 하 는 Mcrypt 암호 화 도 수정 해 야 합 니 다.수정 하지 않 으 면 인터넷 에서 발표 하지 못 하고 메 시 지 를 전송 하지 못 하 는 등 사건 이 발생 할 수 있 습 니 다.
암호 화 된 소스 코드 는 다음 과 같 습 니 다.

<?php 
function aes_encode($message, $encodingaeskey = '', $appid = '') { 
 $key = base64_decode($encodingaeskey . '='); 
 $text = random(16) . pack("N", strlen($message)) . $message . $appid; 
 $iv = substr($key, 0, 16); 
 
 $block_size = 32; 
 $text_length = strlen($text); 
 $amount_to_pad = $block_size - ($text_length % $block_size); 
 if ($amount_to_pad == 0) { 
 $amount_to_pad = $block_size; 
 } 
 $pad_chr = chr($amount_to_pad); 
 $tmp = ''; 
 for ($index = 0; $index < $amount_to_pad; $index++) { 
 $tmp .= $pad_chr; 
 } 
 $text = $text . $tmp; 
 $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 
 mcrypt_generic_init($module, $key, $iv); 
 $encrypted = mcrypt_generic($module, $text); 
 mcrypt_generic_deinit($module); 
 mcrypt_module_close($module); 
 
 $encrypt_msg = base64_encode($encrypted); 
 return $encrypt_msg; 
} 
수 정 된 코드 는:

<?php 
function aes_encode($message, $encodingaeskey = '', $appid = '') { 
 $key = base64_decode($encodingaeskey . '='); 
 $text = random(16) . pack("N", strlen($message)) . $message . $appid; 
 $iv = substr($key, 0, 16); 
 
 $block_size = 32; 
 $text_length = strlen($text); 
 $amount_to_pad = $block_size - ($text_length % $block_size); 
 if ($amount_to_pad == 0) { 
 $amount_to_pad = $block_size; 
 } 
 $pad_chr = chr($amount_to_pad); 
 $tmp = ''; 
 for ($index = 0; $index < $amount_to_pad; $index++) { 
 $tmp .= $pad_chr; 
 } 
 $text = $text . $tmp; 
 /* mcrypt       PHP7.1      ,       openssl    
 $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC); 
 $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, ''); 
 mcrypt_generic_init($module, $key, $iv); 
 $encrypted = mcrypt_generic($module, $text); 
 mcrypt_generic_deinit($module); 
 mcrypt_module_close($module); 
 */ 
 
 $encrypted = openssl_encrypt($text, 'AES-256-CBC', $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv); 
 $encrypt_msg = base64_encode($encrypted); 
 return $encrypt_msg; 
} 
특히 위 챗 개발 과 관련 된 절차 가 PHP 7.1 로 업그레이드 되 었 다 면 Mcrypt 대칭 으로 복호화 되 었 는 지 확인 할 필요 가 있 습 니 다.위 챗 개발 문서 에 사 용 된 demo 도 Mcrypt 으로 복호화 되 었 는 지 확인 할 필요 가 있 습 니 다.
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기