从 Swift 或 Objective C 中使用密码短语编码的 RSA 私钥字符串中检索 SecKey

2024-01-04

我们有一个企业移动应用程序,附带加密的私钥。我们打算向用户提供密码以便使用该私钥,然后允许他们与后端服务器进行通信。我之前使用 Python 或 C# 进行了设置,但无法弄清楚如何在 Swift 或 Objective C 中执行此操作。我已经从这个堆栈溢出问题中改编了其中的一些内容:在 Swift 中使用 RSA 证书进行加密 https://stackoverflow.com/questions/60987780/encrypt-using-rsa-certificate-in-swift/60987781?noredirect=1#comment108655246_60987781

     static func getCertificate(from certificate: String?, usingPhrase phrase: String?) -> SecKey? {
        guard let certificate = certificate else {
            print("Nil string passed in, nil being returned")
            return nil
        }
        let beginning = "-----BEGIN ENCRYPTED PRIVATE KEY-----"
        let tail = "-----END ENCRYPTED PRIVATE KEY-----"
        let certificateString = certificate.replacingOccurrences(of: beginning, with: "")
                                           .replacingOccurrences(of: tail, with: "")
                                           .replacingOccurrences(of: "\n", with: "")
                                           .replacingOccurrences(of: " ", with: "")
        guard let data = Data(base64Encoded: certificateString) else {
            print("Unable to cast string to data")
            return nil
        }

        // ** I'm assuming here is where I need to decrypt the key before I can create the certificate **

        guard let cert = SecCertificateCreateWithData(nil, data as NSData) else {
            print("Unable to cast certificate to SecCertificate")
            return nil
        }

        var secTrust: SecTrust?

        // Retrieve a SecTrust using the SecCertificate object. Provide X509 as policy
        let status = SecTrustCreateWithCertificates(cert, SecPolicyCreateBasicX509(), &secTrust)

        // Check if the trust generation is success
        guard status == errSecSuccess else { return nil }

        // Retrieve the SecKey using the trust hence generated
        guard let trust = secTrust else {
            print("Trust policy not created")
            return nil
        }

        // ** I acknowledge that this method creates a public key and I am passing in a private key
        // ** I am not sure what method needs to be used instead
        guard let secKey = SecTrustCopyPublicKey(trust) else { return nil }

        return secKey
    }

最终,我需要使用密码解密私钥。我打算将它用作 SecKey,但获取它的 Base64 字符串表示形式也对我有用。我很乐意通过基于 Objective-C 或 Swift 的答案进行工作。

EDIT以下是用于测试目的的示例密钥:

