IOS RSA 分段解密 亲测可用

420 阅读1分钟

`+ (NSData *)decryptData:(NSData *)data privateKey:(NSString *)privKey{

if(!data || !privKey){

return nil;

}

SecKeyRef keyRef = [RSA addPrivateKey:privKey];

if(!keyRef){

return nil;

}

return [RSA decryptData:data withKeyRef:keyRef];

} + (NSData *)decryptData:(NSData *)cipherData withKeyRef:(SecKeyRef) keyRef{

    

    size_t plainBufferSize = SecKeyGetBlockSize(keyRef);

    NSLog(@"plainBufferSize = %zd", plainBufferSize);

    uint8_t *plainBuffer = malloc(plainBufferSize * sizeof(uint8_t));

    // 计算数据段最大长度及数据段的个数

    double totalLength = [cipherData length];

    size_t blockSize = plainBufferSize;

    size_t blockCount = (size_t)ceil(totalLength / blockSize);

    NSMutableData *decryptedData = [NSMutableData data];

    // 分段解密

    for (int i = 0; i < blockCount; i++) {

        NSUInteger loc = i * blockSize;

        // 数据段的实际大小。最后一段可能比blockSize小。

        int dataSegmentRealSize = MIN(blockSize, totalLength - loc);

        // 截取需要解密的数据段

        NSData *dataSegment = [cipherData subdataWithRange:NSMakeRange(loc, dataSegmentRealSize)];

        OSStatus status = SecKeyDecrypt(keyRef, kSecPaddingPKCS1, (const uint8_t *)[dataSegment bytes], dataSegmentRealSize, plainBuffer, &plainBufferSize);

        if (status == errSecSuccess) {

            NSData *decryptedDataSegment = [[NSData alloc] initWithBytes:(const void *)plainBuffer length:plainBufferSize];

            [decryptedData appendData:decryptedDataSegment];

           

        } else {

            if (plainBuffer) {

                free(plainBuffer);

            }

            return nil;

        }

    }

    if (plainBuffer) {

        free(plainBuffer);

    }

    return decryptedData;`