對稱加密
對稱加密算法是指,數據發信方將明文(原始數據)和密鑰一起經過加密處理後,使其變成複雜的加密密文發送出去。收信方收到密文後,若要解讀原文,則需要使用加密密鑰及相關算法的逆算法對密文進行解密,使其恢復可讀明文。
優點:算法公開、計算量小、加密速度快、加密效率高,適合於加密大量數據的場合
常用算法:DES、3DES、TDEA、RC2、RC4、IDEA、AES等
AES是Advanced Encryption Standard(高級加密標準)的縮寫,在密碼學中又稱Rijndael加密發,是美國聯邦政府採用的一種區塊加密標準。
在PHP的mcrypt擴展中,rijndael-128、rijndael-192、rijndael-256就是AES加密,三種分別使用不同的數據塊和密碼長度進行加密
在AES的ECB模式中,一般是16字節爲一塊,然後對這一整塊進行加密,如果輸入字符不夠16字節,就需要補位
AES-ECS方式進行加密數據代碼如下:
$auth_key = "safe_key";
$salt = '!@#$%';
$content = "hello world";
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key_size = mcrypt_enc_get_key_size($td);
$key = substr(md5($auth_key.$salt), 0, $key_size);
mcrypt_generic_init($td, $key, $iv);
$block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$pad = $block - (strlen($content) % $block);
$content .= str_repeat(chr($pad), $pad); // 補齊不足16字節的位數內容
$secret = mcrypt_generic($td, $content);
echo bin2hex($secret);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
AES-ECS方式進行解密數據代碼如下:
$auth_key = "safe_key";
$salt = '!@#$%';
$secret = "d639e78sf4b43rfer243t4t43tre";
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key_size = mcrypt_enc_get_key_size($td);
$key = substr(md5($auth_key.$salt), 0, $key_size);
mcrypt_generic_init($td, $key, $iv);
$content = mdecrypt_generic($td, hex2bin($secret));
$len = strlen($content);
$ch = ord($content[$len - 1]);
echo substr($content, 0, $len - $ch);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
使用DES加密
使用DES加密代碼如下
$auth_key = 'safe_key';
$salt = '!@#$%';
$content = 'helloworld';
$td = mcrypt_module_open(MCRYPT_DES, '', 'ecb', ''); // 使用MCRYPT_DES算法,ecb模式
$iv_size = mcrypt_enc_get_iv_size($td);// 設置初始化向量大小
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); // 創建初始向量
$key_size = mcrypt_enc_get_key_size($td);// 返回支持的最大密鑰長度
$key = substr(md5($auth_key.$salt), 0, $key_size);
mcrypt_generic_init($td, $key, $iv);// 初始化
$secret = mcrypt_generic($td, $content);// 加密並返回加密的內容
echo base64_encode($secret);
mcrypt_generic_deinit($td);
mcrypt_module_close($td); // 結束
使用DES解密代碼如下
$auth_key = 'safe_key'; $salt = '!@#$%'; $secret = 'nzPa0jPaaNca+Yty/HG4PA=='; $td = mcrypt_module_open(MCRYPT_DES, '', 'ecb', ''); // 使用MCRYPT_DES算法,ecb模式 $iv_size = mcrypt_enc_get_iv_size($td);// 設置初始化向量大小 $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); // 創建初始向量 $key_size = mcrypt_enc_get_key_size($td);// 返回支持的最大密鑰長度 $key = substr(md5($auth_key.$salt), 0, $key_size); mcrypt_generic_init($td, $key, $iv);// 初始化 $content = mdecrypt_generic($td, base64_encode($secret)); // 解密並返回內容 echo $content; mcrypt_generic_deinit($td); mcrypt_module_close($td); // 結束