aec加密 php_AES加密(兼容php,java,objective_陈崇礼的博客-程序员秘密

技术标签: aec加密 php  

这些天开发android,ios的客户端需要与服务端用php开发的api进行数据交互。为了高大上一些决定用aes加密,但是问题就来了,因为aes有好几种模式,每种模式在各种语言下都是差异化的表现方式,探索了许久终于找到合适他们三种语言的的一套方案。

php:

php的代码就比较简单,几行就搞定

static $iv = 'AESAPPCLIENT_KEY';//16或16的倍数长个char

//$privateKey是加密 解密需要的密钥

function aesEncode($data,$privateKey){

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $data, MCRYPT_MODE_CBC,$iv);

return rtrim((base64_encode($encrypted)));

}

function aesDecode($data,$privateKey){

$encryptedData = base64_decode($data);

$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateKey, $encryptedData, MCRYPT_MODE_CBC,$iv);

return rtrim($decrypted);

}

加密后末尾莫名多了些东东 就用rtrim()去掉了

java:

主要注意要补零

public class ToolsUtils {

private final static String IVKEY = “AESAPPCLIENT_KEY”;

public static String encrypt(String data,String key) {

try {

Cipher cipher = Cipher.getInstance(“AES/CBC/NoPadding”);

int blockSize = cipher.getBlockSize();

SecretKeySpec keyspec = new SecretKeySpec(fullZore(key,blockSize), “AES”);

IvParameterSpec ivspec = new IvParameterSpec(fullZore(IVKEY,blockSize));

cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

byte[] encrypted = cipher.doFinal(fullZore(data,blockSize));

return new String(Base64.encode(encrypted, Base64.DEFAULT)).trim();

} catch (Exception e) {

e.printStackTrace();

return “”;

}

}

public static String decrypt(String data,String key) {

try {

Cipher cipher = Cipher.getInstance(“AES/CBC/NoPadding”);

int blockSize = cipher.getBlockSize();

SecretKeySpec keyspec = new SecretKeySpec(fullZore(key,blockSize), “AES”);

IvParameterSpec ivspec = new IvParameterSpec(fullZore(IVKEY,blockSize));

cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

byte[] decrypted = cipher.doFinal(Base64. decode(data, Base64.DEFAULT));

return new String(decrypted).trim();

} catch (Exception e) {

e.printStackTrace();

return “”;

}

}

public static byte[] fullZore(String data,int blockSize){

byte[] dataBytes = data.getBytes();

int plaintextLength = dataBytes.length;

if (plaintextLength % blockSize != 0) {

plaintextLength = plaintextLength + (blockSize – (plaintextLength % blockSize));

}

byte[] plaintext = new byte[plaintextLength];

System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);

return plaintext;

}

}

objective-c:

也是主要注意要补零

NSData+AES.h

#import

#import

#import

@interface NSData (AES)

– (NSData *)AES128EncryptWithKey:(NSString *)key iv:(NSString *)iv;

– (NSData *)AES128DecryptWithKey:(NSString *)key iv:(NSString *)iv;

– (NSString *)base64Encoding;

+ (id)dataWithBase64EncodedString:(NSString *)string;

@end

NSData+AES.m

#import "NSData+AES.h"

static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

@implementation NSData (AES)

– (NSData *)AES128EncryptWithKey:(NSString *)key iv:(NSString *)iv

{

char keyPtr[kCCKeySizeAES128+1];

bzero(keyPtr, sizeof(keyPtr));

[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

char ivPtr[kCCKeySizeAES128+1];

bzero(ivPtr, sizeof(ivPtr));

[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];

int diff = kCCKeySizeAES128 – (dataLength % kCCKeySizeAES128);

int newSize = 0;

if(diff > 0)

{

newSize = dataLength + diff;

}

char dataPtr[newSize];

memcpy(dataPtr, [self bytes], [self length]);

for(int i = 0; i < diff; i++)

{

dataPtr[i + dataLength] = 0x00;

}

size_t bufferSize = newSize + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,

kCCAlgorithmAES128,

0x00, //No padding

keyPtr,

kCCKeySizeAES128,

ivPtr,

dataPtr,

sizeof(dataPtr),

buffer,

bufferSize,

&numBytesEncrypted);

if(cryptStatus == kCCSuccess)

{

return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

}

return nil;

}

– (NSData *)AES128DecryptWithKey:(NSString *)key iv:(NSString *)iv

