PHP,Android,IOS通信之 AES128加解密案例程序

PHP,Android,IOS通信之 AES128加解密案例程序android上調(diào)用代碼:


mcrypt = new MCrypt();/* 加密*/String encrypted = MCrypt.bytesToHex( mcrypt.encrypt("需加密的字符") );/* 解密*/String decrypted = new String( mcrypt.decrypt( encrypted ) );PHP上調(diào)用的代碼:$mcrypt = new MCrypt();#Encrypt$encrypted = $mcrypt->encrypt("需加密的字符");#Decrypt$decrypted = $mcrypt->decrypt($encrypted);IOS上調(diào)用的代碼:#import "Tool.h"http:// 加解密字符串NSString *string1 = @"fengzihua";NSString *encString = [Tool crypt:string1];NSLog(@"%@",encString); NSString *rawString = [Tool decrypt:encString];NSLog(@"%@",rawString); android實(shí)現(xiàn)加解密的代碼:/***********//**JAVA**/import java.security.NoSuchAlgorithmException;import javax.crypto.Cipher;import javax.crypto.NoSuchPaddingException;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;public class MCrypt {private String iv = "fedcba9876543210";//虛擬的 iv (需更改) private IvParameterSpec ivspec; private SecretKeySpec keyspec; private Cipher cipher; private String SecretKey = "0123456789abcdef";//虛擬的 密鑰 (需更改) public MCrypt() { ivspec = new IvParameterSpec(iv.getBytes()); keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES"); try { cipher = Cipher.getInstance("AES/CBC/NoPadding"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public byte[] encrypt(String text) throws Exception { if(text == null || text.length() == 0) throw new Exception("Empty string"); byte[] encrypted = null; try { cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); encrypted = cipher.doFinal(padString(text).getBytes()); } catch (Exception e) { throw new Exception("[encrypt] " + e.getMessage()); } return encrypted; } public byte[] decrypt(String code) throws Exception { if(code == null || code.length() == 0) throw new Exception("Empty string"); byte[] decrypted = null; try { cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); decrypted = cipher.doFinal(hexToBytes(code)); } catch (Exception e) { throw new Exception("[decrypt] " + e.getMessage()); } return decrypted; } public static String bytesToHex(byte[] data) { if (data==null) { return null; } int len = data.length; String str = ""; for (int i=0; ihex2bin($key); $iv = $this->iv; $td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv); mcrypt_generic_init($td, $this->key, $iv); $encrypted = mcrypt_generic($td, $str); mcrypt_generic_deinit($td); mcrypt_module_close($td); return bin2hex($encrypted); } function decrypt($code) { //$key = $this->hex2bin($key); $code = $this->hex2bin($code); $iv = $this->iv; $td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv); mcrypt_generic_init($td, $this->key, $iv); $decrypted = mdecrypt_generic($td, $code); mcrypt_generic_deinit($td); mcrypt_module_close($td); return utf8_encode(trim($decrypted)); } protected function hex2bin($hexdata) { $bindata = ''; for ($i = 0; $i < strlen($hexdata); $i += 2) { $bindata .= chr(hexdec(substr($hexdata, $i, 2))); } return $bindata; } }

、、、


IOS實(shí)現(xiàn)加解密的代碼:/**********//**Tool.h**/#import#import "CommonCrypto/CommonCrypto.h"

@interface Tool : NSObject

+ (NSString*) crypt:(NSString*)recource;

+ (NSString*) decrypt:(NSString*)recource;

@end

/**Tool.m**/

#import "Tool.h"

#define kCryptingKey @"0123456789abcdef"? /// 同上

#define kCryptingIv @"fedcba9876543210"? /// 同上

@implementation Tool

+ (NSString*) crypt:(NSString*)recource

{

? ? NSData *data = [recource dataUsingEncoding:NSUTF8StringEncoding];

? ? NSData *encrypt = [self AES128EncryptWithKey:kCryptingKey withData:data iv:kCryptingIv];

? ? return [self stringWithHexBytes:encrypt];

}

+ (NSString*) decryptData:(NSData*)recource

{

? ? NSData *decrypt = [self AES128DecryptWithKey:kCryptingKey withData:recource iv:kCryptingIv];

? ? return [[NSString alloc] initWithData:decrypt encoding:NSUTF8StringEncoding];

}

+ (NSString*) decrypt:(NSString*)recource

{

? ? NSData* data=[self decodeFromHexidecimal:recource];

? ? NSData *decrypt = [self AES128DecryptWithKey:kCryptingKey withData:data iv:kCryptingIv];

? ? return [[NSString alloc] initWithData:decrypt encoding:NSUTF8StringEncoding];

}

+ (NSData *) decodeFromHexidecimal:(NSString*)str

{

? ? NSString *command = [NSString stringWithString:str];

? ? command = [command stringByReplacingOccurrencesOfString:@" " withString:@""];

? ? NSMutableData *commandToSend = [[NSMutableData data] init];

? ? unsigned char whole_byte;

? ? char byte_chars[3] = {'\0','\0','\0'};

? ? int i;

? ? for (i=0; i < [command length]/2; i++) {

? ? ? ? byte_chars[0] = [command characterAtIndex:i*2];

? ? ? ? byte_chars[1] = [command characterAtIndex:i*2+1];

? ? ? ? whole_byte = strtol(byte_chars, NULL, 16);

? ? ? ? [commandToSend appendBytes:&whole_byte length:1];

? ? }

? ? return commandToSend;

}

