快速从模数和指数创建 SecKey

2024-03-20

我尝试制作自己的 SecKey

exponent:
let exponent = "10001"

modulus: 
let modulus = "D6250B831F82EC984513922E797283E4D3879E1F0AD52364EBDA5A5696F6E75CDCE0704A993F3F95AA557A6882A525EC4B8344DA3E7DFDECCBACCEF18131E461D3C5D3D7E1334C6AE27E5CDEF8A577857542BCBEF6CF021B0EE5604534E6C6CBAEFA6EFFC1AB93DEE7CE51A8C8F2B7345680BDF840841C3A6F654CD1F10BA2FD5CA1C6E782A8FAEC79BD22FA12116D75FFAEDB2DEC151E0B60DB91F2E74BA78EFBB45DF739AF9CDD41C482DC22FC76E03C8E2141BDAE5406C0DA230E2C7EFFC68C8811E1544496332B03BCFF0F627A8DF51D2E2B32B0771D1C6F87AD56010DCB7A3862C63B88B2CF7D7AD40CC53AF0CFEC0820777C9CCE95A58848D67779AE8D"

作为 publicKey 在 Swift 中加密文本。有人能帮我吗?

这是我的代码:

import Foundation
import Security

class Encryption {

var publicKeyPtr, privateKeyPtr: Unmanaged<SecKey>?
var publicKey, privateKey: SecKey?
let parameters: [String:String] = [kSecAttrKeyType: kSecAttrKeyTypeRSA, kSecAttrKeySizeInBits: "2048"]

init(){

}

func genKey() {

    let status = SecKeyGeneratePair(parameters, &publicKeyPtr, &privateKeyPtr)
    publicKey = publicKeyPtr!.takeRetainedValue()
    privateKey = privateKeyPtr!.takeRetainedValue()

}


func encrypt(plainText: String, publicKey: SecKey) -> [UInt8]{
    let blockSize = SecKeyGetBlockSize(publicKey)
    let plainTextData = [UInt8](plainText.utf8)
    let plainTextDataLength = UInt(countElements( plainText))
    var encryptedData = [UInt8](count: Int(blockSize), repeatedValue: 0)
    var encryptedDataLength = blockSize
    let result = SecKeyEncrypt(publicKey, SecPadding(kSecPaddingPKCS1),
        plainTextData, plainTextDataLength, &encryptedData, &encryptedDataLength)

    return encryptedData
}


func decrypt(data: [UInt8]) -> String{
    let blockSize = SecKeyGetBlockSize(publicKey)
    var decryptedData = [UInt8](count: Int(blockSize), repeatedValue: 0)
    var decryptedDataLength = blockSize
    let result = SecKeyDecrypt(privateKey, SecPadding(kSecPaddingPKCS1),
        data, blockSize,
        &decryptedData, &decryptedDataLength)

    let decryptedText = String(bytes: decryptedData,
        encoding:NSUTF8StringEncoding)

    return decryptedText!
}

}


对于仍在寻找答案的人来说,也许我可以提供帮助。

SecKeyCreateWithData

从 iOS 10 开始你可以使用SecKeyCreateWithData https://developer.apple.com/documentation/security/1643701-seckeycreatewithdata?language=swift创建一个SecKey来自该密钥的外部表示。

该表示形式的格式应与返回的格式相同SecKeyCopyExternalRepresentation https://developer.apple.com/documentation/security/1643698-seckeycopyexternalrepresentation。正如在docs https://developer.apple.com/documentation/security/1643698-seckeycopyexternalrepresentation,RSA 密钥的格式为 PCKS#1。

所以为了创建一个SecKey根据给定的模数和指数,我们需要获取该密钥的 PKCS#1 表示形式。

引用自PKCS#1 https://www.rfc-editor.org/rfc/rfc3447#appendix-A.1.1:

RSA 公钥应使用 ASN.1 类型表示
RSA公钥:

  RSAPublicKey ::= SEQUENCE {
      modulus           INTEGER,  -- n
      publicExponent    INTEGER   -- e
  }

RSAPublicKey 类型的字段具有以下含义:

  • 模数是 RSA 模数 n。
  • publicExponent 是 RSA 公共指数 e。

该 ASN.1 类型需要使用来表示DER https://msdn.microsoft.com/en-us/library/windows/desktop/bb648640(v=vs.85).aspx以获得数据SecKeyCreateWithData期望。

以正确的格式获取数据

下面我将尝试讨论如何在 Swift 中获取所需的数据格式。请注意,您也可以从命令行使用 OpenSSL 来执行此操作,如果您只需要执行一次,这可能会更容易。