{

char keyPtr[kCCKeySizeAES128+1];

bzero(keyPtr, sizeof(keyPtr));

[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

char ivPtr[kCCKeySizeAES128+1];

bzero(ivPtr, sizeof(ivPtr));

[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];

size_t bufferSize = dataLength + kCCBlockSizeAES128;

void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,

kCCAlgorithmAES128,

0x00, //No padding

keyPtr,

kCCKeySizeAES128,

ivPtr,

[self bytes],

dataLength,

buffer,

bufferSize,

&numBytesEncrypted);

if(cryptStatus == kCCSuccess)

{

return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

}

return nil;

}

+ (id)dataWithBase64EncodedString:(NSString *)string;

{

if (string == nil)

[NSException raise:NSInvalidArgumentException format:nil];

if ([string length] == 0)

return [NSData data];

static char *decodingTable = NULL;

if (decodingTable == NULL)

{

decodingTable = malloc(256);

if (decodingTable == NULL)

return nil;

memset(decodingTable, CHAR_MAX, 256);

NSUInteger i;

for (i = 0; i < 64; i++)

decodingTable[(short)encodingTable[i]] = i;

}

const char *characters = [string cStringUsingEncoding:NSASCIIStringEncoding];

if (characters == NULL) // Not an ASCII string!

return nil;

char *bytes = malloc((([string length] + 3) / 4) * 3);

if (bytes == NULL)

return nil;

NSUInteger length = 0;

NSUInteger i = 0;

while (YES)

{

char buffer[4];

short bufferLength;

for (bufferLength = 0; bufferLength < 4; i++)

{

if (characters[i] == ‘\0’)

break;

if (isspace(characters[i]) || characters[i] == ‘=’)

continue;

buffer[bufferLength] = decodingTable[(short)characters[i]];

if (buffer[bufferLength++] == CHAR_MAX) // Illegal character!

{

free(bytes);

return nil;

}

}

if (bufferLength == 0)

break;

if (bufferLength == 1) // At least two characters are needed to produce one byte!

{

free(bytes);

return nil;

}

// Decode the characters in the buffer to bytes.

bytes[length++] = (buffer[0] << 2) | (buffer[1] >> 4);

if (bufferLength > 2)

bytes[length++] = (buffer[1] << 4) | (buffer[2] >> 2);

if (bufferLength > 3)

bytes[length++] = (buffer[2] << 6) | buffer[3];

}

bytes = realloc(bytes, length);

return [NSData dataWithBytesNoCopy:bytes length:length];

}

– (NSString *)base64Encoding

{

if ([self length] == 0)

return @””;

char *characters = malloc((([self length] + 2) / 3) * 4);

if (characters == NULL)

return nil;

NSUInteger length = 0;

NSUInteger i = 0;

while (i < [self length])

{

char buffer[3] = {0,0,0};

short bufferLength = 0;

while (bufferLength < 3 && i < [self length]) buffer[bufferLength++] = ((char *)[self bytes])[i++]; // Encode the bytes in the buffer to four characters, including padding “=” characters if necessary. characters[length++] = encodingTable[(buffer[0] & 0xFC) >> 2];

characters[length++] = encodingTable[((buffer[0] & 0x03) << 4) | ((buffer[1] & 0xF0) >> 4)];

if (bufferLength > 1)

characters[length++] = encodingTable[((buffer[1] & 0x0F) << 2) | ((buffer[2] & 0xC0) >> 6)];

else characters[length++] = ‘=’;

if (bufferLength > 2)

characters[length++] = encodingTable[buffer[2] & 0x3F];

else characters[length++] = ‘=’;

}

return [[NSString alloc] initWithBytesNoCopy:characters length:length encoding:NSUTF8StringEncoding freeWhenDone:YES];

}

@end

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42120563/article/details/114484948

智能推荐

android.view.InflateException 膨胀(充气)异常 的解决_。多肉的博客-程序员秘密

解决异常:android.view.InflateException: Binary XML file line #8: Error inflating class com.match.txtview现象:在xml布局文件中调用自己写的view时报了这个错误,试了好多办法都不行,我发现继承TextView时少写了一个构造方法public TxtWordView(Context context, ...

Kaggle:Elo顾客忠诚度预测问题_紫砂痕的博客-程序员秘密