+ (NSData *)AES128EncryptWithKey:(NSString *)key withData:(NSData*)_data iv:(NSString *) iv

{

? ? char keyPtr[kCCKeySizeAES128 + 1];

? ? memset(keyPtr, 0, sizeof(keyPtr));

? ? [key getCString:keyPtr maxLength:sizeof( keyPtr ) encoding:NSUTF8StringEncoding];


? ? char ivPtr[kCCBlockSizeAES128 + 1];

? ? memset(ivPtr, 0, sizeof(ivPtr));

? ? [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];


? ? NSUInteger dataLength = [_data length];


? ? int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);

? ? unsigned long int newSize = 0;


? ? if(diff > 0)

? ? {

? ? ? ? newSize = dataLength + diff;

? ? }


? ? char dataPtr[newSize];

? ? memcpy(dataPtr, [_data bytes], [_data length]);

? ? for(int i = 0; i < diff; i++)

? ? {

? ? ? ? dataPtr[i + dataLength] = 0x00;

? ? }


? ? size_t bufferSize = newSize + kCCBlockSizeAES128;


? ? void *buffer = malloc( bufferSize );

? ? memset(buffer, 0, bufferSize);


? ? size_t numBytesEncrypted = 0;

? ? CCCryptorStatus cryptStatus = CCCrypt( kCCEncrypt, kCCAlgorithmAES128, 0x0000,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? keyPtr, kCCKeySizeAES128,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ivPtr,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dataPtr,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? sizeof(dataPtr),

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? buffer, bufferSize, /* output */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &numBytesEncrypted );

? ? if( cryptStatus == kCCSuccess )

? ? {

? ? ? ? //the returned NSData takes ownership of the buffer and will free it on deallocation

? ? ? ? return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

? ? }


? ? free( buffer ); //free the buffer

? ? return nil;

}

+ (NSData *)AES128DecryptWithKey:(NSString *)key withData:(NSData*)data iv:(NSString *) iv

{

? ? char keyPtr[kCCKeySizeAES128 + 1];

? ? memset(keyPtr, 0, sizeof(keyPtr));

? ? [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];


? ? char ivPtr[kCCBlockSizeAES128 + 1];

? ? memset(ivPtr, 0, sizeof(ivPtr));

? ? [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

? ? NSUInteger dataLength = [data length];


? ? size_t bufferSize = dataLength + kCCBlockSizeAES128;

? ? void *buffer = malloc(bufferSize);


? ? size_t numBytesDecrypted = 0;

? ? CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,? 0x0000,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? keyPtr, kCCBlockSizeAES128,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ivPtr,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? [data bytes],

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? dataLength,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? buffer, bufferSize, /* output */

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &numBytesDecrypted);

? ? if (cryptStatus == kCCSuccess) {

? ? ? ? //the returned NSData takes ownership of the buffer and will free it on deallocation

? ? ? ? return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

? ? }


? ? free(buffer); //free the buffer;

? ? return nil;

}

+ (NSString*) stringWithHexBytes:(NSData*)_data {

? ? NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:([_data length] * 2)];

? ? const unsigned char *dataBuffer = [_data bytes];

? ? int i;

? ? for (i = 0; i < [_data length]; ++i) {

? ? ? ? [stringBuffer appendFormat:@"%02lX", (unsigned long)dataBuffer[i]];

? ? }

? ? return [stringBuffer copy];

}

@end

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捂寿,一起剝皮案震驚了整個(gè)濱河市看疗,隨后出現(xiàn)的幾起案子余寥,更是在濱河造成了極大的恐慌,老刑警劉巖栏饮,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吊说,死亡現(xiàn)場(chǎng)離奇詭異论咏,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)颁井,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門厅贪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蚤蔓,你說(shuō)我怎么就攤上這事『啵” “怎么了秀又?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵单寂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我吐辙,道長(zhǎng)宣决,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任昏苏,我火速辦了婚禮尊沸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贤惯。我一直安慰自己洼专,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布孵构。 她就那樣靜靜地躺著屁商,像睡著了一般。 火紅的嫁衣襯著肌膚如雪颈墅。 梳的紋絲不亂的頭發(fā)上蜡镶,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音恤筛,去河邊找鬼官还。 笑死,一個(gè)胖子當(dāng)著我的面吹牛毒坛,可吹牛的內(nèi)容都是我干的望伦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼粘驰,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼屡谐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蝌数,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤愕掏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后顶伞,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饵撑,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年唆貌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滑潘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡锨咙,死狀恐怖语卤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤粹舵,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布钮孵,位于F島的核電站,受9級(jí)特大地震影響眼滤,放射性物質(zhì)發(fā)生泄漏巴席。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一诅需、第九天 我趴在偏房一處隱蔽的房頂上張望漾唉。 院中可真熱鬧,春花似錦堰塌、人聲如沸赵刑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)料睛。三九已至,卻和暖如春摇邦,著一層夾襖步出監(jiān)牢的瞬間恤煞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工施籍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留居扒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓丑慎,卻偏偏與公主長(zhǎng)得像喜喂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竿裂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容