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 == 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加解密,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。