转自: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 == 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 = [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 returnnil; } +(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; 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
[转]PHP,Android,IOS通信之AES128加解密
时间: 2024-10-08 18:08:48