AES ECB iOS 加密

2023-12-15

我尝试使用 AES 算法和 ECB 选项来加密一些字符串。

size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionECBMode,
                                      encryptionKey, kCCKeySizeAES128,
                                      NULL /* initialization vector (optional) */,
                                      [self bytes], dataLength, /* input */
                                      buffer, bufferSize, /* output */
                                      &numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
    return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}

但 func 返回 kCCAlignmentError (-4303)

然后我尝试对齐数据:

unsigned long diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);
unsigned long newSize = 0;

if (diff > 0) {
    newSize = dataLength + diff;
}

char dataPtr[newSize];
memcpy(dataPtr, [self bytes], [self length]);
for(int i = 0; i < diff; i++) {
    dataPtr[i + dataLength] = 0x20;
}

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionECBMode,
                                      encryptionKey, kCCKeySizeAES128,
                                      NULL /* initialization vector (optional) */,
                                      dataPtr, sizeof(dataPtr), /* input */
                                      buffer, bufferSize, /* output */
                                      &numBytesEncrypted);

输入字符串

"test_string,test2"

结果是

jxtFOhYpgBVieM90zx9oDanqBkcsVAvRRJsM4GL3cio=

在 Android 上结果是

jxtFOhYpgBVieM90zx9oDUfV7v43WFv7F5bzErfxrL8=

我做错了什么?


简而言之,AES 是一种块密码,这意味着它要求输入数据是块大小的倍数(AES 为 16 字节)。您的输入数据是 17 个字节,因此存在对齐错误。 (这不是在谈论内存中的对齐方式)。

处理这个问题的方法是在选项中指定 PKCS#7 填充:

kCCOptionPKCS7Padding | kCCOptionECBMode

输入数据将被填充到块倍数,并且在解密时填充将被删除。为了在加密中实现这一点,有必要将输出缓冲区增加一个块大小。

考虑不使用[ECB模式](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29(向下滚动到企鹅),它不安全。

如果您在 Android 上使用 mcrypt:don't,它是废弃软件,不支持标准填充,仅支持空填充。相反考虑defuse or RNC加密器这是一个完全安全的实现,可用于 iOS 和 Java。

如果您确实使用 mcrypt,您将需要添加自己的PKCS#7 填充.

这是示例代码:

+ (NSData *)doCipher:(NSData *)dataIn
                 key:(NSData *)symmetricKey
             context:(CCOperation)encryptOrDecrypt // kCCEncrypt or kCCDecrypt
{
    CCCryptorStatus ccStatus   = kCCSuccess;
    size_t          cryptBytes = 0;    // Number of bytes moved to buffer.
    NSMutableData  *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];

    ccStatus = CCCrypt( encryptOrDecrypt,
                       kCCAlgorithmAES128,
                       kCCOptionPKCS7Padding | kCCOptionECBMode,
                       symmetricKey.bytes, 
                       kCCKeySizeAES128,
                       0,
                       dataIn.bytes, dataIn.length,
                       dataOut.mutableBytes, dataOut.length,
                       &cryptBytes);

    if (ccStatus != kCCSuccess) {
        NSLog(@"CCCrypt status: %d", ccStatus);
    }

    dataOut.length = cryptBytes;

    return dataOut;
}

PHP PKCS#7 填充示例:
添加 PKCS#7 填充

$padLength = $blockSize - (strlen($clearText) % $blockSize);
$clearText = $clearText . str_repeat(chr($padLength), $padLength);

去除 PKCS#7 填充

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

