我们要对图片进行aes 加密,然后上传。
服务端和安卓 找了一套加密的东西,他们都是java所以,他两的代码都能共用。他们没费工夫就调通过了。iOS这边 我后面才开始做,没有现成的代码,所以我只能自己百度资料写了一套。
我也没写过这个,写之前我百度了资料,大概知道怎么写, 就问他们 有没偏移向量 ,模式是啥。
服务端的人也是拿人家写好的代码 就用,没仔细看这些东西,我问的时候才大概看了下,说是AES128加密,没有偏移向量,填充方式也没有。我就想啥都没有,那就我百度一个我这边常用的就差不多了。结果加密后,上传过去,图片一直打不开。调试了好久。我把他代码要过来看了看,发现他里面直接这样写的,直接写的AES 模式啥的看不出来。
private static final String ALGORITHM = "AES";
Cipher cipher = Cipher.getInstance(ALGORITHM);
我百度了下 java AES默认加密模式是啥,结果还真发现奥秘了
java 使用Cipher默认加密,iOS aes 用 AES/ECB/PKCS5Padding 解密
然后我就把我那边的代码 改成
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding|kCCOptionECBMode, //这个模式
keyPtr,
kCCBlockSizeAES128,
NULL, //偏移向量没有
[data bytes],
dataLength,
buffer,
bufferSize,
&numBytesEncrypted);
然后就好了。
最后的加密方法我贴出来,还要注意一点,我们的加密秘钥是自己生成一个128bit的然后转成base64 字符串 传给服务端,然后去解密图片。所以我这边加密的时候,把base64的秘钥又转成NSData 然后去加密的
/// Aes加密
/// @param key base64 秘钥
/// @param data 加密数据
+(NSData *)AES128_Encrypt:(NSString *)key encryptData:(NSData *)data{
char keyPtr[kCCKeySizeAES128+1];
memset(keyPtr, 0, sizeof(keyPtr));
// [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSData *datakey = [self base64ToData:key];
[datakey getBytes:keyPtr length:kCCKeySizeAES128+1];
//偏移向量
// char ivPtr[kCCBlockSizeAES128+1];
// memset(ivPtr, 0, sizeof(ivPtr));
// [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
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 numBytesCrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding|kCCOptionECBMode, //java 使用Cipher默认加密AES //No padding 0x0000
keyPtr,
kCCKeySizeAES128,
NULL,
dataPtr,
sizeof(dataPtr),
buffer,
bufferSize,
&numBytesCrypted);
if (cryptStatus == kCCSuccess) {
NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
// NSLog(@"文件加密key%@===%@",key,resultData);
return resultData;
}
free(buffer);
return nil;
}
网友评论