中给出了需要做什么的很好的概述本文 https://digitalleaves.com/blog/2015/10/sharing-public-keys-between-ios-and-the-rest-of-the-world/作者:伊格纳西奥·涅托·卡瓦哈尔。

基本上,您需要将模数和指数编码为整数 https://msdn.microsoft.com/en-us/library/windows/desktop/bb540806(v=vs.85).aspx然后将它们组合成一个德序列 https://msdn.microsoft.com/en-us/library/windows/desktop/bb648645(v=vs.85).aspx.

您可以找到一些有关如何执行此操作的代码here https://github.com/airsidemobile/JOSESwift/blob/master/JOSESwift/Sources/CryptoImplementation/DataRSAPublicKey.swift and here https://github.com/airsidemobile/JOSESwift/blob/master/JOSESwift/Sources/ASN1DEREncoding.swift. (免责声明:我是该库的贡献者之一。)

我将尝试在下面总结一下。

假设我们有一个 RSA 模数和公共指数作为字节数组。从模数和指数的不同表示形式获取字节数组应该不会太难。

let exponent: [UInt8] = [
    1, 0, 1
]

var modulus: [UInt8] = [
    136, 0, 243, 196, 194, 126, 151, 243, 72, 84, 246, 234, 207, 215, 168, 5, 233, 212, 8, 37, 34, 52, 215, 217, 223, 183, 58, 129, 66, 112, 88, 71, 201, 71, 33, 156, 132, 7, 189, 234, 110, 6, 46, 189, 233, 206, 61, 128, 220, 138, 56, 49, 34, 159, 245, 208, 214, 49, 169, 58, 170, 68, 127, 93, 137, 99, 74, 54, 65, 109, 112, 33, 65, 169, 246, 176, 128, 121, 171, 35, 214, 236, 210, 123, 94, 146, 86, 30, 134, 135, 116, 124, 4, 55, 208, 163, 219, 220, 203, 249, 107, 69, 147, 169, 66, 214, 179, 195, 152, 211, 209, 78, 100, 114, 209, 203, 120, 16, 254, 24, 39, 143, 79, 49, 202, 10, 37, 2, 155, 162, 14, 253, 194, 205, 74, 116, 60, 205, 25, 53, 85, 144, 72, 11, 7, 133, 78, 149, 111, 0, 215, 174, 36, 104, 175, 62, 196, 197, 49, 78, 172, 146, 82, 216, 160, 45, 48, 212, 50, 168, 208, 255, 205, 82, 22, 11, 13, 156, 197, 42, 159, 26, 124, 237, 178, 131, 239, 186, 37, 96, 24, 154, 243, 202, 252, 87, 102, 23, 19, 29, 73, 130, 95, 45, 219, 104, 13, 54, 30, 165, 144, 223, 1, 14, 169, 100, 111, 246, 54, 185, 47, 156, 238, 249, 88, 33, 244, 135, 233, 102, 36, 86, 196, 143, 178, 176, 62, 24, 178, 209, 163, 244, 116, 236, 81, 177, 190, 205, 140, 230, 6, 113, 158, 105, 111, 123
]

然后我们需要确保模数的前缀为0x00 to 表明它是一个非负数 https://msdn.microsoft.com/en-us/library/windows/desktop/bb540806(v=vs.85).aspx.

modulus.insert(0x00, at: 0)

现在我们将模数和指数编码为INTEGERs https://msdn.microsoft.com/en-us/library/windows/desktop/bb540806(v=vs.85).aspx.

var modulusEncoded: [UInt8] = []
modulusEncoded.append(0x02)
modulusEncoded.append(contentsOf: lengthField(of: modulus))
modulusEncoded.append(contentsOf: modulus)

var exponentEncoded: [UInt8] = []
exponentEncoded.append(0x02)
exponentEncoded.append(contentsOf: lengthField(of: exponent))
exponentEncoded.append(contentsOf: exponent)

并将这些结合起来INTEGERs https://msdn.microsoft.com/en-us/library/windows/desktop/bb540806(v=vs.85).aspx to a SEQUENCE https://msdn.microsoft.com/en-us/library/windows/desktop/bb648645(v=vs.85).aspx.

var sequenceEncoded: [UInt8] = []
sequenceEncoded.append(0x30)
sequenceEncoded.append(contentsOf: lengthField(of: (modulusEncoded + exponentEncoded)))
sequenceEncoded.append(contentsOf: (modulusEncoded + exponentEncoded))

