摘要:使用原因因為在項目中,需要在與客戶端交互的時候,保存一些私有信息,不被別人看到,所以,使用了比較流行的可以反向加解密的。
使用原因:
因為在項目中,需要在與客戶端(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;$i運行結果 在線驗證加解密結果hexToStr($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
@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] = {"