AES ECB iOS 加密 的相关文章

  • 如何在 iOS 中查找蓝牙音频设备

    好的 我正在开发一个有趣的项目 该项目有一个障碍 我需要为我的 iOS 应用程序启用蓝牙音频支持 我遇到的障碍是我什至无法开始获取已连接的蓝牙音频设备的列表 即使我的 iPhone 5S 可以识别我的耳机 大约 3 4 岁的耳机 LG HB
  • 如何将导航栏大标题转换为多行,居中对齐

    我正在尝试设计具有多行居中大标题文本的视图控制器 就像苹果的 Ask Siri Settings gt General gt Keyboards gt About Ask Siri Dictation and Privacy 我可以使用以下
  • 如何在 iOS 上压缩 Realm DB?

    我想定期压缩 iOS 上的 Realm 实例以回收空间 我认为该过程是将数据库复制到临时位置 然后将其复制回来并使用新的default realm 文件 我的问题是Realm 其行为就像单例并回收对象 因此我无法真正关闭它并告诉它打开新的
  • UITextView 动画更改框架不会动画文本重新分配

    我有一个 UITextView 我试图在用户点击按钮时为框架的变化设置动画 基本上 文本视图会变大以适应屏幕 以便可以显示更多文本 然后当用户再次点击按钮时 它会缩小到原始框架 我使用块执行动画 如下所示 if isDisplayingDe
  • 是否可以使“HTML 到语音”与“文本到语音”相同?

    我有一个奇怪的要求 在我现有的应用程序中我有Text2Speech为此 我使用了AVSpeechSynthesizer 到语音文本 但现在要求发生了变化 现在我需要将 HTML 文件数据转换为文本 例如HTML2Speech 我们可以想到的
  • 如何在IOS中的UIStackView中设置权重

    UIStackView与安卓类似LinearLayout但我不知道如何设置子视图的权重 假设我有一个垂直的UIStackView and 3 UIImageView就在里面 我想连续设置权重3 6 1UIImageViews 我怎么做 UI
  • ios 用户如何取消 Facebook 登录?

    当用户到达此屏幕时 无法取消 我能做些什么 为了首先获得这个视图 我正在运行 NSMutableDictionary params NSMutableDictionary dictionaryWithObjectsAndKeys vid l
  • 本地化现有的 iOS 应用程序

    我不敢相信以前没有人问过这个问题 要么是我的编码实践太无组织性 要么是我没有使用正确的关键字 How can I localize an existing iOS app that does not use NSLocalizedStrin
  • 如何打开定位服务

    当有人第一次拒绝时 如何从实际应用程序重新打开定位服务 我可以选择关闭或打开它 您只能提示他们在屏幕上打开定位服务 如下所示 UIApplication sharedApplication openURL NSURL URLWithStri
  • 模块未使用库演化支持进行编译;使用它意味着无法保证二进制兼容性

    最近我遇到了 SDK 的编译时警告 这是否意味着它不是使用目标设置 构建用于分发的库 构建的 你需要设置Build Libraries for Distribution在项目中Build Settings to No然后它就会消失
  • Parse.com 从相关 PFObject 获取 PFUser

    我正在将照片保存为 PFObject 解析 并使用 PFUser currentUser 用户 ID 作为其键之一 我想在表格视图中显示照片以及该 PFUser 的详细信息 但是当我尝试获取用户时 PFUser user self phot
  • 导入 RNCryptor 后架构 armv7 的未定义符号

    我导入了 RNCryptor 可以在这里找到 https github com rnapier RNCryptor https github com rnapier RNCryptor进入我的应用程序 但是 我在日志中收到了三个错误 Und
  • UIScrollView setZoomScale 将应用的旋转设置回零

    我已经从事地图替换工作很长一段时间了 整个事情的工作原理是UIScrollView由一个支持CATiledLayer 为了旋转我的地图 我旋转图层本身 使用CATransform3DMakeRotation 到目前为止效果很好 但如果我打电
  • 当地图视图只是屏幕的一部分时,如何在 iOS 模拟器中进行捏合?

    我在 iPad 上有一个视图 我正在添加MKMapView也就是说 全屏高度的一半 然而 当我尝试在 iOS 模拟器上进行捏合时 它不起作用 因为 to nubs 填充了模拟器上的整个 iPad 视图 And so with the map
  • 在 Xcode 5 中重命名 iOS 项目[重复]

    这个问题在这里已经有答案了 我需要重命名一个 iOS 项目 有没有办法在不开始一个全新项目的情况下做到这一点 我发现的所有其他信息都与 Xcode 4 或旧版本相关 这些方法似乎使项目崩溃 我在尝试任何名称更改之前创建了一个快照 在 Xco
  • Java AES 128 加密方式与 openssl 不同

    我们遇到了一种奇怪的情况 即我们在 Java 中使用的加密方法会向 openssl 生成不同的输出 尽管它们在配置上看起来相同 使用相同的键和 IV 文本 敏捷的棕色狐狸跳过了懒狗 加密为 Base64 字符串 openssl A8cMRI
  • 适用于 iPhone / iPad / iOS 的快速、精益 PDF 查看器 - 提示和提示?

    最近有很多关于绘制 PDF 的问题 是的 您可以使用UIWebView但这无法提供您所期望的优秀 PDF 查看器的性能和功能 您可以绘制PDF页面到 CALayer http www cocoabuilder com archive coc
  • 将 Firebase 云消息传递与 Windows 应用程序结合使用

    我在 Android 和 iOS 应用程序中使用 Firebase Cloud Messaging 但是我还有此应用程序的 Windows Mac OS 版本 我想保留相同的逻辑 我知道 Firebase Cloud Messaging 可
  • AVAssetExportSession 为零 iPhone 7 - Plus 模拟器

    AVAssetExportSession在 iPhone 6 及以下版本上运行良好 但在 iPhone 7 iPhone 7 Plus 模拟器上运行不佳 Xcode 8 0 这段代码return nil在exportSession中 当在i
  • Swift 中的 import 语句是否有相关成本?

    阅读字符串宣言 我看到一个段落 https github com apple swift blob master docs StringManifesto md batteries included关于避免Foundation不需要的时候导