以下是计算上面使用的 DER 类型的长度字段的辅助函数:

func lengthField(of valueField: [UInt8]) -> [UInt8] {
    var count = valueField.count

    if count < 128 {
        return [ UInt8(count) ]
    }

    // The number of bytes needed to encode count.
    let lengthBytesCount = Int((log2(Double(count)) / 8) + 1)

    // The first byte in the length field encoding the number of remaining bytes.
    let firstLengthFieldByte = UInt8(128 + lengthBytesCount)

    var lengthField: [UInt8] = []
    for _ in 0..<lengthBytesCount {
        // Take the last 8 bits of count.
        let lengthByte = UInt8(count & 0xff)
        // Add them to the length field.
        lengthField.insert(lengthByte, at: 0)
        // Delete the last 8 bits of count.
        count = count >> 8
    }

    // Include the first byte.
    lengthField.insert(firstLengthFieldByte, at: 0)

    return lengthField
}

现在我们终于得到了我们想要的数据。

let keyData = Data(bytes: sequenceEncoded)

您可以使用此数据创建SecKey.

// RSA key size is the number of bits of the modulus.
let keySize = (modulus.count * 8)

let attributes: [String: Any] = [
    kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
    kSecAttrKeyClass as String: kSecAttrKeyClassPublic,
    kSecAttrKeySizeInBits as String: keySize
]

let publicKey = SecKeyCreateWithData(keyData as CFData, attributes as CFDictionary, nil)

我希望这有帮助!如果您需要更多信息,请告诉我。

