2019-02-25/每天 5 个函数

mcrypt_encrypt / mcrypt_decrypt / md5 / md5_file / crypt

Posted by CHEN on February 25, 2019

一些建议,如下:

1. 记 PHP 函数

2. 学习优秀代码的思想

3. 不停写代码,十万行代码什么时候达到什么时候就 NB 了

4. 多尝试脱离任何固定思维去写东西、按自己的想法去做、然后你会遇到问题,总结起来

5. 反思自己写代码的套路与流程,敢于怀疑

从每天 5 个函数做起

一:mcrypt_encrypt()

mcrypt_encrypt — 使用给定参数加密明文

实例

<?php
    # --- 加密 ---
    
        # 密钥应该是随机的二进制数据,
        # 开始使用 scrypt, bcrypt 或 PBKDF2 将一个字符串转换成一个密钥
        # 密钥是 16 进制字符串格式
        $key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
        
        # 显示 AES-128, 192, 256 对应的密钥长度:
        #16,24,32 字节。
        $key_size =  strlen($key);
        echo "Key size: " . $key_size . "\n";
        
        $plaintext = "This string was AES-256 / CBC / ZeroBytePadding encrypted.";
    
        # 为 CBC 模式创建随机的初始向量
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        
    
        # 创建和 AES 兼容的密文(Rijndael 分组大小 = 128)
        # 仅适用于编码后的输入不是以 00h 结尾的
        # (因为默认是使用 0 来补齐数据)
        $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
                                     $plaintext, MCRYPT_MODE_CBC, $iv);
    
        # 将初始向量附加在密文之后,以供解密时使用
        $ciphertext = $iv . $ciphertext;
        
        # 对密文进行 base64 编码
        $ciphertext_base64 = base64_encode($ciphertext);
    
        echo  $ciphertext_base64 . "\n";
    
        # === 警告 ===
    
        # 密文并未进行完整性和可信度保护,
        # 所以可能遭受 Padding Oracle 攻击。
        
        # --- 解密 ---
        
        $ciphertext_dec = base64_decode($ciphertext_base64);
        
        # 初始向量大小,可以通过 mcrypt_get_iv_size() 来获得
        $iv_dec = substr($ciphertext_dec, 0, $iv_size);
        
        # 获取除初始向量外的密文
        $ciphertext_dec = substr($ciphertext_dec, $iv_size);
    
        # 可能需要从明文末尾移除 0
        $plaintext_dec = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key,
                                        $ciphertext_dec, MCRYPT_MODE_CBC, $iv_dec);
        
        echo  $plaintext_dec . "\n";

返回结果

Key size: 32
ENJW8mS2KaJoNB5E5CoSAAu0xARgsR1bdzFWpEn+poYw45q+73az5kYi4j+0haevext1dGrcW8Qi59txfCBV8BBj3bzRP3dFCp3CPQSJ8eU=
This string was AES-256 / CBC / ZeroBytePadding encrypted.

二:mcrypt_decrypt()

mcrypt_decrypt — 使用给定参数解密密文

三:md5()

md5() 函数计算字符串的 MD5 散列

实例

<?php
    $str = "Shanghai";
    echo "字符串:".$str."<br>";
    echo "TRUE - 原始 16 字符二进制格式:".md5($str, TRUE)."<br>";
    echo "FALSE - 32 字符十六进制格式:".md5($str)."<br>";
?>

返回结果

字符串:Shanghai
TRUE - 原始 16 字符二进制格式:Tf頦+饲X0蠨鎗�)�
FALSE - 32 字符十六进制格式:5466ee572bcbc75830d044e66ab429bc

四:md5_file()

md5_file() 函数计算文件的 MD5 散列

实例

<?php
    $filename = "test.txt";
    $md5file = md5_file($filename);
    echo $md5file;

返回结果

d41d8cd98f00b204e9800998ecf8427e

五:crypt()

crypt() 函数返回使用 DES、Blowfish 或 MD5 算法加密的字符串