Maarten's answer
,只是我觉得最好能展示一些代码来说明他的话。
mcrypt
$key = "supersecretkey";
$data = "foobar";
$ctxt = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_ECB);
$ptxt = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $ctxt, MCRYPT_MODE_ECB);
echo bin2hex($data).PHP_EOL;
echo bin2hex($ptxt).PHP_EOL;
提供以下十六进制转储:
666f6f626172
666f6f6261720000
openssl
$key = "supersecretkey";
$data = "foobar";
$opts = OPENSSL_RAW_DATA | OPENSSL_DONT_ZERO_PAD_KEY;
$ctxt = openssl_encrypt($data, 'BF-ECB', $key, $opts);
$ptxt = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $ctxt, MCRYPT_MODE_ECB);
echo bin2hex($data).PHP_EOL;
echo bin2hex($ptxt).PHP_EOL;
给予
666f6f626172
666f6f6261720202
麦克里普
和
可以通过手动添加填充字节来保持一致。注意
OPENSSL_ZERO_PADDING
选项和添加
"\0\0"
:
$key = "supersecretkey";
$data = "foobar";
$ctxt_mc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $data, MCRYPT_MODE_ECB);
$opts = OPENSSL_RAW_DATA | OPENSSL_DONT_ZERO_PAD_KEY | OPENSSL_ZERO_PADDING;
$ctxt_os = openssl_encrypt($data."\0\0", 'BF-ECB', $key, $opts);
echo bin2hex($ctxt_mc).PHP_EOL;
echo bin2hex($ctxt_os).PHP_EOL;
e73d2adf1367a24c
e73d2adf1367a24c
麦克里普
$key = "supersecretkey";
$data = "foobar";
$ctxt_mc = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, $data."\2\2", MCRYPT_MODE_ECB);
$opts = OPENSSL_RAW_DATA | OPENSSL_DONT_ZERO_PAD_KEY;
$ctxt_os = openssl_encrypt($data, 'BF-ECB', $key, $opts);
echo bin2hex($ctxt_mc).PHP_EOL;
echo bin2hex($ctxt_os).PHP_EOL;
d73caa6afabbb029
d73caa6afabbb029
最后,尝试调用
openssl_encrypt()
禁用填充且长度不是块大小的倍数时:
$key = "supersecretkey";
$data = "foobar";
$opts = OPENSSL_RAW_DATA | OPENSSL_DONT_ZERO_PAD_KEY | OPENSSL_ZERO_PADDING;
$ctxt = openssl_encrypt($data, 'BF-ECB', $key, $opts);
echo(openssl_error_string().PHP_EOL)
给予
error:0607F08A:digital envelope routines:EVP_EncryptFinal_ex:data not multiple of block length
备注:姓名
OPENSSL\零\填充
很混乱,但它的意思是“没有填充”。你可能想用旗子
OPENSSL_NO_PADDING
openssl\u encrypt()
. 它的价值是
3
,与
OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING
. 相反,
it is intended for use with asymmetric cryptography