• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-11 21:59:59 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在使用 Xcode 3.1 在 Snow Leopard 上为 iPhone 开发一个应用程序,该应用程序从一个安静的 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 大小?非常感谢。



Best Answer-推荐答案


这可以使用 header 中包含的 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 的返回值是否有错误。详情查看头文件,有据可查。

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

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap