PHP 7.1 에 서 는 Mcrypt 대신 OpenSSL 을 이용 하여 복호화 하 는 방법 에 대해 자세히 설명 합 니 다.
5706 단어 phpmcryptopenssl 복호화
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 으로 복호화 되 었 는 지 확인 할 필요 가 있 습 니 다.총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.