Kaggle:Elo顾客忠诚度预测问题1. 问题分析2. 数据预处理3. 特征工程构建4. 训练模型参考链接:Elo顾客忠诚度 —— kaggle数据1. 问题分析这个数据集来自Kaggle这是链接,是Elo(巴西最大的本土支付品牌之一)和Kaggle合作的项目,通过Elo的匿名数据集预测每个客户的忠诚度(具体到card_id),以及查找影响客户忠诚度的因素。这个是数据集是虚构的(官方是这么...

tomcat启动类org.apache.catalina.startup.Bootstrap(转自CSDN)_jjdlnr的博客-程序员秘密

[code=&quot;java&quot;]org.apache.catalina.startup.Bootstrap第一步自然从main函数开始,我们可以从中看出bootstrap的初始化过程 main函数首先是调用init方法 ,然后根据main的参数,比如start、startd、stop、stopd等等,启动或停止服务器 ps:start和startd的区别,感觉像是前者用于...

Java——类、对象与继承_diying2003的博客-程序员秘密

今天我们谈的是――类与对象、类的继承。2019-08-25  17:22:35目录怎样定义类,对象又是什么?类在Java中有什么存在的意义?继承在Java中有何重要意义?继承了什么?类、对象  要理解类的定义,我们首先来了解一下对象是什么。所谓对象,就是现实生活中真真实实存在的事物,例如这个鼠标,这个学生,这个茶杯等等…而类就是对这些真实存在的事物进行一个抽象。我们把具有相同...

python不读第一行和第一列-python pandas不从csv文件读取第一列_weixin_37988176的博客-程序员秘密

I have a simple 2 column csv file called st1.csv:GRID St11457 6141458 6571459 6791460 7321461 7541462 8111463 748However, when I try to read the csv file, the first column is n...

golang文件下载_golang 下载文件_围观岳老师的博客-程序员秘密

golang文件下载func downloadFile(fileFullPath string, res *restful.Response) { file, err := os.Open(fileFullPath) if err != nil { res.WriteEntity(_dto.ErrorDto{Err: err}) return } defer file.Cl

随便推点

echarts地图展示,鼠标移入指定区域颜色不变,china.js是文字居中无间隙版_echarts地图鼠标移入地区禁止变色_江湖行骗老中医lm的博客-程序员秘密

&lt;div id="china-map" style="width:1200px; height: 600px;"&gt;&lt;/div&gt;function mapChartInit() { var myChart = echarts.init(document.getElementById('china-map')); var option =...

c语言实训报告 总结与展望,c语言实训报告总结范文四篇合集_洋溢最棒的博客-程序员秘密

c语言实训报告总结范文四篇合集社会实践报告是进行社会实践后需要完成的报告,是指有目的、有组织、有计划的深入实际、深入社会,对完成的社会实践活动的一个总结报告。职场范文网小编整理了c语言实训报告总结范文,希望能帮助到您。c语言实训报告总结范文一课题名称:通讯录管理系统专 业:计算机信息管理班 级:09信管(1)班姓 名:指导教师:2010 年 7 月 1 日一、课程设计题目《通讯录管理系统》二、实训...

JdbcTemplate错误总结_jdbctemplate报错_Running-Waiting的博客-程序员秘密

一、Spring对jdbc操作的简化1、连接管理2、jdbc操作重复代码封装二、JdbcTemplate的问题在简化jdbc操作过程中,JdbcTemplate是不可或缺的重要一环。具体问题咱们在代码中解释理解吧。下面是通过xml配置文件依赖注入:JdbcTemplate对象&lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;beans...

android 去广告浏览器,Adblock Browser(去广告浏览器) V1.3.1 安卓版_智珠在睿的博客-程序员秘密

Adblock Browser是基于火狐浏览器的基础上修改增加去广告功能的浏览器,能够帮助安卓用户在手机上浏览网页的时候去除烦人的广告,十分好用。PC端流行的广告过滤插件Adblock Plus (ABP) 原创浏览器登录移动端。其内置完善的广告过滤器,并将PC端洁净的浏览体验带到移动端,且完全免费。页面加载更快、节省你的流量和超过20%的电量,以及阻止网络安全隐患。让你更快、更安全的浏览网页,更...

Elasticsearch权威指南-学习笔记1_elasticsearch权威指南(中文版) 学习笔记_Ch3n的博客-程序员秘密

和 Elasticsearch 交互编辑和 Elasticsearch 的交互方式取决于你是否使用 JavaJava API编辑如果你正在使用Java,在代码中你可以使用 Elasticsearch 内置的两个客户端:节点客户端(Node client)节点客户端作为一个非数据节点加入到本地集群中。换句话说,它本身不保存任何数据,但是它知道数据在集群中的哪个节点中,并且可以...

范数约束解析_adlu的博客-程序员秘密

可以明显看到一个趋势,即q越小,曲线越贴近坐标轴,q越大,曲线越远离坐标轴,并且棱角越明显。那么 q=0 和 q=oo 时极限情况如何呢?猜猜看。...