-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIj6w/NvIjTXICAggA
MBQGCCqGSIb3DQMHBAi6qjkA0+yxyQSCBMhqdUDLRCLUjbgqe3rbF2lHn6yTsYbk
pfLWHkKT4pvQtaqXJvPZErb3E27va3HXvVDJfJS0/iwsnzIn6p2J9ZtgIGs4OBRU
kUw8lVAhNHTkAw/sj+OHdWexfOL5vKE3DgXqnAVGyhm4CNDXQ/9UDqkmtmHsMOlz
nqbOdWhMS/Uj/Dh41urw3sstpX4wZCHGTFNDL83pDAv7jfAZF/NSQq8ft/BPknMu
HLvYvd3fR4iKqKswcvR5c2q+CLbfEbXbVty6B/JMDSoi3wuh9lezMesIhTUYDSaK
QgkCEtrJ4FsO/tPXtyGvCjKVgvfvn8njQPtphq/gbKBeXpopsFGi19iY8fCkPQSb
Cp6FttMvJPwJvIb/qUZWGu9OWaBhmn0MH+qtXED6yxqXSyQDRYg1Vurfm0azQxUb
zJIy8qgla9GVvoGYpIGDvsQZFzur6le8G6/6c85raI9LZ88Bo8gEsTeQgPMxG1c+
7kRvn/hl/n0Oh8VsPOHjx2N/Y9vcmlyIlCDPIuGiYcNy1ICDv/kaBD9JVJVA5S7X
+MRZG8+EesjTiZseVUwK9OhnE4Jws2UzAk3zfMvzvnAgxue/FcRPUfYiHakNu83z
SFqayIUGz3zD0XLdWBVrh2QPvxW6eP3AFdIpjrPzwq1kDDw19VaAu7mw7JexrOyW
qvCO/VIHXqflL/OCxPT5BUQ9pbxTCEfv5wbWzczKWWub0AhPexDBW7wat3HwUGeb
oeEwnmNxAXxxz/RJeK1zKUAKGWQPI8X4bG/IZFmk1dgeJ8bo9My5b05Zw9d/gw7C
Xi5nZ5sG5ERp3jKLsT2czbr66w4HV4L38mASVtTUeXyySvnz//Ib40FC46Gi7SqP
pcpl1CrDi0UWe/cbQ/qkcaFrgdvIGsuSfZf8amq1FHnB47NUblYmm1WPCqeNtgzY
srAy/aVtF6FvG+uy6sCrP76c9HY1ZvyeO/82t/Sd5jnoq+VCKtarRNjEEfdwNGQp
X/ycspdn+a0XkXthSBvHWcCmQmgAV8Yp5TR0r2PgGqHk3lRq9/yKWy1gRuPSiRpZ
HzOOfZ4DmVELRf5R5+UCVJ5idkKZb2t+R7rl5/9grf8iCeUPngIkxrZvr4b7/mQm
fkmIMSUYT9CVeBprF5f2wLbbAmPpoUnULTnVzrOhZYCZGRQLyGGdX+CELBNxc8Er
dt4deeutCQm+H0d5V09HO9AOAwlESyt9q4CEAcSzSzzMygvWLe04csdcCSV2htAm
n0zDwhqGZ2LI+dUTGw4apOdBuNeveaHBrlp7XhCIOJ35SAWrb8baPizwl4iw5fA0
ucBZzRDAavDhj6XMQSwsOaCfzYfpASqwkm2Zjk3znWS18xpXRxvgqfCHpJRo9M4f
SQlRpT3Nqw5vn8BV+ioBvwxQd/1XsMbjKKwbwk+1wB/E/mHAiIQUQJ6Ec/WqzKqn
biqlBuSGLrS5O8ynu83DERFiatCAkNkl6nCaWtNu2KWtKM52y03BN3MBxS1kU+FI
afb7mN75j1gTZFH6EmujfVfrL/f8aO1dkxHO4IuWb5r7DaY7AByZgo1EKGiSIh3N
rtQVsAQr1/NcO6GVSHQU5egpI/eocvHvrAzsvlE2sqNBKm4NVogXjms7avKIbtA4
+Ro=
-----END ENCRYPTED PRIVATE KEY-----

该密钥的密码是

8720c10d735d7fb218b9e48db942a494

我获取了您提供的示例加密密钥并将其粘贴到这个优秀的 ASN.1 解码器 https://lapo.it/asn1js/。它产生以下结果:

这实际上是使用您拥有的密钥解密密文所需步骤的非常有用的摘要:

  • 前两个OBJECT IDENTIFIER条目暗示加密期间使用的填充模式以及用于从“密码”获取加密密钥的密钥派生函数:PKCS #5 填充和用于密钥派生的 PBKDF2。这OCTET STRING and INTEGER下面的值是 PBKDF2 的盐和迭代计数。
  • 第三OBJECT IDENTIFIER加密算法为CBC模式的TripleDES。不理想,但我想足够安全。这OCTET STRING下面是 8 字节 IV,因为 DES 具有 64 位块大小。
  • 决赛OCTET STRING是密文。

