ecb 是最简单的,也有弱点,所以不推荐(http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation)。 cbc 被认为明显强于 ecb。其他一些可能比 cbc 更强大,但它们都与流相关,因此 cbc 应该适合您的需求。
来自...http://us.php.net/manual/en/mcrypt.constants.php...
- MCRYPT_MODE_ECB(电子密码本)适用于随机数据,例如加密其他密钥。由于数据较短且随机,ECB的缺点具有良好的负面影响。
- MCRYPT_MODE_CBC(密码块链接)特别适用于加密安全性比 ECB 显着提高的文件。
- MCRYPT_MODE_CFB(密码反馈)是加密必须加密单个字节的字节流的最佳模式。
- MCRYPT_MODE_OFB(输出反馈,8 位)与 CFB 相当,但可用于不能容忍错误传播的应用。它不安全(因为它在 8 位模式下运行),因此不建议使用它。
- MCRYPT_MODE_NOFB(输出反馈,以 nbit 为单位)与 OFB 相当,但更安全,因为它对算法的块大小进行操作。
- MCRYPT_MODE_STREAM 是一种额外模式,包含一些流算法,例如“WAKE”或“RC4”。
我不确定为什么不推荐使用 MCRYPT_RAND,但这可能是因为许多系统上的系统随机数生成器不被认为是真正随机的。只有两种选择,根据您的系统和 PHP 版本,它们可能不可用。来自...http://php.net/manual/en/function.mcrypt-create-iv.php...
- IV 源可以是 MCRYPT_RAND(系统随机数生成器)、MCRYPT_DEV_RANDOM(从 /dev/random 读取数据)和 MCRYPT_DEV_URANDOM(从 /dev/urandom 读取数据)。在 5.3.0 之前,MCRYPT_RAND 是 Windows 上唯一支持的。
下面的代码只是一个简单的示例。它有效,但我无法证明它的强度。
";
$encryptedData = $objEncManager->mcryptEncryptString( $sensitiveData );
回声“编码数据:_”。 $加密数据。 "_
";
echo "Enc 数据长度:" . strlen($encryptedData) 。 "
";
$decryptedData = $objEncManager->mcryptDecryptString($encryptedData, $objEncManager->lastIv);
回声“D-enc 数据:_”。 $解密数据。 "_
";
回声“IV:_”。 $objEncManager->lastIv 。 "_
";
/*
* 注意:这些函数不能准确处理数据
*被加密有尾随空格,所以数据
* 由他们加密的不能有任何。前导空格是可以的。
*
* 注意:如果您的数据需要通过非二进制安全介质传递,您应该
* base64_encode 但这会使数据大 33%。
*
* 注意:解密IV必须与加密IV相同所以加密
* IV 必须与加密数据一起存储或传输。
* 来自 (http://php.net/manual/en/function.mcrypt-create-iv.php)...
*“IV 只是为了给加密例程提供一个替代种子。
* 这个 IV 根本不需要保密,尽管它可能是可取的。
*您甚至可以将其与您的密文一起发送而不会失去安全性。”
*
* 注意:这些方法不会对各种 mcrypt 函数的成功进行任何错误检查
*/
类数据加密器
{
常量 MY_MCRYPT_CIPHER = MCRYPT_RIJNDAEL_256;
常量 MY_MCRYPT_MODE = MCRYPT_MODE_CBC;
const MY_MCRYPT_KEY_STRING = "1234567890-abcDEFGHUzyxwvutsrqpo"; // 这应该是一个随机字符串,推荐32字节
公共 $lastIv = '';
公共函数 __construct()
{
// 没做什么
}
/**
* 接受明文字符串并返回加密版本
*/
公共函数 mcryptEncryptString( $stringToEncrypt, $base64encoded = true )
{
// 设置初始化向量
$iv_size = mcrypt_get_iv_size(self::MY_MCRYPT_CIPHER, self::MY_MCRYPT_MODE);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$this->lastIv = $iv;
// 加密数据
$encryptedData = mcrypt_encrypt(self::MY_MCRYPT_CIPHER, self::MY_MCRYPT_KEY_STRING, $stringToEncrypt, self::MY_MCRYPT_MODE, $iv);
// 数据可能需要通过非二进制安全介质传递,因此如有必要,请对其进行 base64_encode。 (使数据大 33%)
if ( $base64encoded ) {
$encryptedData = base64_encode($encryptedData);
$this->lastIv = base64_encode($iv);
} 别的 {
$this->lastIv = $iv;
}
// 返回加密数据
返回$加密数据;
}
/**
* 接受明文字符串并返回加密版本
*/
公共函数 mcryptDecryptString( $stringToDecrypt, $iv, $base64encoded = true )
{
// 注意:解密IV必须与加密IV相同,所以加密时必须存储加密IV
// 数据可能已经过base64_encoded,因此如有必要,请对其进行解码(必须在解密之前)
if ( $base64encoded ) {
$stringToDecrypt = base64_decode( $stringToDecrypt );
$iv = base64_decode($iv);
}
//解密数据
$decryptedData = mcrypt_decrypt(self::MY_MCRYPT_CIPHER, self::MY_MCRYPT_KEY_STRING, $stringToDecrypt, self::MY_MCRYPT_MODE, $iv);
// 返回解密后的数据
返回 rtrim($decryptedData); // 需要 rtrim 来删除加密期间添加的填充
}
}
?>