wecenter學(xué)習(xí)筆記-對(duì)稱(chēng)加密

該文是wecenter學(xué)習(xí)筆記的一部分

對(duì)稱(chēng)加密

php對(duì)稱(chēng)加密介紹

參照 塊密碼的工作方式

基本的思路:

  1. 將數(shù)據(jù)切分成固定大小的數(shù)據(jù)塊(分組)處理

    對(duì)確定長(zhǎng)度的分組數(shù)據(jù)處理時(shí)(ECB/CBC),如果最后一塊的數(shù)據(jù)不足一塊(16字節(jié)),需要進(jìn)行填充,比如

    PKCS#5

    • 在最后一塊末尾填充5個(gè)字節(jié)的0x05(填充的字節(jié)都是一個(gè)相同的字節(jié),該字節(jié)的值,就是要填充的字節(jié)的個(gè)數(shù))
    • 如果數(shù)據(jù)剛好一塊數(shù)據(jù),則附加一整塊的0xFF(16字節(jié)的填充Ox10)
  1. 根據(jù)不同的加密模式和算法對(duì)數(shù)據(jù)塊加密

wecenter將用戶(hù)信息(uid、用戶(hù)名、密碼)通過(guò)對(duì)稱(chēng)加密的方式存儲(chǔ)到cookie中。

** 支持各種加密模式 **

除ECB和CBC是固定塊長(zhǎng)度加密外,其它的(CFB/OFB/CTR)都是可變塊長(zhǎng)度加密。

  • MCRYPTE_MODEL_ECB(Electronic codebook,電子密碼本)

    數(shù)據(jù)塊各自加密,數(shù)據(jù)塊直接互不相關(guān)

    優(yōu)點(diǎn):

    1. 簡(jiǎn)單;
    2. 有利于并行計(jì)算;
    3. 誤差不會(huì)被傳送;

    缺點(diǎn):

    1. 不能隱藏明文的模式;
    2. 可能對(duì)明文進(jìn)行主動(dòng)攻擊;
  • MCRYPTE_MODEL_CBC(Cipher-block chaining,密碼塊鏈)

    上一塊的密文塊和當(dāng)前明文塊做xor運(yùn)算后再做加密
    優(yōu)點(diǎn):

    1. 不容易主動(dòng)攻擊,安全性好于ECB,適合傳輸長(zhǎng)度長(zhǎng)的報(bào)文,是SSL、IPSec的標(biāo)準(zhǔn)。

    缺點(diǎn):

    1. 不利于并行計(jì)算;
    2. 誤差傳遞;
    3. 需要初始化向量IV
  • MCRYPTE_MODEL_CFB(Cipher feedback,密碼反饋)

    將前一塊加密后輸出和當(dāng)前明文塊做xor運(yùn)算后形成新的密文流入下一塊的加密過(guò)程

    優(yōu)點(diǎn):

    1. 隱藏了明文模式;
    2. 分組密碼轉(zhuǎn)化為流模式;
    3. 可以及時(shí)加密傳送小于分組的數(shù)據(jù);

    缺點(diǎn):

    1. 不利于并行計(jì)算;
    2. 誤差傳送:一個(gè)明文單元損壞影響多個(gè)單元;
    3. 唯一的IV;
  • MCRYPTE_MODEL_NCFB(N bits Cipher feedback, N位密碼反饋模式)

    與CFB過(guò)程一樣,只是每次僅將前一塊加密后輸出的高n位和當(dāng)前明文塊高n位xor

  • MCRYPTE_MODEL_OFB(Output Feedback, 輸出反饋模式)

    將前一塊的加密后的輸出流入下一塊的加密過(guò)程,而將明文塊和加密后的輸出做xor作為密文塊

  • MCRYPTE_MODEL_NOFB(N bits output feedback, N位輸出反饋模式)

    與NOFB過(guò)程一樣,只是每次僅將前一塊加密后輸出的高n位流入下個(gè)過(guò)程

  • MCRYPTE_MODEL_CTR

    先將一個(gè)自增的算子加密,然后將密文與明文做xor,這樣相當(dāng)于每次秘鑰都不一樣。

  • MCRYPTE_MODEL_STREAM

    !!! 沒(méi)有搞清楚

** PHP通過(guò)mcrypt加密擴(kuò)展函數(shù),可以支持各種加密算法 **

MCRYPT_ciphername

  • des
  • rc2
  • cast-128
  • cast-256
  • gost
  • rijndael-128
  • rijndael-192
  • rijndael-256
  • twofish
  • arcfour
  • loki97
  • saferplus
  • wake
  • serpent
  • xtea
  • blowfish
  • blowfish-compat
  • enigma
  • tripledes

mcrypt使用

** 加密 **

system/core/crypte.php#encode

public function encode($data, $key = null)
{
    $mcrypt = mcrypt_module_open($this->get_algorithms(), '', MCRYPT_MODE_ECB, '');

    mcrypt_generic_init($mcrypt, $this->get_key($mcrypt, $key), mcrypt_create_iv(mcrypt_enc_get_iv_size($mcrypt), MCRYPT_RAND));

    $result = mcrypt_generic($mcrypt, gzcompress($data));

    mcrypt_generic_deinit($mcrypt);
    mcrypt_module_close($mcrypt);

    return $this->get_algorithms() . '|' . $this->str_to_hex($result);
}

步驟:

  1. 根據(jù)加密算法和加密模式獲取加密模塊
  2. 初始化隨機(jī)向量
  3. 初始化加密器
  4. 加密
  5. 釋放資源
  6. 關(guān)閉加密模塊

** 解密

system/core/crypte.php#decode

public function decode($data, $key = null)
{
   if (strstr($data, '|'))
   {
        $decode_data = explode('|', $data);

        $algorithm = $decode_data[0];

       $data = str_replace($algorithm . '|', '', $data);

       $data = $this->hex_to_str($data);
   }
   else
   {
       $algorithm = $this->get_algorithms();

       $data = base64_decode($data);
   }

   $mcrypt = mcrypt_module_open($algorithm, '', MCRYPT_MODE_ECB, '');

   mcrypt_generic_init($mcrypt, $this->get_key($mcrypt, $key), mcrypt_create_iv(mcrypt_enc_get_iv_size($mcrypt), MCRYPT_RAND));

   $result = trim(mdecrypt_generic($mcrypt, $data));

   mcrypt_generic_deinit($mcrypt);
   mcrypt_module_close($mcrypt);

   return gzuncompress($result);
}

步驟:

  1. 根據(jù)加密算法和加密模式獲取模塊
  2. 初始化隨機(jī)向量
  3. 初始化加密器
  4. 解密密
  5. 釋放資源
  6. 關(guān)閉模塊

上傳圖片并生成縮略圖 ←o→ 國(guó)際化和多語(yǔ)言

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容