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

标签 iphone objective-c ios xcode aes

我正在使用 Xcode 3.1 在 Snow Leopard 上开发 iPhone 应用程序,该应用程序从 Restful Web 服务接收采用 AES 128 位 (CBC) 算法的十六进制格式的加密文本。该算法使用初始化向量+ key 。我如何解密这段文字?感谢大家给我的建议,我将成功给出。

编辑: 我从 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: 该函数返回 BAD PARAM,因为分配解密数据的缓冲区大小不正确。我以这种工作方式编辑函数:

      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 字节 key 大小工作。现在我有一个问题,我可以做什么来实现 32 字节 key 大小?非常感谢。

最佳答案

这可以使用CCCryptor来实现<CommonCrypto/CommonCryptor.h> 中包含的功能 header 。检查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 的返回值对于错误。检查头文件了解详细信息,它有详细记录。

关于iphone - Objective-C 解密 AES 128 cbc 十六进制字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9682118/

相关文章:

ios - 标签栏的uiview问题

objective-c - 启动时在 iPhone Objective-C 项目中执行 C 代码

objective-c - 强制将特定本地化用于目标

ios - AVCaptureOutput captureStillImageAsynchronouslyFromConnection 在 iPhone5 上永远不会完成

ios - 检查特定 ViewController 是否多次出现在导航堆栈中

iphone - 我如何使用 CoreGraphics 绘制半圆

iphone - 我的开发人员没有使用 Interface Builder,这是一件坏事吗?

iphone - iOS:如何从 JSON 查询构建表?

ios - 如何打开iOS状态栏中的网络指示灯?

iphone - MKStorekit耗材配置MKStoreKitConfigs.plist iphone