大家好我需要简单的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;
}
有关如何修改此方法的任何线索,以便它将块中的数据拆分以处理大量数据?
答案 0 :(得分:3)
根据您使用的RFC3447 RSAES-PKCS1-v1_5加密方案,可以对长度高达k-11个八位字节的消息进行操作(k是RSA模数的八位字节长度),因此如果您使用的是2048-比特RSA密钥,然后要加密的明文数据的最大长度是245字节。因此,您需要将纯数据拆分为此大小的块,然后单独加密每个块,但这是罕见且缓慢的解决方案。生成对称AES密钥,使用AES算法加密大数据然后用RSA密钥加密小AES密钥要好得多(也很常见)。