更多资源

  • Heimdall https://github.com/henrinormak/Heimdall/blob/master/Heimdall/Heimdall.swift
  • 何塞·斯威夫特 https://github.com/airsidemobile/JOSESwift
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速从模数和指数创建 SecKey 的相关文章

  • 保存时出现 iphone 核心数据未解决的错误

    尝试保存时 我从核心数据中收到一条奇怪的错误消息 但问题是错误不可重现 在执行不同任务时 它会在不同时间出现 错误消息 Unresolved error Domain NSCocoaErrorDomain Code 1560 UserInf
  • NSUndoManager 会撤消后台发生的更改吗?

    我有一个编辑视图控制器 我正在使用 NSUndoManager 它是我的持久性存储 核心数据项目 的一组 我的应用程序的功能之一是与外部服务器同步 我想知道的是 如果我正在视图中编辑某些内容 同时应用程序正在与服务器同步 如果我改变主意并决
  • 使用 GCD 异步 UITableViewCell 图像加载

    我目前正在尝试加载 Flickr 照片的 UITableView 列表 cs193p iOS 斯坦福大学 作业 5 为了避免 UI 阻塞事件 我将每个单元格的缩略图下载推迟到不同的队列中 但确实将 UI 更新回主队列中 此代码不会异步加载图
  • 如何在 Swift ios 中获取国家/地区列表?

    我已经看到了两个与我类似的问题 但这些问题的答案对我不起作用 我有一个旧项目 其中在一组方括号内手动输入了国家 地区列表 我可以轻松地在我的 pickerView 中使用它 但我想知道是否有更有效的方法来做到这一点 我将在 UIPicker
  • Parse.com 因超出突发限制而拒绝服务

    我使用 Parse 创建了一个 iOS 应用程序 其中使用的是从 Parse com 网站下载的 iOS SDK 为了创建此类应用程序 ApplicationID 和 ClientID 密钥都嵌入在 iOS 应用程序中 并在使用应用程序时从
  • iOS 中的 NSCachesDirectory 和 NSDownloadsDirectory 有什么区别?

    我想将下载的杂志保存到我的 iOS 应用程序中的一个目录中 它似乎NSCachesDirectory and NSDownloadsDirectory是合适的 我不知道它们之间有什么区别 以及哪一种适合下载杂志 任何建议表示赞赏 内存不足时
  • 如何通过情节提要向导航栏添加后退按钮?

    我现在很困惑 我在网上到处都看到添加自定义后退按钮的教程 但我什至似乎无法启动默认按钮 在我的 MainViewController 中 我有performSegueWithIdentifier 然后在另一端 我希望导航栏在左侧有后退按钮
  • 图表无法在 Xcode 14 上编译

    我在图书馆中面临以下错误 Type 图表数据集 不符合协议 范围可替换集合 实例方法不可用 替换Subrange with 用于满足协议的要求 范围可替换集合 将其附加到扩展 ChartDataSet RangeReplaceableCol
  • iPhone 6 隐藏在键盘下方的自动校正

    自动修正UITextview在 Iphone5s 中工作正常 但在 iPhone 6 中它被隐藏在键盘后面 在 iPhone 5s 中按预期工作 但不适用于 iphone 6 有什么办法可以解决 iPhone 6 上的这个问题吗 不 去物业
  • 为什么 UIWebView 实例不调用scrollViewDidScroll?

    iOS 文档说 UIWeb视图 http developer apple com library ios documentation uikit reference UIWebView Class Reference Reference h
  • 如何使用Appium获取ios中的应用程序信息,例如应用程序版本、设备操作系统版本?

    我正在使用 appium 测试应用程序并将测试输出集成到 testrail 中 我需要在 testrail 中添加设备和应用程序信息 在 Android 中 我可以使用 adb 命令获取应用程序和设备信息 例如设备型号 设备版本和应用程序版
  • (Java) 在 Mac OS X 上以编程方式访问“系统根目录”下的 SSL 证书

    我正在编写一个 Java 应用程序 它可以通过远程 Https 站点进行 REST Api 调用 远程站点由受信任的证书签名 它在 Windows 上运行良好 但由于 SSL 证书问题 在 OS X 上运行时遇到问题 我做了一些挖掘 发现原
  • 在 Spring Security SAML 身份验证请求中配置 POST ProtocolBinding

    Spring Security SAML 坚持在 SAML 身份验证请求中请求 Artifact 绑定 ProtocolBinding 属性
  • NativeScript:禁用 iOS WebView 缩放控件的方法?

    我正在尝试找出一种方法来防止用户通过捏合手势和双击来放大和缩小 iOS WebView tns ios 3 4 1 本质上禁用所有缩放 就像苹果之前使用的 html 元标记一样让用户决定是否要使用 iOS 10 及更高版本进行缩放 我找到了
  • 将 Objective-C 框架 (CocoaPod) 导入 Swift?

    我正在尝试导入libjingle peerconnection框架到我的 Xcode 项目中 但由于某种原因 我无法使用以下命令导入 Objective C 标头import RTCICEServer在 Swift 源文件中 我尝试使用头文
  • 用于 Flutter 原生广告的 Objective-C 的 Swift 等效项

    我想为我的 Flutter 项目实现原生广告 它使用 Swift 而不是 Objective C https developers google com admob flutter native https developers googl
  • 去除iOS输入阴影

    在 iOS Safari 5 上 我必须遵循输入元素 顶部内部阴影 我想删除顶部阴影 错误 webkit appearance不保存 目前的风格是 input border radius 15px border 1px dashed BBB
  • iOS:启动图像多语言

    我有一个多语言应用程序 我的问题是启动图像 根据设备的语言使用启动图像的方法是什么 有什么东西在info plist file 解决方案是像项目中的任何其他资源一样本地化 Default png 从 Xcode 的项目列表中选择 Defau
  • 使用 Swift 解析框架

    有人尝试过将 Parse Framework 与 swift 一起使用吗 只要添加桥接文件 您就可以使用 swift 和 Objective C 代码 这是我的查询 从 Parse 返回的 对象 数组正确地包含了我的所有数据 但该方法在将
  • 如何在运行时更改 UIMenu 内 UIAction 的状态?

    如何更改 UIAction 的状态 目标是切换 UIMenu 内 UIAction 旁边的状态复选标记 更改 UIAction 的state通过存储在视图控制器中的引用似乎根本不会改变状态 我错过了什么吗 View Controller i

