您的位置:首页 > 编程语言 > Java开发

AES加密/解密 IOS 端,JAVA端 通用,不限明文字符长度

2015-11-25 12:42 489 查看
测试发现,当前问题是:

明文字符长度<=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 的加密结果不同.

具体原因~希望有大牛可以解惑!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  AES加密 IOS JAVA