如何在iOS Objective-C中实现php的openssl_encrypt()方法?

2024-04-14

我想实现php的openssl_encrypt()中的方法iOS Objective-C。因此我尝试了这段代码:

    #import <CommonCrypto/CommonHMAC.h>
    #import <CommonCrypto/CommonCryptor.h>
    - (void)viewDidLoad {
       [super viewDidLoad];
    NSData *dataIn     = [@"123456" dataUsingEncoding:NSISOLatin1StringEncoding];

    NSString *key = @"ygXa6pBJOWSAXXX/J6POVTjvJpMIiPAMQiTMjBrcOGw=";
    NSData *decodedKeyData = [[NSData alloc] initWithBase64EncodedString:key options:0];


    uint8_t randomBytes[16];
    NSMutableString *ivStr;
    int result = SecRandomCopyBytes(kSecRandomDefault, 16, randomBytes);
    if(result == 0) {
        ivStr = [[NSMutableString alloc] initWithCapacity:16];
        for(NSInteger index = 0; index < 8; index++)
        {
            [ivStr appendFormat: @"%02x", randomBytes[index]];
        }
        NSLog(@"iv string is %@  %lu" , ivStr , ivStr.length);
    } else {
        NSLog(@"iv string failed for some reason");
    }

    NSData *iv         = [[NSData alloc] initWithBase64EncodedString:ivStr options:0];

    // setup key
    unsigned char cKeyR[kCCKeySizeAES256];
    bzero(cKeyR, sizeof(cKeyR));
    [decodedKeyData getBytes:cKeyR length:kCCKeySizeAES256];
    // setup iv
    char cIv[kCCBlockSizeAES128];
    bzero(cIv, kCCBlockSizeAES128);
    if (iv) {
        [iv getBytes:cIv length:kCCBlockSizeAES128];
    }
    // setup output buffer
    size_t bufferSize = [dataIn length] + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    // do encrypt
    size_t encryptedSize = 0;
    CCCryptorStatus cryptStatus = CCCrypt(
                                          kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          cKeyR,
                                          kCCKeySizeAES192,
                                          cIv,
                                          [dataIn bytes],
                                          [dataIn length],
                                          buffer,
                                          bufferSize,
                                          &encryptedSize
                                          );

    NSData *encrypted = [NSData dataWithBytesNoCopy:buffer length:encryptedSize];
    NSString *encStr = [encrypted base64EncodedStringWithOptions:0]; 
}

但这与 php 中的 openssl_encrypt() 方法不同。我检查了 iv、key 和其他方法。长度和字节输出是正确的,但是当在另一种方法中使用输出时,它是错误的。


  1. decodedKeyData是 32 字节)(256 位),但密钥大小指定为kCCKeySizeAES192.

  2. 只需使用randomBytes作为 IV,将其转换为 Base64 并返回是没有意义的。

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

如何在iOS Objective-C中实现php的openssl_encrypt()方法? 的相关文章