随机推荐

  • 参数前缀“:”后不允许有空格

    我的问题是我尝试在查询中插入包含 char 的文本 我尝试在 char 之前添加双反斜杠 但仍然不起作用 ABNORMALLY java lang IllegalArgumentException org hibernate QueryEx
  • 新的 TypeScript 版本不包括“window.navigator.msSaveBlob”

    我有一个 TypeScript 项目 https github com jmaister excellentexport https github com jmaister excellentexport 并且工作正常 添加dependab
  • 如何使用Azure Blob存储挂载数据?

    我是 Azure Databricks 的新手 我的导师建议我完成机器学习训练营 https aischool microsoft com en us machine learning learning paths ai platform
  • StackFrame 的性能如何?

    我正在考虑使用类似的东西StackFrame stackFrame new StackFrame 1 记录执行方法 但我不知道它的性能影响 堆栈跟踪是否是在每次方法调用时都会构建的 因此性能不应该成为问题 还是仅在需要时才构建 您是否建议在
  • 上传进度 - 有时 $_SESSION[$key] 为空

    我有 Ubuntu 12 04 LTS 并使用 PHP 5 5 和 Apache2 通过 PHP 会话上传进度来实现上传进度 问题是它有时有效 有时无效 我的意思是有时我在上传开始时直接获得 100 的进度百分比而没有完成上传 这意味着在这
  • 自动重新加载作为 PySpark 依赖项添加到驱动程序中的模块中的更改

    我刚刚注意到一个微妙的问题 在使用时addPyFile在 PySpark 和autoreload在 Jupyter 笔记本中 发生的情况是 我在 PySpark UDF 中使用的模块中有一些代码 因此 据我所知 这些模块需要通过以下方式添加
  • 在Three.js中,如何翻译Vector3?

    我创建了一个Vector3 called ori 我已经填充了它的坐标 x y 和 z 现在 我该如何平移该矢量 例如沿 z 轴 的指示值 我试过这个 ori translateZ 100 这给我一个错误 TypeError 无法读取未定义
  • 使用哈希将类添加到具有特定 href 的 a 元素

    我试图根据 URL 哈希向特定元素添加 活动 类 但它没有按我的预期工作 这是我的代码 var hash window location hash substr 1 if hash false products copy div produ
  • 在 Sequelize model.destroy({ truncate: true }) 中不重置主键

    在 Sequelize 中 我使用这个函数 model destory truncate true 它删除表中的所有数据 但问题是它不会重置表中应设置为零的主键序列 我正在使用Mysql 有人说Mysql会自动重置主键序列 但在我的情况下并
  • C++ 标准是否对浮点数的表示指定了任何内容?

    对于类型T为此std is floating point
  • 在 igraph 中绘制网络时,R 绘图边距太大

    我已经搜索过 但还没有找到可以开始工作的解决方案 我没有任何可复制的数据 但我有下面的图表说明了我的问题 我的图太小了 对我的问题可能是什么有什么想法吗 下图大约有一半的区域是空白 使用以下命令设置边距参数 par mar c 0 0 0
  • webapi 返回的动态 JavaScript

    我正在使用 requirejs 为我的页面加载 JavaScript 我有一个 webApi 路由 可以使用 Newtonsoft JObject 动态读取文件并返回 JSON 然后 在客户端 我获取结果并将其分配给本地 JavaScrip
  • iOS7 上自动布局忽略 UITabBar(栏下的内容)

    我已在情节提要中将选项卡栏设置为不透明 但我似乎仍然是半透明的 当我设置自定义 UITabBarController 时setBarStyle仅提供不透明黑色 但这是最不重要的问题 无论我做什么 我的视图内容都会位于选项卡栏下方 就像它被
  • 我刚刚部署了我的 Vite React 站点,但我的图标/图像没有部署

    I deployed my Vite React site on Netlify but my skill icons aren t rendered Here s the site https mjshubham21 portfolio
  • Swift:验证用户名输入

    在开发 Swift 应用程序时 我有一个由用户填写的表单 我希望用户选择自己的用户名 我想要对用户名的唯一限制是 没有特殊字符 例如 只允许使用字母 下划线和数字 长度最多应为 18 个字符 最少为 7 个字符 在哪里可以找到验证输入字符串
  • 由于导入量角器而无法加载 config.ts

    我正在尝试启动一个新的量角器项目来测试有角度的网站 我全局安装了node js typescript protractor 和jasmine 我转到项目文件夹并执行webdriver manager update 那我就做webdriver
  • Apache CXF 生成数字而不是字符串

    如果一个字符串看起来像一个数字 例如 111 CXF 不将其作为字符串返回 而是作为数字返回
  • Apache Spark 中的 CPU 使用率是否受到限制?

    我最近发现 在 UDF 中添加并行计算 例如使用并行集合 可以显着提高性能 即使在运行 Spark 时也是如此local 1 模式或使用具有 1 个执行器和 1 个核心的 Yarn E g in local 1 模式下 Spark Jobs
  • 弧形边框 CSS 实现

    最近我在Dribbble上看到一个设计理念 对我很有启发 特别是顶部和底部带有弯曲 U 形的侧边栏给了我关于制作选项卡堆栈或流程图的很好的想法 我可以用 alpha 图像来制作它 但使用纯 CSS 会更好 而且我不介意 CSS3 不过我对
  • 快速从模数和指数创建 SecKey

    我尝试制作自己的 SecKey exponent let exponent 10001 modulus let modulus D6250B831F82EC984513922E797283E4D3879E1F0AD52364EBDA5A56