如何在PHP中复制MySQL的aes-256-cbc
发布时间:2020-12-13 16:00:12 所属栏目:PHP教程 来源:网络整理
导读:使用 this文章作为指南,我能够在PHP中成功复制MySQL的aes-128-ecb: final class Encryption{ // The key const KEY = '36F3D40A7A41A827968BE75A87D60950'; /** * Encrypt a string * * @access public * @static * @param string $string * @return string
使用
this文章作为指南,我能够在PHP中成功复制MySQL的aes-128-ecb:
final class Encryption { // The key const KEY = '36F3D40A7A41A827968BE75A87D60950'; /** * Encrypt a string * * @access public * @static * @param string $string * @return string */ public static function encrypt($string) { return mcrypt_encrypt(MCRYPT_RIJNDAEL_128,self::getMySQLKey(self::KEY),self::getPaddedString($string),MCRYPT_MODE_ECB); } /** * Decrypt a string * * @access public * @static * @param string $string * @return string */ public static function decrypt($string) { return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_128,$string,MCRYPT_MODE_ECB),"x00..x10"); } /** * Get MySQL key * * @access public * @static * @param string $key * @return string */ public static function getMySQLKey($key) { // The new key $new_key = str_repeat(chr(0),16); // Iterate over the key and XOR for ($i = 0,$l = strlen($key); $i < $l; ++$i) { $new_key[$i % 16] = $new_key[$i % 16] ^ $key[$i]; } // Return the new key return $new_key; } /** * Get padded string * * @access public * @static * @param string $string * @return string */ public static function getPaddedString($string) { return str_pad($string,(16 * (floor(strlen($string) / 16) + 1)),chr(16 - (strlen($string) % 16))); } } 举个例子: // PHP,gives CJI+zJyviQI7GgSCLGMNsqsXq2MDKC3a9FIG3wDrE8Y= base64_encode(Encryption::encrypt('michael@example.com')) // MySQL,gives CJI+zJyviQI7GgSCLGMNsqsXq2MDKC3a9FIG3wDrE8Y= SELECT TO_BASE64(AES_ENCRYPT('michael@example.com','36F3D40A7A41A827968BE75A87D60950')); 但是,我想更新为使用aes-256-cbc但遇到困难.我首先用MCRYPT_RIJNDAEL_256替换MCRYPT_RIJNDAEL_128,用MCRYPT_MODE_CBC替换MCRYPT_MODE_ECB,并使用KEY常量作为初始化向量: /** * Encrypt a string * * @access public * @static * @param string $string * @return string */ public static function encrypt($string) { return mcrypt_encrypt(MCRYPT_RIJNDAEL_256,MCRYPT_MODE_CBC,self::KEY); } /** * Decrypt a string * * @access public * @static * @param string $string * @return string */ public static function decrypt($string) { return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256,self::KEY),"x00..x10"); } 问题是我现在从PHP和MySQL获得不同的值: // PHP,gives XSRfnrl05CE7JIHCvfhq6D67O0mAW2ayrFv2YkjFVYI= base64_encode(Encryption::encrypt('michael@example.com')) // MySQL,gives lTLT4MRXcHnOAsYjlwUX4WVPHgYvyi6nKC4/3us/VF4= SELECT TO_BASE64(AES_ENCRYPT('michael@example.com','36F3D40A7A41A827968BE75A87D60950','36F3D40A7A41A827968BE75A87D60950')); 我不确定从哪里开始,所以任何帮助将不胜感激. 并且只是为了确认MySQL确实使用了正确的加密方法: // aes-256-cbc SELECT @@session.block_encryption_mode 解决方法
AES是Rijndael的子集,因此要将其用于AES,必须选择128位的块大小和128,192或256位的密钥大小.
MCRYPT_RIJNDAEL_256指定256位的块大小,而不是密钥大小,类似地,MCRYPT_RIJNDAEL_128指定128位的块大小,而不是密钥大小.这是一个常见的混乱. Rijndael auto的这种实现基于传递的密钥选择密钥大小,因此使用完全正确的所需大小的密钥非常重要. 另请注意,iv长度与块大小相同,因此对于AES,其长度为128位. 这是一个很好的例子,说明不良命名会带来不幸的后果. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |