使用AES解密Base64编码的字符串导致错误状态4301(缓冲区太小)

时间:2013-11-20 10:09:55

标签: ios objective-c encryption ios7 commoncrypto

我想解密在Objective-C中编码AES的{​​{1}}加密字符串:

这是我的代码:

Base64

运行代码时,结果为:NSString *base64String = @"RwH0KBSRjFKJQYGsCze0"; NSData *base64Data = [[NSData alloc] initWithBase64EncodedString: base64String options:0]; char * key = "shouldbe16chars."; NSUInteger dataLength = [base64Data length]; uint8_t unencryptedData[dataLength + kCCKeySizeAES128]; size_t unencryptedLength; CCCryptorStatus status = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0 , key,kCCKeySizeAES128, NULL, [base64Data bytes], [base64Data length], unencryptedData, dataLength, &unencryptedLength); NSString *output = [[NSString alloc] initWithBytes: unencryptedData length:unencryptedLength encoding:NSUTF8StringEncoding]; NSLog(@"status: %d output: %@",status, output);

根据文档,状态4301 =“缓冲区太小”

调试我的代码时,变量设置如下:

Status = -4301, output = null

仅当设置选项base64Data = 4701f428 14918c52 894181ac 0b37b4 dataLength = 15 bytes unencryptedLength = 0 unencryptedData = {} 时,如果设置为kCCOptionPKCS7Padding,状态= 0,输出= {},则会发生错误。

我在SO上检查了很多代码示例,但没有发现我的代码有任何问题。

您对我的代码可能出现的问题有什么想法吗?

顺便说一句:我在此示例代码中使用的0是使用此开源框架在JavaScript中创建的:http://www.movable-type.co.uk/scripts/aes.html。我不知道这些信息是否有帮助。

1 个答案:

答案 0 :(得分:1)

CCCrypt中倒数第二个参数应该是dataOutAvailable。你传递dataLength,它似​​乎是inData的长度(你已经正确地将其作为参数传递)。