随机推荐

  • Jenkins CLI 连接被拒绝

    执行时 java jar jenkins cli jar s https jenkins url help 由于某种原因我的连接被拒绝 Jenkins版本是1580 3 用户拥有Jenkins服务器的权限 cli jar是最新的并且ssh公
  • SQL INNER JOINing 2 子查询

    我试图将这两个子查询 我认为这就是它的名字 内部联接在一起 其中第一个查询的branchName等于第二个查询的branchName 然而 他们似乎并不想联合起来 而且以我有限的 SQL 知识 我似乎找不到解决这个问题的方法 我尝试将括号移
  • Tegra 平板电脑上的 NDK 调试

    今天 我购买了用于本机开发的 Android 平板电脑 采用 Tegra 的 Acer Iconina Tab A500 Honeycomb 3 1 然后我从以下位置下载并安装了 Tegra Android Development Pack
  • Google Cloud Text To Speech API 快速入门示例

    我是这个论坛的新手 我正在尝试让 Google Cloud TTS API 正常工作 但遇到了一些问题 页面是 https cloud google com text to speech docs quickstart protocol h
  • SolrCloud:无法创建集合、锁定问题

    我一直在尝试实现 SolrCloud 一切正常 直到我尝试创建包含 6 个分片的集合 我的设置如下 5 个虚拟服务器 全部运行 Ubuntu 14 04 由一家公司跨不同数据中心托管 为整体运行 ZooKeeper 3 4 6 的 3 台服
  • C# 清除ListView中的所有项目

    我尝试清除列表视图 但清除方法不起作用 myListView Items Clear 这是行不通的 当我在这一行放置断点时 该行将被执行 但我的列表视图不为空 怎么会 我通过将列表视图的数据源设置为数据表来填充列表视图 我现在的解决方案是将
  • 如何在 Symfony4 中将用户添加到 Sentry 以应对所有异常?

    我将 Sentry 添加到我的项目中 但它不会添加某些事件的当前登录用户 我添加了一个事件订阅者 但我不确定我是否真的需要它 对于像 ArgumentCountError 这样的例外情况 一切正常 对于 NotFoundHttpExcept
  • 构建上周、本周和下周的日期数组

    我经常被 Python 中日期的问题绊倒 在我的网络应用程序中 我想显示日历三周的每一天 上周 本周和下周 星期一表示一周的开始 我目前处理这个问题的方法是向后退一步直到星期一 然后再减去 7 天 然后添加 20 天来构建三周范围 但这感觉
  • SwiftUI 中的重复工具栏

    我将工具栏添加到 2 个文本字段 但工具栏显示了两次 这是我的自定义文本字段的代码 public struct SUIDecimalField View public var body some View TextField placeho
  • 在 Google Cloud 中设置网站? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我完全迷失在这之中 我习惯于使用带有 cpanel 的简单 Web 主机来制作网站 只需使用 filezilla 登录并上传我的 ht
  • 如何在 MAC OS X 中获得最大 TCP 接收/发送窗口?

    如何在 MAC OS X 中获得最大 TCP 接收 发送窗口 Linux中有两个ctl proc sys net core rmem max 最大 TCP 接收窗口 NET CORE RMEM MAX proc sys net core w
  • 如何在Android应用程序中读取xlsx文件?

    我知道 stackoverflow 上有很多相同的问题 但似乎我看不到任何可能的解决方案来读取 xlsx 的内容 我尝试过的 我尝试将整个 Apache POI 库放入 Android 应用程序中 并尝试读取 xlsx 文件 然而 问题是
  • Authlogic 中会话模型的自定义验证消息

    在 Authlogic 的会话模型中覆盖登录 密码验证消息的最佳方法是什么 在用户模型中 Authlogic 提供了 merge 方法来覆盖验证选项 但 Session 没有类似的东西 有什么建议么 Authlogic有它自己的国际化等级
  • 覆盖嵌套控件中的隐式样式

    我的应用程序中有一个资源字典 其中它们是为 textblock 定义的通用样式 该字典与 app xaml 合并 现在我有一个要求 我需要在对话框窗口中更改 tabitem 的样式并基于几个触发器设置前景 我已经定义了自己的文本块样式并为
  • Foo f = Foo(); // 没有匹配的函数来调用 'Foo::Foo(Foo)' ... 嗯?

    class Foo public explicit Foo explicit Foo Foo Foo d Foo 错误 没有匹配的函数可用于调用 Foo Foo Foo 我尝试改变Foo Foo to Foo Foo 正如错误所示 据我所知
  • 用于将长 IPv6 地址转换为其压缩形式的 Java 库 [重复]

    这个问题在这里已经有答案了 我想知道是否有一个库可以用来将长 IPv6 地址 例如 2002 9876 57AB 0000 0000 0000 0000 0001 的表示形式转换为压缩的 IPv6 形式 以本例 2002 9876 57AB
  • 现代 Android 中的后台处理

    我已经实现了一些后台任务并使用这个Guide https developer android com guide background 有一次我需要使用协程工作者 https developer android com topic libr
  • 如何使用可分页Spring数据JPA选择不同的值?

    我想在我的表中使用分页进行不同的选择 但它声称存在此错误 有谁知道如何解决它 Error org postgresql util PSQLException ERROR for SELECT DISTINCT ORDER BY expres
  • 需要生成的 JSON 文档与 iOS 中 NSMutableDictionary 中插入的对象的顺序相同

    我正在从 NSMutableDictionary 生成一个 JSON 文档 该文档由指向 NSStrings 的键以及两个依次指向其他 NSMutableDictionary 的键组成 我的问题是 当我输出 JSON 文档时 我注意到 JS
  • 如何在iOS Objective-C中实现php的openssl_encrypt()方法?

    我想实现php的openssl encrypt 中的方法iOS Objective C 因此我尝试了这段代码 import