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

原创
2015/11/25 12:42
阅读数 2.7K

测试发现,当前问题是:

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

具体原因~希望有大牛可以解惑!




展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
5 收藏
0
分享
返回顶部
顶部