Objective-c 中的 AES256 解密问题

2023-12-03

我正在尝试使用以下代码片段来解密文件,该文件是使用 32 字节密钥加密的。因此,当我尝试加密文件数据时,一切正常。但是当我尝试解密时,程序甚至没有通过条件if (cryptStatus == kCCSuccess)在 CryptoExtensions.m 中。我真的很累去解决一个问题。我试图使用 Base64 解码,但我的文件以 UTF8 编码保存,因此当我将其内容放入 NSData 的日志中时没有问题:

NSData *fileData = [[[NSData alloc] initWithContentsOfFile:destPath] autorelease];

NSLog(@"File data:%@",[[NSString alloc] initWithData:fileData encoding:NSUTF8StringEncoding]);

但是当我尝试解密它时,我得到了nil from 加密扩展 method:

NSData *aesResponse = [fileData AES256DecryptWithKey:@"4QXcCZlgRAIchiaqkMVpF3nkpARmdL3z"];
NSLog(@"AES:%@",[[NSString alloc] initWithData:aesResponse encoding:NSUTF8StringEncoding]);

这是加密片段的内容:

加密扩展.h

#import <Foundation/Foundation.h>
@interface NSData (CryptoExtensions)
- (NSData*)AES256EncryptWithKey:(NSString*)key;
- (NSData*)AES256DecryptWithKey:(NSString*)key;
@end

加密扩展.m

#import "CryptoExtensions.h"
#import <CommonCrypto/CommonCryptor.h>
@implementation NSData (CryptoExtensions)
- (NSData*)AES256EncryptWithKey:(NSString*)key {
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise
    char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

    // fetch key data
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];

    //See the doc: For block ciphers, the output size will always be less than or
    //equal to the input size plus the size of one block.
    //That's why we need to add the size of one block here
    size_t bufferSize           = dataLength + kCCBlockSizeAES128;
    void* buffer                = malloc(bufferSize);

    size_t numBytesEncrypted    = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL /* initialization vector (optional) */,
                                          [self bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess)
    {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free(buffer); //free the buffer;
    return nil;
}

- (NSData*)AES256DecryptWithKey:(NSString*)key {
    // 'key' should be 32 bytes for AES256, will be null-padded otherwise
    char keyPtr[kCCKeySizeAES256 + 1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

    // fetch key data
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];

    //See the doc: For block ciphers, the output size will always be less than or
    //equal to the input size plus the size of one block.
    //That's why we need to add the size of one block here
    size_t bufferSize           = dataLength + kCCBlockSizeAES128;
    void* buffer                = malloc(bufferSize);

    size_t numBytesDecrypted    = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL /* initialization vector (optional) */,
                                          [self bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesDecrypted);

    if (cryptStatus == kCCSuccess)
    {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }

    free(buffer); //free the buffer;
    return nil;
}
@end

该代码存在严重的安全问题。它错误地构造了 AES 密钥,大大减少了密钥空间,并且没有 IV,从而给第一个块带来了问题。我强烈建议不要使用此代码。

我大部分时间都在开发这个常用代码片段的替代品。看https://github.com/rnapier/RNCryptor。如果它不适合您开箱即用,请告诉我。我试图让它足够容易用于人们将停止使用的所有常见情况AES256EncryptWithKey.

有关此代码问题的更长时间的讨论,请参阅使用 CommonCrypto 使用 AES 进行正确加密。我喜欢有人将 AES 加密纳入易于使用的类别。我只是希望它没有那么多安全问题。


