测试发现,当前问题是:
明文字符长度<=15时, IOS 端的 AES 加密结果和 JAVA 端是一样的
明文字符长度>15时, IOS 的加密和 JAVA 的加密是不同的, 但都可以在各自语言中成功解密
解决办法就不说了,直接上代码
- (NSData *)AESOperation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv aesType:(AesType)aesType
{
NSUInteger aesKeySizeType;
NSUInteger aesBlockSizeType = kCCBlockSizeAES128;
CCAlgorithm aesAlgorithmType = kCCAlgorithmAES128;
switch (aesType) {
case kAesType128:
aesKeySizeType = kCCKeySizeAES256;
break;
case kAesType192:
aesKeySizeType = kCCKeySizeAES192;
break;
case kAesType256:
aesKeySizeType = kCCKeySizeAES256;
break;
default:
aesKeySizeType = kCCKeySizeAES256;
break;
}
char keyPtr[aesKeySizeType + 1];
memset(keyPtr, 0, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
char ivPtr[aesBlockSizeType + 1];
memset(ivPtr, 0, sizeof(ivPtr));
[iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
size_t bufferSize = dataLength + aesBlockSizeType;
void *buffer = malloc(bufferSize);
size_t numBytesCrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(operation,
aesAlgorithmType,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr,
aesBlockSizeType,
ivPtr,
[self bytes],
dataLength,
buffer,
bufferSize,
&numBytesCrypted);
NSData *data = nil;
if (cryptStatus == kCCSuccess) {
data = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
}
return data;
}
最重要的部分是这一句的 kCCOptionPKCS7Padding | kCCOptionECBMode ,
CCCryptorStatus cryptStatus = CCCrypt(operation,
aesAlgorithmType,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr,
aesBlockSizeType,
ivPtr,
[self bytes],
dataLength,
buffer,
bufferSize,
&numBytesCrypted);
一般网上的只会有其中一个,导致加密明文>15个字符时,结果和 JAVA 的加密结果不同.
具体原因~希望有大牛可以解惑!