>백엔드 개발 >PHP 튜토리얼 >Mcrypt와 OpenSSL이 Blowfish-ECB에 대해 서로 다른 암호화 결과를 생성하는 이유는 무엇입니까?

Mcrypt와 OpenSSL이 Blowfish-ECB에 대해 서로 다른 암호화 결과를 생성하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-20 19:10:16780검색

Why Do Mcrypt and OpenSSL Produce Different Encryption Results for Blowfish-ECB?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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