因此,总而言之,您需要:

  • 找到一种方法来获取您需要的值,例如salt、迭代计数、IV 和密文 - 假设用于这些密钥的算法保持不变。有时,您可以在原始数据中跳转并将这些值切分出来 - 根据您的需要,您可能需要使用 ASN.1 解码器。
  • 当需要解密时 - 取出盐和迭代计数(首先OCTET STRING and INTEGER)。拉出 IV(第二OCTET STRING)和密文(最后OCTET STRING).
  • 使用指定的盐和迭代计数将 PBKDF2 应用到您在问题中提供的密码。您需要从中提取 192 位密钥材料,因为我们使用的是 TripleDES。
  • 使用您提取的 IV,使用 CBC 模式中最后一步的密钥材料对密文进行解密。使用 PCKS#5 填充,这通常是默认值。
  • Done!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Swift 或 Objective C 中使用密码短语编码的 RSA 私钥字符串中检索 SecKey 的相关文章

  • 我可以/如何确定设备是否有振动?

    我有一些设置可以启用 禁用某些操作的振动 但我发现如果设备没有振动能力 则显示它们毫无意义 有没有办法检查用户是否正在使用 iPod touch 以及它是否有振动 我不确定除了进行模型检查之外还有其他方法可以做到这一点 这可能不是一个很好的
  • iOS 从另一个类更新 ViewController UILabel

    我是开发新手 一直在用头撞墙试图弄清楚这一点 我确信 我错过了一些愚蠢的东西 但在尝试了各种不同的解决方案后 我仍然无法得到结果我在寻找 我希望能够从另一个类更新 ViewController 中的 UILabel 这是一个我无法运行的小演
  • didReceiveRemoteNotification 未调用,iOS 10

    在 iOS 9 3 中 didReceiveRemoteNotification方法在以下两种情况下都会被调用 1 收到推送通知时 2 当用户通过点击通知启动应用程序时 但在 iOS 10 上 我注意到didReceiveRemoteNot
  • Swift:在标签背景中制作图像

    我想将标签放入带有角半径的红色矩形的图像中 条件是图像大小必须等于或略大于标签大小 为此我找到了一个类似的question https stackoverflow com questions 3037902 adding backgroun
  • 如何向数据添加填充以使其可以接受 pycrypto 库中的 AES256 加密算法

    有人可以告诉我如何向数据添加填充 使其可以接受 pycrypto 库 Python 中的 AES256 加密算法 提前非常感谢 看着文档 http www dlitz net software pycrypto doc 看来要由图书馆用户自
  • dyld:未找到符号:___NSDictionary0__ 在 XCode 7 和 iOS 目标 9.0 中使用带有发现文档的 google ServiceGenerator 二进制文件时

    我正在尝试使用 Google 从 Google 后端生成客户端 API 代码serviceGenerator以发现文档作为输入 以下是确切的命令 Users raja Library Developer Xcode DerivedData
  • 如何获取 iTunes connect 团队 ID 和团队名称?

    我正在写下一个Appfile for fastlane 我的问题是我已经有了team name and team id在 Apple 开发中心 但我无法获取iTunes Connect ID itc team id 我正在与不同的团队合作
  • 在 Grand Central Dispatch 中使用dispatch_sync

    任何人都可以用非常清晰的用例解释其目的是什么dispatch sync in GCD是为了 我不明白在哪里以及为什么我必须使用它 Thanks 当您想要执行一个块并等待结果时可以使用它 其中一个示例是使用调度队列而不是锁进行同步的模式 例如
  • 如何检查dispatch_async块是否已完成运行

    所以基本上我需要能够在块完成运行后运行 segue 我有一个块可以执行一些 JSON 操作 我需要知道它何时完成运行 我有一个队列 我称之为 json queue jsonQueue dispatch queue create com ja
  • 跨平台 IAP

    我已在 iOS 和 Android 中集成了应用内购买 自动续订订阅 两者都工作正常 我对使用跨平台验证 IAP 有一定的疑问 例如 当多个用户登录一个应用程序时 某一特定应用程序的订阅如何运作 例如 如果用户 A 有标准套餐并且从应用程序
  • 如何以编程方式创建 Unwind segue

    我制作了一个不使用故事板的应用程序 在我的应用程序的这一部分中 我需要创建一个展开转场ThirdViewController to FirstViewController仅以编程方式 我知道如何使用 sotorybard 执行此操作 但找不
  • 如何从 UITableViewController 中的静态单元格获取文本字段?迅速

    我的视图层次结构如下所示 UIViewController 类型的 ElevethViewController容器视图嵌入容器视图中的 UITableViewController 类型的 ManagedTableEleventhViewCo
  • 将 GestureRecogniser 附加到多个图像视图

    今天我在将相同的手势识别器附加到多个图像视图时遇到了一些奇怪的事情 它仅附加到最后一个视图 换句话说 它只能附加到一个视图 我必须创建多个手势识别器才能满足我的要求 以下是我所做的 我做的对吗 这是将识别器附加到多个图像视图的唯一方法吗 请
  • Swift 2.1- tabBarController!.selectedIndex 返回大整数

    我需要把tabBarController selectedIndex常量内的数字 我期望一个介于 0 和 3 之间的数字 具体取决于我选择的选项卡 但我得到的数字如下2147483647 有什么想法吗 代码是 let selectedTab
  • 模拟 Push Segue 的自定义 Segue 将 VC 变成僵尸

    使事情简短明了 我写了一个自定义的segue void perform UIView preV UIViewController self sourceViewController view UIView newV UIViewContro
  • Core Data + CloudKit 无法在其他设备上自动刷新?

    我的 SwiftUI 应用程序与 Core Data CloudKit 一起使用 我可以从 Mac 或 iPhone 将新条目保存到数据库中 该应用程序对所有设备使用完全相同的项目 代码库 唯一的问题是我需要关闭应用程序并重新打开它才能查看
  • Objective-C 2.0中的多线程问题

    我有我的主应用程序委托 其中包含一个返回对象的方法 该应用程序委托在主线程上运行 我还有一个在不同线程上运行的 NSOperation 除了希望有时能够在主线程上调用我的应用程序委托方法之外 我还需要从 NSOperation 线程中调用它
  • 如何使 SwiftUI 列表行背景颜色扩展整个宽度,包括安全区域之外

    在 SwiftUI 中List 如何制作列表行背景 通过设置 listRowBackground 扩展视图的整个宽度 甚至在安全区域下方 例如 在宽屏 iPhone 例如 iPhone 12 Pro Max 上横向运行时 目前 该单元格在安
  • 为 CocoaPods 插件设置 Xcode

    我正在尝试设置终端 Xcode 以便正确工作Xcode CocoaPods 插件 https github com kattrali cocoapods xcode plugin 当我从插件运行集成 cocoapods 选项时 我收到一条消
  • 带 cookie 的 Alamofire 请求

    我是初学者 我不知道如何使用 Alamofire 发出 GET 请求 但它需要身份验证 我设法用其他网络服务 登录 来做到这一点 因为它需要参数参数 parameters username username password passwor

