Objective-C解密AES 128 cbchexstring

我正在开发Snow Leopard上的iPhone应用程序,使用Xcode 3.1从一个宁静的Web服务接收一个带有algorithmAES 128位(CBC)的hex格式的encryption文本。 该algorithm使用初始化向量+秘密密钥。 我如何解密这个文本? 感谢大家的提示,我会成功给予。

编辑:我从REST服务器以hex和encryption格式得到响应,我尝试使用此代码,但我总是收到错误的参数错误。 你能帮我find错误吗? 是否有可能我首先将string响应转换为二进制格式?

NSString *response = [request responseString]; NSData *encryptedData = [response dataUsingEncoding: NSASCIIStringEncoding]; NSString *key = @"32charlength"; NSString *iv = @"16charlength"; NSData *unencryptedData = NULL; size_t unencryptedLength = [unencryptedData length]; CCCryptorStatus ccStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, key, kCCKeySizeAES128, iv, [encryptedData bytes], [encryptedData length], unencryptedData, [encryptedData length], &unencryptedLength); NSString *output = [[NSString alloc] initWithBytes:unencryptedData length:unencryptedLength encoding:NSUTF8StringEncoding]; if (ccStatus == kCCSuccess) risultato.text = @"SUCCESS"; else if (ccStatus == kCCParamError) risultato.text = @"BAD PARAM"; else if (ccStatus == kCCBufferTooSmall) risultato.text = @"BUFFER TOO SMALL"; else if (ccStatus == kCCMemoryFailure) risultato.text = @"MEMORY FAILURE"; else if (ccStatus == kCCAlignmentError) risultato.text = @"ALIGNMENT"; else if (ccStatus == kCCDecodeError) risultato.text = @"DECODE ERROR"; else if (ccStatus == kCCUnimplemented) risultato.text = @"UNIMPLEMENTED"; 

EDIT2:这个函数返回BAD PARAM,因为在分配解密数据时没有正确的缓冲区大小。 我以这种工作方式编辑function:

  NSData *encryptedData = [response dataUsingEncoding: NSASCIIStringEncoding]; const void *key = @"32charlength; uint8_t *iv = @"16charlength"; char buffer[4*4096]; memset(buffer, '\0', sizeof(buffer)); size_t size = sizeof(buffer); CCCryptorStatus ccStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, key, kCCKeySizeAES128, iv, [encryptedData bytes], [encryptedData length], buffer, sizeof(buffer), &size); 

这个function为我工作..非常感谢。

编辑23三月——

现在系统工作以16字节的密钥大小形成我。 现在我有一个问题,我能做些什么来实现32字节的密钥大小? 非常感谢。

这可以使用<CommonCrypto/CommonCryptor.h>头文件中包含的CCCryptor函数。 检查man CCCryptor的血淋淋的细节,在你的情况下,它听起来像你可以使用一个单一的CCCrypt()来解码接收到的数据:

 CCCryptorStatus CCCrypt(CCOperation op, CCAlgorithm alg, CCOptions options, const void *key, size_t keyLength, const void *iv, const void *dataIn, size_t dataInLength, void *dataOut, size_t dataOutAvailable, size_t *dataOutMoved); 

假设你有在NSData *encryptedData解密的数据,你可以尝试这样的:

 char * key = "shouldbe16chars."; NSUInteger dataLength = [encryptedData length]; uint8_t unencryptedData[dataLength + kCCKeySizeAES128]; size_t unencryptedLength; CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 0, key, kCCKeySizeAES128, NULL, [encryptedData bytes], dataLength, unencryptedData, dataLength, &unencryptedLength); NSString *output = [[NSString alloc] initWithBytes:unencryptedData length:unencryptedLength encoding:NSUTF8StringEncoding]; 

这是未经testing的,请确保您检查CCCrypt的返回值的错误。 检查头文件的细节,它是有据可查的。