拽拽
管理员组

PHP,Android,IOS通信之 AES128加解密 互相兼容版

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
   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


#1楼
发帖时间:2016-5-19   |   查看数:0   |   回复数:0
游客组