随机推荐

  • 多个线程对资源的独占访问

    对于线程来说 是否有相当于 SIGSTOP 和 SICONT 的东西 我正在使用 pthreads 谢谢 编辑 我正在实现线程之间文件访问同步的粗略形式 因此 如果一个文件已被一个线程打开 而另一个线程想要再次打开它 我需要在第二个线程执行
  • Firefox 选择文本范围

    一个简单的问题 如何在 FireFox 中以编程方式选择页面的文本片段 例如 有一段文本 用户单击按钮 然后选择第 10 到 15 个符号 就像用户以常规方式拖动鼠标一样 在 Firefox 中 您可以使用Range https devel
  • 暂停应用程序后出现 com.android.volley.NoConnectionError

    我正在使用 Google Volley 和 Gson 编写我的应用程序 以使用 OkHttp 作为 HTTP Stack 与 REST 服务进行通信 这在大多数情况下都工作得很好 但是当我暂停我的应用程序并返回到它时 HTTP 请求无法处理
  • 有没有办法在 Kubernetes 中保留传出流量的源端口?

    在大多数 TCP 客户端 服务器通信中 客户端使用随机通用端口号进行传出流量 但是 我的客户端应用程序在 Kubernetes 集群内运行 必须使用特定的端口号进行传出流量 这是由于服务器的要求 当应用程序在外部运行时 这通常工作正常 但在
  • 如何在 Android 中以编程方式在小米手机安全应用程序中启用我的应用程序的自动启动选项

    我的应用程序在除 MI 之外的所有移动设备上都得到了良好的评价 因为MI限制了我的App后台服务的运行 在 安全 中启用 自动启动 中的应用程序后 它可以完美运行 那么我可以通过编程方式在 MI Security App 中为我的应用程序启
  • NLTK WordNet Lemmatizer:它不应该对单词的所有词形变化进行词形还原吗?

    我将 NLTK WordNet Lemmatizer 用于词性标记项目 首先将训练语料库中的每个单词修改为其词干 就地修改 然后仅在新语料库上进行训练 然而 我发现词形还原器没有按我的预期运行 例如 这个词loves被词形还原为love这是
  • 如何在 ECR 中重新标记图像?

    我正在尝试跟随使用 AWS CLI 重新标记映像 https docs aws amazon com AmazonECR latest userguide image retag html我开始怀疑这本指南已经过时了 我将许多 Docker
  • Seaborn 中的堆积条形图

    我有以下数据 countries2012 Bolivia Brazil Sri Lanka Dominican Republic Indonesia Kenya Honduras Mozambique Peru Philipines Ind
  • 为什么我的 XAML 控件没有显示在代码隐藏中?

    我今天启动了 Windows 开发者预览版 希望将一些代码导出并放入一个正常运行的 Metro 应用程序中 我对 Windows 应用商店的推出感到很兴奋 我想成为其中的一部分 所以我启动 VS11 Express 并开始编码 当出现以下情
  • 如何设置 Angular 4 背景图片?

    我正在尝试以下几行来设置背景图像 但它不起作用 在我的应用程序中不断设置背景图像的方式是什么 应用程序组件 html div div
  • 当 GroupView 处于活动状态时,向 TListView 添加或插入项目总是将其添加到末尾

    在德尔福 2009 中 当 TListView 的 GroupView 处于活动状态时 向 TListView 添加或插入项目总是将其添加到列表的末尾 无论参数指定的 Index 是什么 当 GroupView 设置为 false 时 它
  • xml主记录和其他一堆相关节点值之间的1对n关系(III)

    再次在这里提出另一个 相当 小 的请求 它与我之前的主题中介绍的相关 XSLT 通过下一行节点的值获取一些计算出的节点值 https stackoverflow com questions 55302887 xslt get some ca
  • Java 8 流对象显着内存使用

    在查看一些分析结果时 我注意到在紧密循环中使用流 而不是另一个嵌套循环 会导致类型对象的显着内存开销java util stream ReferencePipeline and java util ArrayList ArrayListSp
  • 如何在java中的ArrayList上添加监听器

    我想在 java 中创建我自己的 ArrayList 实现 它可以在列表更改时进行监听 并在发生这种情况时执行操作 根据我所读到的内容 我了解到我无法扩展 ArrayList 然后添加侦听器 我想在类中使用 MyList 作为变量publi
  • UINavigationController“pushViewController:animated”的完成处理程序?

    我正在使用创建一个应用程序UINavigationController呈现下一个视图控制器 iOS5 提供了一种新的呈现方法UIViewControllers presentViewController animated completio
  • 到达某个页面后弹出浏览器返回父浏览器

    我有一个弹出窗口 我必须使用它 通过单击链接打开 我让用户浏览一系列页面 选择属性 然后将其发送到购物车 我的问题 用户到达选择过程结束后 我想终止打开的弹出窗口并将请求发送回原始浏览器 父浏览器 以便用户可以结账 知道我该怎么做吗 Jav
  • 关闭托管进程的最佳方法

    我有启动进程 B 的进程 A 他们以WCF IAsyncResult APM模式 进行通信 A是客户端B是服务 当进程 A 终止时 我需要关闭 B 我将进程 A id 作为 arg 发送给进程 b 他执行了以下操作 Process GetP
  • 希望编写电气工程相关的开放软件[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如果这个问题有点宽泛 我深表歉意 希望您的回答能帮助我将范围缩小到更有意义的问题 我在软件工程方面经验丰富 最近与一位朋友进行了交谈
  • AWS Lambdas 的本地开发服务器

    是否有本地运行 AWS Lambda 的开发服务器 我的要求是 nodejs服务器 没有ruby or go或除此之外需要安装的任何东西node and npm包 创建一个我可以查询的服务器wget curl或发送各种事件的 API 测试工
  • 从 Swift 或 Objective C 中使用密码短语编码的 RSA 私钥字符串中检索 SecKey

    我们有一个企业移动应用程序 附带加密的私钥 我们打算向用户提供密码以便使用该私钥 然后允许他们与后端服务器进行通信 我之前使用 Python 或 C 进行了设置 但无法弄清楚如何在 Swift 或 Objective C 中执行此操作 我已