欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

IOS 与 PHP 通信加密,使用AES 128 CBC no padding

程序员文章站 2022-04-27 08:22:42
...
这个网上的资料真实浩如烟海,但是真正有价值的屈指可数

自己尝试了一天多,终于还是搞定了。

再次要感谢网上的前辈么。

比如下面这个关于php和java端的实现:

关于php和java端的实现。

再比如下面这个关于ios端的实现:

为何要采用 no padding 这种形式:

AES加密如果原输入数据不够16字节的整数位,就要补齐,如果采用

pkcs7或者pkcs5这种加密方式,末端添加的数据可能是0x1,0x2,0x3,不固定,

在解码后需要把末端多余的字符去掉,就显得比较棘手。

如果不管补齐多少位,末端都是'\0',去掉的话比较容易操作。

好了,再次确认一下,这里使用的是 AES128 CBC no padding加密解密方式。

先上ios端的代码:

 
////  AES128.m//  login////  Created by wangdan on 15-3-3.//  Copyright (c) 2015年 wangdan. All rights reserved.//#import "AES128.h"#import #import "GTMBase64.h"@implementation AES128+(NSString *)AES128Encrypt:(NSString *)plainText withKey:(NSString *)key{        if( ![self validKey:key] ){        return nil;    }        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));    [key getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];        NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];    NSUInteger dataLength = [data length];        int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);    unsigned long newSize = 0;        if(diff > 0)    {        newSize = dataLength + diff;        NSLog(@"diff is %d",diff);    }        char dataPtr[newSize];    memcpy(dataPtr, [data bytes], [data length]);    for(int i = 0; i   


上述代码需要说明的是,进行AES编码时,输入编码必须是16字节的整数倍,不然调用ios 的系统api会报错 -4003

补齐的字节数全部填充为0

另外 processDecodedString这个函数为了把解码后的字符串,末尾去掉'\0'

下面是PHP端的代码,这个代码是大神些写的啊,经过实际实验是能使用的:

'; //解密$encryptedData = base64_decode("2fbwW9+8vPId2/foafZq6Q==");$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $privateKey, $encryptedData, MCRYPT_MODE_CBC, $iv);echo($decrypted);?>