首页 > 代码库 > [转]PHP,Android,IOS通信之AES128加解密

[转]PHP,Android,IOS通信之AES128加解密

转自:http://s00s10.blog.163.com/blog/static/43988552201411913011459/

android上使用:

mcrypt = new MCrypt();/* 加密*/String encrypted = MCrypt.bytesToHex( mcrypt.encrypt("需加密的字符") );/* 解密*/String decrypted = new String( mcrypt.decrypt( encrypted ) );

PHP上使用:

$mcrypt = new MCrypt();#Encrypt$encrypted = $mcrypt->encrypt("需加密的字符");#Decrypt$decrypted = $mcrypt->decrypt($encrypted);

IOS7上使用(xcode 5.0.1)

// 头部引用#import "Tool.h"// 加解密字符串NSString *string1 = @"fengzihua";NSString *encString = [Tool crypt:string1];NSLog(@"%@",encString); NSString *rawString = [Tool decrypt:encString];NSLog(@"%@",rawString); 

android代码:

/***********//**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 =http://www.mamicode.com/= null) {            return null;        }        int len = data.length;        String str = "";        for (int i = 0; i < len; i++) {            if ((data[i] & 0xFF) < 16)                str = str + "0" + java.lang.Integer.toHexString(data[i] & 0xFF);            else                str = str + java.lang.Integer.toHexString(data[i] & 0xFF);        }        return str;    }    public static byte[] hexToBytes(String str) {        if (str == null) {            return null;        } else if (str.length() < 2) {            return null;        } else {            int len = str.length() / 2;            byte[] buffer = new byte[len];            for (int i = 0; i < len; i++) {                buffer[i] = (byte) Integer.parseInt(str.substring(i * 2, i * 2 + 2), 16);            }            return buffer;        }    }    private static String padString(String source) {        char paddingChar = ‘ ‘;        int size = 16;        int x = source.length() % size;        int padLength = size - x;        for (int i = 0; i < padLength; i++) {            source += paddingChar;        }        return source;    }}

PHP代码:

/**********//**PHP**/
<?php         class MCrypt        {                private $iv = ‘fedcba9876543210‘; #和上面JAVA中的一样                private $key = ‘0123456789abcdef‘; #和上面JAVA中的一样                function __construct()                {                }                function encrypt($str) {                  //$key = $this->hex2bin($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 代码

/**********/

/**Tool.h**/#import <Foundation/Foundation.h>#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 =http://www.mamicode.com/ [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=http://www.mamicode.com/[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 deallocationreturn[NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];}free( buffer );//free the bufferreturnnil;}+(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 deallocationreturn[NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];}free(buffer);//free the buffer;returnnil;}+(NSString*) stringWithHexBytes:(NSData*)_data {NSMutableString*stringBuffer =[NSMutableString stringWithCapacity:([_data length]*2)];constunsignedchar*dataBuffer =[_data bytes];int i;for(i =0; i <[_data length];++i){[stringBuffer appendFormat:@"%02lX",(unsignedlong)dataBuffer[i]];}return[stringBuffer copy];}@end