Iphone Objective-C解密AES 128 cbc十六进制字符串

Iphone Objective-C解密AES 128 cbc十六进制字符串,iphone,objective-c,ios,xcode,aes,Iphone,Objective C,Ios,Xcode,Aes,我正在使用Xcode 3.1为雪豹上的iPhone开发一个应用程序,该应用程序从restful web服务接收十六进制格式的加密文本,算法为AES 128位(CBC)。该算法使用初始化向量+密钥。如何解密此文本?谢谢大家给我的建议,我会成功的 编辑: 我从REST服务器得到十六进制和加密格式的响应,我尝试使用这段代码,但总是收到错误的参数错误。你能帮我找出错误吗? 我是否可以首先将字符串响应转换为二进制格式 NSString *response = [request response

我正在使用Xcode 3.1为雪豹上的iPhone开发一个应用程序,该应用程序从restful web服务接收十六进制格式的加密文本,算法为AES 128位(CBC)。该算法使用初始化向量+密钥。如何解密此文本?谢谢大家给我的建议,我会成功的

编辑: 我从REST服务器得到十六进制和加密格式的响应,我尝试使用这段代码,但总是收到错误的参数错误。你能帮我找出错误吗? 我是否可以首先将字符串响应转换为二进制格式

      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";
编辑2: 此函数返回错误的参数,因为没有分配解密数据的正确缓冲区大小。我以这种工作方式编辑函数:

      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);
这个函数对我有用。。非常感谢

3月23日编辑------


现在系统以16字节的密钥大小从我这里开始工作。现在我有一个问题,如何实现32字节的密钥大小?非常感谢。

这可以使用
标题中包含的
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];

这是未测试的,请确保检查
CCCrypt
的返回值是否有错误。查看头文件以了解详细信息,它有很好的文档记录。

我是新手,如何初始化var?我试着这样做:NSString*hex=[nsstringwithformat:@“%@”,response];c操作*op=“解密”;C算法*alg=@“AES”;cOptions*options=NULL;const void*key=“xxxx”;size_t*键长=[键长];const void*iv=@“xxxxxxxx-x-xxxxx”;大小数据长度=[十六进制长度];void*dataOut=响应;大小\u t dataOutAvailable=10000;size_t*dataOutMoved=NULL;CCCrypt(op、alg、选项、键、键长、iv、十六进制、dataInLength、dataOut、dataOutAvailable、dataOutMoved);这是一个C级API,您正在到处混合对象类型和枚举。我在上面添加了一个示例。如果您想知道应该给出什么类型的参数,只需按住Cmd键并单击函数名即可转到头文件,并对参数类型执行相同操作以查看选项。现在使用16字节的键大小。使用32字节密钥大小我能做什么?谢谢你的回复,但是你确定没有硬件支持吗?在网上我看到了这个,但我不知道它是否对我有用。我太愚蠢了,对区块和关键尺寸感到困惑。AES算法始终使用128位块大小,但密钥大小不同,因此实际上您需要做的就是将
kCCKeySizeAES128
更改为
kCCKeySizeAES256
,并提供更长的密钥。