编辑:回到你的实际问题,你使用过吗AES256EncryptWithKey加密这些数据?如果不是,那么具体的格式可能会完全不同。几乎每个 AES 加密实现都使用不同的方法来生成其输入参数,然后生成其输出(大多数也没有很好地记录这一点)。您必须匹配参数和格式。例如,您不能使用AES256EncryptWithKey解密生成的东西openssl enc.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective-c 中的 AES256 解密问题 的相关文章

  • 如何将以 nil 结尾的字符串列表传递给 Objective-C 函数?

    函数 NSArray arrayWithObjects foo bar nil 将一个以 nil 结尾的字符串列表传递给函数 如果我想编写一个类似的函数 声明是什么样的 以及如何迭代字符串 I quote http developer ap
  • NSInternalInconsistencyException,原因:无法在捆绑包中加载 NIB

    我已经浏览了很多关于这个问题的答案 但似乎没有一个与我的问题相关 我有两个视图 视图 1 有一个按钮 视图 2 有一个按钮 视图 1 按钮与模型连接到 视图 2 我单击视图 1 中的按钮 它打开视图 2 在视图 2 中 按钮连接到触发的 I
  • 使用自动布局指定 UICollectionView 中单元格的一维

    在 iOS 8 中UICollectionViewFlowLayout支持根据单元格自身的内容大小自动调整单元格大小 这会根据单元格的内容调整单元格的宽度和高度 是否可以为所有单元格的宽度 或高度 指定固定值并允许调整其他尺寸的大小 举一个
  • iOS 隐藏默认键盘并打开自定义键盘

    我有一个UITextview 当用户点击UITextview我需要隐藏默认键盘 为此我所做的 myTextView setEditable NO 所以键盘没有显示 这里我创建了一个自定义视图UIButton 我需要展示这个UIView当用户
  • WKWebview:禁用交互和点击链接

    有没有办法禁用网络视图上的交互 这样用户就不能比加载的 webview 更进一步了 编辑 禁用 UserInteractions 并不是一个解决方案 因为网站仍然必须可滚动 实施WKNavigationDelegate协议 interfac
  • SCNNode 静态主体与 .dae 导致问题

    我在 Blender 中构建了一个景观模型 导出到 dae 并添加到我的 xcode 项目中 我已经加载了场景 然后将子项 景观网格 附加到我的景观节点 这加载完美 然而 当我将静态物理体附加到 landscspeNode 时 我的 Her
  • UIWebView 中的后退/前进滑动手势?

    我的应用程序中有一个 WebView 因为它是一个选项卡式应用程序 所以我无法在网站上添加用于后退 前进的按钮 我想通过滑动来后退 前进 从左侧 边缘向右滑动又回来了 就像 iOS 版 Safari 浏览器一样 我该怎么做 我想我应该使用
  • 单击 UITabBarController 时的自定义操作

    我有一个选项卡栏控制器 其中添加了四个导航控制器 导航控制器在选项卡栏控制器中显示为选项卡栏项目 现在我想向选项卡栏添加第五个按钮 该按钮不会打开另一个视图 但会触发一些自定义代码 我想在单击该选项卡栏项目时显示覆盖的 共享菜单 无论用户位
  • iPhone崩溃日志:未能及时恢复

    我正在查看崩溃日志并注意到 未能及时恢复 Application Specific Information com myApp MyApp failed to resume in time elapsed total CPU time se
  • 将 Base64 解码的 NSData 转换为 NSString

    我正在尝试对 Base64 数据进行编码和解码 但是在解码 Base64 数据时 它返回一堆十六进制值 但我无法使用 NSlog 显示或打印原始可读字符串 下面的代码无法打印任何内容 只是空的 有人可以帮忙吗 谢谢 gt gt NSStri
  • 创建 DOMElement Objective C 的位图

    我有一个 Webkit DOMElement 例如一个 div 现在我想要它的渲染 NSImage 或 NSBitmapImageRep 它就像 DOMElement 的屏幕截图 公共 API 选择 NSView cacheDisplayI
  • AFNetworking 同步调用(类似/不同)

    我需要实施喜欢 不喜欢应用程序中的功能 所有 API 调用均通过AFNetworking和成功 错误处理程序 iOS 块 问题是 当用户在短时间内多次单击某个按钮时 服务器会以错误的顺序接收某些请求 然后一切都会变得错误 例如发生双重喜欢或
  • iOS 6 仅支持一个视图的不同方向

    我只想将应用程序中的一个视图旋转到左横向或右横向 我的所有其他视图均处于纵向模式 并且我已将我的应用程序设置为仅支持纵向模式 随着 iOS 6 中方向的改变 我不知道如何做到这一点 我已经尝试过下面发布的内容 谁能告诉我我做错了什么 谢谢
  • 带有嵌套数组的 NSPredicate

    我有以下对象结构 类别 子类别 子类别的 nsarray 子类别 问题 问题的 nsarray 问题 问题 nsstring 答案 ns字符串 我需要的是用给定的子字符串搜索任何问题 以下谓词不起作用 NSPredicate predica
  • 如何消除错误 服务无效 请检查您的设置并尝试

    我一直在努力工作 一切都很顺利 只是突然间 当我尝试构建我的项目时 我在 xCode 中收到以下错误 1 在构建时的警报框中 服务无效 请检查您的设置并重试 0xE8000022 只需重新启动您的 iPod 或 iPhone 即可
  • UIView 的变换看起来很糟糕

    我有一个简单的视图和简单的背景 我需要旋转视图及其内容 代码在这里 CGAffineTransform r CGAffineTransformMakeRotation 5 M PI 180 0f backView transform r 我
  • 获取 iOS 5 中最后一个重定向的 url?

    有人可以发布最简单的工作代码 当我 GET 请求一个 url 时 它可以获取最后一个重定向的 url nth 吗 我知道我需要使用异步请求 但我无法制定出解决问题的完整工作代码 我正在使用 ios5 因此我可以使用 ios5 中最新添加的异
  • UIWebView didFinishLoading 多次触发

    我有一些代码需要在 a 之后运行UIWebView完成加载文档 为此我设置了UIWebView的委托给我的控制器 并实现了webViewDidFinishLoading method 这会被多次调用 具体取决于要加载的页面类型 我不确定是否
  • 如何在 Objective-C 中将 RGB 十六进制字符串转换为 UIColor?

    我有来自 url 数据的颜色值 如下所示 ff33cc 如何将此值转换为 UIColor 我正在尝试使用以下代码行 我没有正确获取 baseColor1 的值 看来我应该把那磅炭拿掉 还有其他方法吗 NSScanner scanner2 N
  • Swift 和 Objective-C 框架公开其内部结构

    我正在尝试将 Swift 添加到具有公共 私有和项目文件的现有 Objective C 框架中 为了让 Swift 能够访问项目文件 我添加了一个定义新模块的模块映射 例如MyFramework Internal 通过包含所有项目标题 如下