随机推荐

  • JavaScript 使用参数调用 VBA 例程

    我需要从 HTA 的 JavaScript 将参数传递给 Excel VBA 代码 我可以成功调用 VBA 函数 但无法正确传递字符串参数 JavaScript 函数可以传递不同的字符串参数 下面是简单和演示形式的代码 Excel VBA代
  • 如何在getter方法中获取调用组件的ID?

    给出以下示例
  • 移动设备上的 OutOfMemoryException

    我正在开发一个使用移动设备拍摄照片并使用网络服务发送照片的应用程序 但在我拍了 4 张照片后 我得到了OutOfMemoryException在下面的代码中 我尝试打电话GC Collect 但这也没有帮助 也许这里有人可以给我如何处理这个
  • 计算某个值在列中出现的次数(excel)

    好的 所以我有一个 Excel 文件 其中有一列可能包含像这样的重复值 采购订单编号 采购订单数量P100293490 4P100293490P100293490P100293490P100293492 2P100293492P100293
  • 调试窗口服务

    我想调试窗口服务 我应该在 main 中编写什么才能在窗口服务中启用调试 我正在使用 C 开发窗口服务 if DEBUG System Diagnostics Debugger Break this OnStart null System
  • Bot Framework 4 带有 ChannelData null 引用和 Facebook Messenger 的新活动

    我无法在 Facebook Messenger 中显示与此相关的任何按钮或图像 这太令人沮丧了 似乎没有任何作用 说明 样品等 似乎已经过时了 这是我的代码 在其他渠道中 我为此使用 SuggestedActions 我基本上是在问 是 或
  • MVC + RegisterClientScriptInclude / RegisterClientScriptBlock

    是否有与 Page ClientScripts RegisterClientScriptInclude 和 Page ClientScripts RegisterClientScriptBlock 等效的 MVC 我希望创建部分视图 这些视
  • 如何使用 FileSystemObject 进行“复制和重命名”

    使用文件系统对象在 VB VBA 或者我猜是本机 VBA 调用 中 我怎样才能 复制文件夹 重命名文件夹 所以 像这样 mFSO CopyAndRename targetFolder copyDirectory copyFolderName
  • Haskell 中有自定义预处理器的示例吗?

    我走过了阴谋集团Distribution Simple 包知道PreProcessor数据类型可用于定义自定义预处理器 但提供的例子并不是那么有用 我不知道如何调用预处理器 目前 我只是在中定义我自己的预处理器Setup hs file 有
  • php 中给定月份的下个月和上个月[重复]

    这个问题在这里已经有答案了 可能的重复 从给定日期 php 获取下个月和上个月的最佳解决方案是什么 我正在用 php 开发一个作品 在这里 我想获取给定月份的下个月和上个月 例如 mth December 我想显示 12 月的下一个和上一个
  • Rust 中如何进行错误处理以及常见的陷阱有哪些?

    我注意到 Rust 没有例外 Rust 中如何进行错误处理以及常见的陷阱有哪些 有没有办法通过加注 接住 再加注和其他东西来控制流程 我发现这方面的信息不一致 Rust 通常通过两种方式解决错误 不可恢复的错误 一旦您panic 就是这样
  • 何时/如何 - Outlet -> didSet

    我想知道 插座上的 didSet 何时 如何实际触发 例如 IBOutlet weak var modifyButton UIButton didSet modifyButton layer cornerRadius 9 当类刚刚初始化时
  • R - 在 Shiny UI 层中对文件进行 source() 处理

    我正在尝试将我的 Shiny 应用程序分解成更小的文件 以便通过 git 与同事进行协作更加容易 这个问题帮助我弄清楚如何source 通过使用将文件添加到我的 server rsource local T 现在我正在尝试对我的 UI 层做
  • 为什么这个函数返回一个(拥有的)值?

    代码 从 Genie 如何将字符串作为字符串数组重复 N 次Genie 如何将字符串作为字符串数组重复 N 次 def repeatwithsep e string n int separator string string var ele
  • mpirun:无法识别的参数 mca

    我有一个 C 求解器 需要使用以下命令并行运行 nohup mpirun np 16 my exec gt log txt 该命令将运行my exec独立于我的节点上可用的 16 个处理器 这曾经非常有效 上周 HPC 部门执行了操作系统升
  • 使用 Bootstrap 3 定位多个设备

    我正在开发针对手机 平板电脑和台式机的网站 假设我有一个 div 元素 处理这些设备的好方法是什么 我应该有 3 个不同版本的代码 或者也许我只需将所有类包含在一个 div 中 如下所示 div class col xs 12 col sm
  • 在窗口加载时通过 URL 将值传递给 JS 函数

    my page http www dinomuhic com 2010 index php使用正文中的 onLoad 调用在页面开头加载 Showreel 如下所示 96 是 SQL 库中节目卷的 ID JS 函数 sndReq 是使用 J
  • 如何通过C程序打印扩展ASCII字符127到160?

    我正在尝试下面的代码来打印所有 ASCII 字符 但它不会打印 127 到 160 的任何内容 我知道它们是控制字符集或一些拉丁 西班牙语字符 如果从Windows复制粘贴相同的字符 则在unix中打印效果很好 为什么不通过 C 程序呢 i
  • Android Studio 卡在“Gradle:解析依赖项‘_debugCompile’”或“detachedConfiguration1”上

    我不知道我在项目中更改了什么 但在构建 gradle 脚本时突然无法通过这一步 仅使用 gradle assemble 构建它是没有问题的 编辑 之前的卡点是解决依赖项 detachedConfiguration1 在第一次尝试 debug
  • AES ECB iOS 加密

    我尝试使用 AES 算法和 ECB 选项来加密一些字符串 size t bufferSize dataLength kCCBlockSizeAES128 void buffer malloc bufferSize size t numByt