Mcrypt를 OpenSSL로 교체
문제: 데이터 암호화를 위해 Mcrypt 사용에서 OpenSSL로 애플리케이션을 마이그레이션합니다. 암호화 암호는 Blowfish이고 모드는 ECB(Electronic Code Book)입니다. 그러나 Openssl_encrypt 및 Openssl_decrypt 함수의 출력은 동일한 매개변수에도 불구하고 MCrypt와 다릅니다.
원인:
불일치는 Openssl_encrypt 및 Openssl_decrypt 함수에서 사용하는 패딩 알고리즘의 차이로 인해 발생합니다. Mcrypt 및 OpenSSL. Mcrypt는 PKCS#5 패딩을 사용하는 반면 OpenSSL은 PKCS#7 패딩을 사용합니다. PKCS#7 패딩에는 최소 1바이트의 패딩이 필요한 반면, PKCS#5 패딩은 0바이트의 패딩 길이를 허용합니다. 또한 ECB 모드에는 IV가 필요하지 않지만 Mcrypt에는 ECB 모드에 IV(초기화 벡터)가 필요합니다.
해결 방법:
문제를 해결하려면 다음 중 하나를 수행하세요. MCrypt 기능을 사용하기 전에 입력 데이터를 PKCS#7 스타일 패딩으로 수동으로 채우거나 올바른 패딩 알고리즘을 사용하여 데이터를 다시 암호화하십시오.
다음은 PKCS#7을 사용하는 질문에 제공된 코드의 수정된 버전입니다. MCrypt용 패딩:
$key = "anotherpassword1"; $str = "does it work 12"; $enc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $str."", MCRYPT_MODE_ECB); $dec = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $enc, MCRYPT_MODE_ECB); echo(bin2hex($enc).PHP_EOL); var_dump($dec); $enc = openssl_encrypt($str, 'bf-ecb', $key, true); $dec = openssl_decrypt($enc, 'bf-ecb', $key, true); echo(bin2hex($enc).PHP_EOL); var_dump($dec);
MCrypt 암호화 전 입력 데이터에 1바이트 패딩을 추가하면 Mcrypt와 OpenSSL 기능의 출력이 일치합니다. ECB 모드에는 IV가 필요하지 않으며 IV를 제공할 필요도 없습니다.
위 내용은 Mcrypt와 OpenSSL이 Blowfish-ECB에 대해 서로 다른 암호화 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!