随机推荐

  • Python 基础知识:字符串和字符串方法(概述)

    许多程序员 无论其专业如何 都会在计算机上处 理文本 每日基础 例如 网络开发人员使用来自以下位置的文本输入 网络表格 数据科学家处理文本以提取数据并执行 诸如情感分析之类的任务 可以帮助识别和分类 文本正文中的意见 Python 中的文本
  • Python 中的函数式编程:何时以及如何使用它

    目录 什么是函数式编程 Python 对函数式编程的支持程度如何 使用 lambda 定义匿名函数 Applying a Function to an Iterable With map 使用单个可迭代对象调用 map 使用多个可迭代对象调
  • 教材:书面教程

    在本视频中 您将了解如何访问 Real Python 上的另一种类型的学习资源 基于文本的教程 您将了解在哪里可以找到我们编写的 Python 教程 如何访问额外资源 例如代码示例和可下载指南 等等 重要链接 教程概述页面 教程主题页面
  • Jupyter Notebook:简介

    目录 Getting Up and Running With Jupyter Notebook 安装 启动 Jupyter Notebook 服务器 Creating a Notebook 命名 运行细胞 菜单 启动终端和其他东西 查看正在
  • 如何将一个字符串哈希为8位数字?

    无论如何 我可以将随机字符串哈希为 8 位数字 而无需自己实现任何算法吗 是的 您可以使用内置的hashlib模块或内置hash功能 然后 对哈希的整数形式使用模运算或字符串切片运算截取最后八位数字 gt gt gt s she sells
  • $_SERVER["HTTP_REFERER"] 无法在 Mozilla 上运行

    我开发了一个简单的模态框并添加了 SERVER HTTP REFERER 所以从特定的引荐来源网址到不会出现 它工作正常 但是 SERVER HTTP REFERER 不适用于 Mozilla 还有其他方法可以做到这一点吗 我正在使用简单的
  • 读取输入后隐藏控制台窗口

    我有一个带有 GUI 的脚本 它获取用户数据并将其存储到文本文件中 它运行另一个脚本 exe 等待用户输入 然后执行一些工作 我想要的是后一个脚本在读取用户的输入后隐藏其控制台窗口 但继续在后台工作 我尝试运行该脚本subprocess c
  • 基于另一列值的一列的累积和 (R)

    我有一个包含 2 列的数据框 如下所示 gt data frame x 1 10 y c 0 0 0 1 1 0 0 1 0 1 x y 1 1 0 2 2 0 3 3 0 4 4 1 5 5 1 6 6 0 7 7 0 8 8 1 9 9
  • 存储信用卡详细信息

    我的业务要求迫使我在短时间内存储客户的完整信用卡详细信息 号码 姓名 到期日 CVV2 理由 如果客户打电话订购产品 而他们的信用卡当场被拒绝 您很可能会失去销售机会 如果您获取他们的详细信息 感谢他们的交易 然后发现该卡被拒绝 您可以给他
  • 如何搜索可用的 RFC 功能模块和表

    我必须承认我不是 SAP R 3 编程方面的专家 所以这更多的是关于这个问题的基本问题 有没有办法获取 SAP 系统上可访问的 RFC 模块和 或表的列表 在互联网上的许多示例中 我发现一个 RFC 模块似乎在每个 SAP 系统上都可用 S
  • 查找所有重叠区间的计数

    我有所有记录的开始时间和结束时间 如下所示 startTime 21345678 endTime 31345678 我正在尝试查找所有冲突的数量 例如 如果有两条记录并且它们重叠 则冲突数为 1 如果有 3 个记录 其中两条重叠 则冲突为
  • 禁用按钮/禁用选项菜单的 tkinter 颜色

    我正在为 Unity Ubuntu 开发一个快速列表编辑器 初始 界面包含禁用的选项菜单按钮 右下的 和编辑按钮 右上角 和禁用的 正常 按钮 然而 tkinter 并不同等对待这两种禁用图标 禁用的选项菜单图标比 正常 禁用按钮图标稍暗
  • 如何标记视频播放器以从其他应用程序打开视频文件?

    我写了一个视频播放器 想知道 当您从其他应用程序 例如文件浏览器 单击视频文件时 会出现可以打开该视频文件的应用程序列表 如何让我的玩家也出现在该列表中 Thanks 您必须注册Intent你想要在你的活动中 从 API 15 开始 您需要
  • Xcode PhoneGap navigator.connection 未定义

    尝试将我的 PhoneGap javascript 代码移植到 Xcode 中以便在 iOS 中进行调试 使用 Cordova 3 0 0 当我打电话时 navigator connection type 我收到 navigator con
  • 在哪里可以获得 BERT 的预训练词嵌入?

    我知道 BERT 的总词汇量为 30522 其中包含一些单词和子词 我想获得 BERT 的初始输入嵌入 所以 我的要求是获得尺寸表 30522 768 我可以通过 token id 进行索引来获取其嵌入 我在哪里可以得到这张桌子 BertM
  • gl_PointSize、gl_Position、gl_FragCoord之间的关系

    例子 VS 着色器 void main gl Position vec4 0 0 0 1 gl PointSize 100 0 画布为 1x5 像素 宽度 高度 片段着色器使用 gl FragCoord 这 5 个像素的 gl FragCo
  • 从活动类中打开 Android 导航抽屉

    我正在开发安卓系统Navigation Drawer通过他们的文档看起来 抽屉只能扩展 Fragment Activity 因此要从我的所有活动中打开抽屉 我需要将我的所有活动变成一个片段 这不是一个可行的解决方案 有没有办法打开一个从 A
  • 如何在删除 SQLite 数据库中的行后更新 KEY_ROWID

    从数据库中删除一行后 如何更新 SQLite 数据库中的 KEY ROWID 编号 情况1 例如 如果我的数据库中有五行 则此时 KEY ROWID 的最大值为 5 我删除表中的所有行 然后我添加新行 此时KEY ROWID不再从1开始 它
  • Terraform 从 Packer 中创建的托管磁盘映像创建 VM

    我已经使用 Packer 创建了一个自定义 VM 映像 现在我尝试使用 Terraform 基于此映像创建一个新 VM 但我对如何设置 TF 文件感到困惑 我可以创建其余的基础设施 我认为我的打包器 json 文件创建了一个托管磁盘映像 但
  • Objective-c 中的 AES256 解密问题

    我正在尝试使用以下代码片段来解密文件 该文件是使用 32 字节密钥加密的 因此 当我尝试加密文件数据时 一切正常 但是当我尝试解密时 程序甚至没有通过条件if cryptStatus kCCSuccess 在 CryptoExtension