首页 > 代码库 > [转]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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。