我需要在服务器端进行中到强加密,所以我想我会在PHP中使用mcrypt.如果我使用下面的函数,原始字符串的开头会在解密后变成二进制垃圾.(这不是额外添加垃圾的常见问题,而是我的字符串被更改.)根据文档,mcrypt_encrypt()应该填充足够的字符以匹配所选算法的块大小,但我怀疑它不起作用.
但是,如果我手动将其填充到Rijndael的128位(16字节)的块大小,它也不起作用.我可以使这个工作的唯一方法是通过预先填充一些足够长的字符串(可能)覆盖带状块,并在该字符串和我的数据之间添加一个已知的前缀,如"DATA#".解密后,该块已被部分损坏,但我的前缀和之后的所有数据都已正确解密.
$GLOBALS['encryptionmarker'] = 'DATA#';
function encrypt($plain, $key) {
/*
// workaround because beginning of decrypted string is being mangled
// so we simply prefix with some text plus marker
$prefix = str_pad('', 128, '#', STR_PAD_RIGHT).$GLOBALS['encryptionmarker'];
$plain = $prefix.$plain;
*/
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $plain, MCRYPT_MODE_CFB,
mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
MCRYPT_DEV_URANDOM));
return $encrypted;
}
function decrypt($encrypted, $key) {
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_CFB,
mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB),
MCRYPT_DEV_URANDOM));
/*
// workaround: remove garbage
$pos = strpos($decrypted, $GLOBALS['encryptionmarker']);
$decrypted = …
Run Code Online (Sandbox Code Playgroud)