[转]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加解密

时间: 2024-10-08 18:08:48

[转]PHP,Android,IOS通信之AES128加解密的相关文章

java与IOS之间的RSA加解密

很简单的一个需求,ipad端给密码RSA加密,传到java后台,解密.RSA加密算法是基于一个密钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密.还可以验签,就是先用私钥对数据进行加密,然后对加密后的数据进行签名,得到一个签名值.然后再用公钥先验签,证明是对应私钥加密过的数据才解密.主要是为了防止来源不确定的数据.     根据上面的介绍,大家也都知道,RSA算法的关键就是密钥对,我和IOS的同事各自找了RSA的算法实现代码,都能正常根据密钥对加解密.问题是我们各自使

利用BBRSACryptor实现iOS端的RSA加解密

背景 RSA这种非对称加密被广泛的运用于网络数据的传输,但其在iOS上很难直接实现,BBRSACryptor框架通过移植openssl实现了iOS端的RSA,本文将介绍如何使用BBRSACryptor生成证书,加载公钥,以及后端如何用php读取证书,加载私钥. iOS加密 新建工程并集成BBRSACryptor 这个框架自带的demo将工程文件与框架放在了同一目录,因此在配置Header Search Paths时没有包含工程文件夹,一定注意,下面新建的工程将框架放在了工程文件夹内,因此头文件寻

Android 与 SUN JAVA RSA 加解密不同之处

默认情况下无法通用因为默认的填充方式不同. 做以下处理能够到达一致: android: Cipher cipher = Cipher.getInstance("RSA/None/NoPadding"); sun java: Cipher cipher = Cipher.getInstance("RSA", new org.bouncycastle.jce.provider.BouncyCastleProvider()); 其中 org.bouncycastle.jc

android md5加密与rsa加解密实现代码

import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException; public class MD5 {/* * MD5加密 */  public static String getDigest(String str) { MessageDigest messageDigest = null; try { mess

android平台上AES,DES加解密及问题

在使用java进行AES加密的时候,会用到如下方法: SecureRandom sr = SecureRandom.getInstance("SHA1PRNG"); 但是在android4.2以上进行加密.解密时,会报类似badPadding的异常,但是把该代码替换成一下方法则一切都OK. SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto"); AES加密算法: ? 1

ios下使用rsa算法与php进行加解密通讯

首先了解一下几个相关概念,以方便后面遇到的问题的解决: RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的,RSA就是取自他们三个人的名字.算法基于一个数论:将两个大素数相乘非常容易,但要对这个乘积的结果进行因式分解却非常困难,因此可以把乘积公开作为公钥.该算法能够抵抗目前已知的所有密码攻击.RSA算法是一种非对称算法,算法需要一对密钥,使用其中一个加密,需要使用另外一个才能解密.我们在进行RSA加密通讯时,就把公钥放在客户端,私钥留在服务器. DE

[掌眼]iOS / Android / java / node.js 通用的 AES256 加解密算法

example.m NSString *text = @"text"; NSString *key32 = @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding]; NSString *encryptedData = [[data AES256EncryptWithKey:key32] base64EncodedStringWi

客户端(android,ios)与服务器通信

android,ios客户端与服务器通信为了便于理解,直接用PHP作为服务器端语言 其实就是一个 http请求响应的过程序,先从 B/S模式说起浏览器发起http请求,服务器响应请求,并把数据返回给浏览器,经过浏览器的渲染,即为我们所看到的效果 客户端(android,ios)android通过 httpClient或urlconnection等网络请求去实现http请求,(相当于浏览器,发送 url请求),即访问服务器,服务器响应请求,并把结果返回给客户端,经过客户端渲染,即为我们看到的效果.

DES跨(C# Android IOS)三个平台通用的加解密方法

#region   跨平台加解密(c# 安卓 IOS) //  public static string sKey = "12345678"; //  /// <summary> //  /// 解密 //  /// </summary> //  /// <param name="pToDecrypt">要解密的以Base64</param> //  /// <param name="sKey"