mcrypt_encrypt를 사용하여 암호화 할 때, pkcs7 패딩 처리를 안해주면, openssl_decrypt나, 다른 언어 복호화에서 복호화가 불가능하다.
때문에 되도록 사용을 자제하고, 만약에 레거시 시스템에서 사용하게 되면, pkcs7 처리를 해줘야한다.
https://ko.wikipedia.org/wiki/%EA%B3%B5%EA%B0%9C_%ED%82%A4_%EC%95%94%ED%98%B8_%ED%91%9C%EC%A4%80
예제 소스
<?php
function pkcs7_pad($str)
{
$len = mb_strlen($str, '8bit');
$c = 16 - ($len % 16);
$str .= str_repeat(chr($c), $c);
return $str;
}
$message = 'test';
$key = openssl_random_pseudo_bytes(16);
$iv = openssl_random_pseudo_bytes(16);
$cipher = mcrypt_encrypt(
MCRYPT_RIJNDAEL_128,
$key,
pkcs7_pad($message),
MCRYPT_MODE_CBC,
$iv
);
$plain = openssl_decrypt(
$cipher,
'aes-128-cbc',
$key,
OPENSSL_RAW_DATA,
$iv
);
var_dump(
$message,
bin2hex($cipher),
$plain,
mb_strlen($message, '8bit'),
mb_strlen($plain, '8bit'),
$message === $plain
);
?>
mcrypt_encrypt를 사용하면 안되는 이유
https://paragonie.com/blog/2015/05/if-you-re-typing-word-mcrypt-into-your-code-you-re-doing-it-wrong
mcrypt_encrypt 대안
- Use Libsodium – A PHP extension (PHP7.2 부터는 기본적으로 들어가있음.)
- If you can’t use Libsodium, use defuse/php-encryption – Straight PHP code
- If you can’t use Libsodium or defuse/php-encryption, use OpenSSL – A lot of servers will already have this installed. If not, it can be compiled with –with-openssl[=DIR]
https://stackoverflow.com/questions/41272257/php-7-mcrypt-deprecated-need-alternative
https://paragonie.com/white-paper/2015-secure-php-data-encryption