解密大量RSA加密数据

时间:2014-04-01 09:49:59

标签: objective-c encryption cryptography rsa

大家好我需要简单的RSA加密解密。 我尝试了Apple开发人员指南中的代码示例,它适用于少量文本,但示例代码不适合大型加密数据的情况。

请注意它建议我们“将数据拆分为等于plainBufferSize的块”的评论:

    - (NSData*)decryptedDataFromData:(NSData*)data usingKey:(SecKeyRef)key
    {
        OSStatus status = noErr;

        size_t cipherBufferSize = [data length];
        uint8_t *cipherBuffer = (uint8_t *)[data bytes];

        size_t plainBufferSize;
        uint8_t *plainBuffer;

        //  Allocate the buffer
        plainBufferSize = SecKeyGetBlockSize(key);
        plainBuffer = malloc(plainBufferSize);

        if (plainBufferSize < cipherBufferSize) {
            // Ordinarily, you would split the data up into blocks
            // equal to plainBufferSize, with the last block being
            // shorter. For simplicity, this example assumes that
            // the data is short enough to fit.
            printf("Could not decrypt.  Packet too large.\n");
            return nil;
        }

        //  Error handling
        status = SecKeyDecrypt(key,
                               kSecPaddingPKCS1,
                               cipherBuffer,
                               cipherBufferSize,
                               plainBuffer,
                               &plainBufferSize
                               );                              // 3

        //  Error handling
        //  Store or display the decrypted text

        if(key) CFRelease(key);

        NSData *decrypted = [NSData dataWithBytes:(const void *)plainBuffer length:plainBufferSize];
        return decrypted;
    }

有关如何修改此方法的任何线索,以便它将块中的数据拆分以处理大量数据?

1 个答案:

答案 0 :(得分:3)

根据您使用的RFC3447 RSAES-PKCS1-v1_5加密方案,可以对长度高达k-11个八位字节的消息进行操作(k是RSA模数的八位字节长度),因此如果您使用的是2048-比特RSA密钥,然后要加密的明文数据的最大长度是245字节。因此,您需要将纯数据拆分为此大小的块,然后单独加密每个块,但这是罕见且缓慢的解决方案。生成对称AES密钥,使用AES算法加密大数据然后用RSA密钥加密小AES密钥要好得多(也很常见)。