国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

AES128位,CBC模式加解密

JinB / 3228人閱讀

摘要:使用原因因為在項目中,需要在與客戶端交互的時候,保存一些私有信息,不被別人看到,所以,使用了比較流行的可以反向加解密的。

使用原因:

因為在項目中,需要在與客戶端(IOS,Android)交互的時候,保存一些私有信息,不被別人看到,所以,使用了比較流行的可以反向加解密的AES。

PHP 源碼
aes128cbcEncrypt("11122222");
echo "
";
echo $aes->aes128cbcEncrypt("中文aes演示");
echo "
";
class aes{
    const KEY="625202f9149e061d";
    const IV ="5efd3f6060e20330";
    /**
     * pkcs7補碼
     * @param string $string  明文
     * @param int $blocksize Blocksize , 以 byte 為單位
     * @return String
     */ 
    private function addPkcs7Padding($string, $blocksize = 32) {
        $len = strlen($string); //取得字符串長度
        $pad = $blocksize - ($len % $blocksize); //取得補碼的長度
        $string .= str_repeat(chr($pad), $pad); //用ASCII碼為補碼長度的字符, 補足最后一段
        return $string;
    }

    /**
     * 加密然后base64轉碼
     * 
     * @param String 明文
     * @param 加密的初始向量(IV的長度必須和Blocksize一樣, 且加密和解密一定要用相同的IV)
     * @param $key 密鑰
     */
    function aes256cbcEncrypt($str, $iv, $key ) {   
        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $this->addPkcs7Padding($str) , MCRYPT_MODE_CBC, $iv));
    }

    /**
     * 除去pkcs7 padding
     * 
     * @param String 解密后的結果
     * 
     * @return String
     */
    private function stripPkcs7Padding($string){
        $slast = ord(substr($string, -1));
        $slastc = chr($slast);
        $pcheck = substr($string, -$slast);

        if(preg_match("/$slastc{".$slast."}/", $string)){
            $string = substr($string, 0, strlen($string)-$slast);
            return $string;
        } else {
            return false;
        }
    }
    /**
     * 解密
     * 
     * @param String $encryptedText 二進制的密文 
     * @param String $iv 加密時候的IV
     * @param String $key 密鑰
     * @return String
     */
    function aes256cbcDecrypt($encryptedText, $iv, $key) {
        $encryptedText =base64_decode($encryptedText);
        return $this->stripPkcs7Padding(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encryptedText, MCRYPT_MODE_CBC, $iv));
    }

    function aes128cbcDecrypt($encryptedText, $iv=self::IV, $key=self::KEY) {
        $encryptedText =base64_decode($encryptedText);
        return $this->stripPkcs7Padding(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encryptedText, MCRYPT_MODE_CBC, $iv));
    }

    function hexToStr($hex)//十六進制轉字符串
    {   
        $string=""; 
        for($i=0;$ihexToStr($encryptedText);
        return $this->stripPkcs7Padding(mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_CBC, $iv));
    }

    function aes128cbcEncrypt($str, $iv=self::IV, $key=self::KEY ) {    // $this->addPkcs7Padding($str,16)
        $base = (mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,$this->addPkcs7Padding($str,16) , MCRYPT_MODE_CBC, $iv));
        return $this->strToHex($base);
    }
}
運行結果

在線驗證加解密結果

驗證地址
http://www.seacha.com/tools/aes.html

IOS 源碼
@implementation NSString (AES256)
-(NSString *) aes256_encrypt:(NSString *)key
{
    const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];
    NSData *data = [NSData dataWithBytes:cstr length:self.length];
    //對數據進行加密
    NSData *result = [data aes256_encrypt:key];

    //轉換為2進制字符串
    if (result && result.length > 0) {

        Byte *datas = (Byte*)[result bytes];
        NSMutableString *output = [NSMutableString stringWithCapacity:result.length * 2];
        for(int i = 0; i < result.length; i++){
            [output appendFormat:@"%02x", datas[i]];
        }
        return output;
    }
    return nil;
}

-(NSString *) aes256_decrypt:(NSString *)key
{
    //轉換為2進制Data
    NSMutableData *data = [NSMutableData dataWithCapacity:self.length / 2];
    unsigned char whole_byte;
    char byte_chars[3] = {"