Ene*_*ant 2 php encryption cryptography mcrypt
我需要在服务器端进行中到强加密,所以我想我会在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 = trim(substr($decrypted, $pos + strlen($GLOBALS['encryptionmarker'])));
*/
return $decrypted;
}
Run Code Online (Sandbox Code Playgroud)
我的功能出了什么问题?为什么我必须为我的数据添加前缀(我认为这是一个肮脏的解决方法,所以我想修复它)?
存储加密数据不是问题; 加密后立即解密而不将其存储到数据库会导致相同的错误.
你的问题是你正在接收方生成一个新的,不同的随机IV.正如您所见,这不起作用.
接收方需要知道发送方使用的IV; 所以你必须将它与加密数据一起发送并传递给它mcrypt_decrypt().
请注意,您还必须使用mhash()密钥(加密密钥的不同密钥)在消息上生成HMAC,并在接收方进行检查.如果不这样做,中间人可以在不检测到消息的情况下轻松修改部分消息.
| 归档时间: |
|
| 查看次数: |
2021 次 |
| 最近记录: |