如何在 ios、swift 中生成公钥/私钥对,如下所示

2024-04-17

这就是我生成公钥/私钥对的方式

var statusCode: OSStatus
var publicKey: SecKey?
var privateKey: SecKey?

let publicKeyAttribute: [NSObject : NSObject] = [kSecAttrIsPermanent: true as NSObject, kSecAttrApplicationTag: "publictag".data(using: String.Encoding.utf8)! as NSObject]

let privateKeyAtrribute: [NSObject: NSObject] = [kSecAttrIsPermanent: true as NSObject, kSecAttrApplicationTag: "privatetag".data(using: String.Encoding.utf8)! as NSObject]

var keyPairAttr = [NSObject: Any]()
keyPairAttr[kSecAttrType] = kSecAttrKeyTypeRSA
keyPairAttr[kSecAttrKeySizeInBits] = 2048
keyPairAttr[kSecReturnData] = true
keyPairAttr[kSecPublicKeyAttrs] = publicKeyAttribute
keyPairAttr[kSecPrivateKeyAttrs] = privateKeyAtrribute


statusCode = SecKeyGeneratePair(keyPairAttr as CFDictionary, &publicKey, &privateKey)

这会生成如下所示的密钥对,

公钥:

Optional(<SecKeyRef algorithm id: 1, key type: RSAPublicKey, version: 4, block size: 2048 bits, exponent: {hex: 10001, decimal: 65537}, modulus: 9A6AC9860B66ED5276A1C90C54DB341957A5DA52A040617C2A826E36B7D4F656132C231F0EF5B5BF073DDA2A60A581E02D27DD776845FE7A79C6A84DDE9620D193EC0B20B08E25D01FC28FB5E2FAEB4F945E9FB8A2153E571DEF5CC187A0F511A372E4616691BD30485D62D50B57E589F0AB998036A6EBFDA45B9765A2A4A95C96EADAB8E0D7F24044D99C7AD5C07F2AED929465B96F8D8435E8953DA2E6E39974D35DFED44296C650C40997961398C05E55027B909C4B1D9C6D58F6A7231B5BAC6B0B8631184649F1EB1F78623758F3BC7B98FEC0665F11BF36D75B468185F26B4ABE96855E0C9BEF6120D505000CF0A2A1661BC16EC9857D48C104AC37CD21, addr: 0x60800002e580>)

私钥:

Optional(<SecKeyRef algorithm id: 1, key type: RSAPrivateKey, version: 4, block size: 2048 bits, addr: 0x60800002e5c0>)

这些是什么.pem or .der

但我需要像下面这样

公钥:

    -----BEGIN RSA PUBLIC KEY-----
    MIIBCgKCAQEA0bipoOhkkvPxcsyOzcqsIUeVe0+iwe8W7N4EbHZMgujRERu1TPpy
    UcCO0uuKmm1TU09Kl40rRvDbtgB1YcGV3FPnNp3sOyFVsdyZ5bzxZtyyLrSWtj/n
    bLnGwaG9xJSwd2R/pTQLzOLV5KldwD2eUb3Z4Z4e9Z8II7eWgGaCLLqbrtEAa05N
    EqARckxrzJ1S3j+59h4AQovF72KI90/kRPryT2OGDiVlJ6CTjn2ZnTYcx65X6Rwf
    AeJKHZAGhw96j9tXyS+dJcXy4IBUTi3PXw0aEfhHQr/JsSHuMp/8mrhVJEokXb1C
    gKDZgJXujpGhCBdztHBAJxLBQMlODg7srwIDAQAB
    -----END RSA PUBLIC KEY-----


and private key should be like : 

-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEAsfxMagVKY5++61Kot0esyhEOesqyQlZNvWbqMBcOoaOAb3pk
LvwaGJ2YtD12u4yDEKcY5rpX7B/2t8GBHf+74NG47zAutf4Gf6qgQRUmIx2b7i4k
WBt3KIifb/Zfs9KVJLhD4007bg1OtXA4kIhhXiuvhajDjDLOEthogF45CkJe+N67
JnH5hVW5CqBxPyRCrWCFbEHcXs5H515JV/Kz1+JVrB2/M03fW751wptO2GdGwsde
ofqQzY+WUzqUihXigIjAVLFRemky3HpwuhzXUJn6A0ZD4tkk1JLstpSSJdBpH+L2
b9QlOitehxFgRsYmto+idpD1XrS9UyUtmpbTuwIDAQABAoIBAQCYvrAJcJ7lnmtn
Ytm96LoF89tcT+Xpfk1bFR43xSHeYAXSJdQiamIu69joHbNuwuib+vsoz5Sy5L+D
9YHMb/MZvoIaa1w6/VUwbQr4r6C6FCgEoP65ymBZnd5OZL6/ASLTj3tbb6VoDe2V
UkiI6TG+cnlAmJOxFsy5aZVNTQ9gmCMS0+AdpTbDsxTPg3y0EKFXeVRyKjq0lO9m
p3G5yHkFjzWWY6s5XHx27gDTt8eXg/un72Qsz1rh5iUnAoxrga0Oco3Yk9DMvMwz
a1I1Lo5fpB6FbTGX3k24heSnLDFEnlBvsBBg0g/n/qgwoZJ81MgG8Q4kAfeScuCI
sYVnHEBpAoGBAOpnrKEkyhk1rXG4Md+z1/odhqx89mV7mF1ttW4IhFcwpJSMohsG
r27Ic87whkpRxz2Mwj3B5WPGne4UkbvniH46n3jEW7ZIUF+ASVWkjMaGJWtOqSLC
I19Snie9WvpREwaCVuvT2l4IeM1WL5gKotBwa3csZgGYH6gcyW5Ipbo/AoGBAMJh
/+WXbohF4+A989q0jYjRRhKwUJAYeK8/AePrx8MnAXnRd09TiqeGn0Xig/RNZ0RE
96/TC1dTIBIHk5aDMy3vQhhYF0KbwcQWmCOnGo1qNTTaWTa3UitFMWf0hO0HuZtp
RyD1YwhHP0W2tiK2GVjCreqIYASCpYKLq5Qq1K+FAoGARk2h8RLfqn/27UyZaMa/
2DxS0BkKrZVMNXlaGQ5k4uGr+wHS/NgcddWZJk/tdwzf/Q3ilDM7YZmIdIemzfy7
a2CZw9bgyuMVeA85733S2xgQ0QZepBYmFcjptnGMf9chJaqh90krDVjtImjfDXLj
MjEFilC+p2vA0uMPZwxS6HECgYAc5dLUQBoHmlRRTwSEvBjagToopxujAHBYpUZT
qwbMpWzbvl89ZM8VLrdY/V7en+89P/+OnRJvjgUTiRrQ4npmVs59rgLvPRamXzGJ
A1u4MFTuoZNnxgMqOaQprzlfv6lBSHpxlOl/HpByfcJAENBd2LtgRZv4r6+JY9hD
M8bgvQKBgCDTSCLj5c1CYyuJMdrz9L5+xLFmrmL48djhK460ZcmcZ/gP808CyXx/
sDneow+JWt7Jb3p5zyUvvq1aDGNSsn4plB2rg7AqtoHcZYyFFZGI/K/b6JZna1yu
FUYOfcanunabxY1wPQxuvR+AEuufBjB0aKg+qkLCCN1HYQtLs+N8
-----END RSA PRIVATE KEY-----

怎么做。希望您对此提供帮助。


您可以使用下面的方法generateKeyPair创建公钥/私钥对,然后使用SecKeyCopy外部表示外部表示方法。

Swift3

//tuple type for public/private key pair at class level
typealias KeyPair = (publicKey: SecKey, privateKey: SecKey)

// In your code block

    let publicKeyTag: String = "com.org.yourapp.publickey"
    let privateKeyTag: String = "com.org.yourapp.privatekey"
    let keyPair = generateKeyPair(publicKeyTag, privateTag: privateKeyTag, keySize: 2048)
    var pbError:Unmanaged<CFError>?
    var prError:Unmanaged<CFError>?
    guard let pbData = SecKeyCopyExternalRepresentation((keyPair?.publicKey)!, &pbError) as Data? else {
        print("error: ", pbError!.takeRetainedValue() as Error)
        return
    }
    guard let prData = SecKeyCopyExternalRepresentation((keyPair?.privateKey)!, &prError) as Data? else {
        print("private key error: ")
        return
    }
    let strPublicKey = appendPrefixSuffixTo(pbData.base64EncodedString(options: .lineLength64Characters), prefix: "-----BEGIN RSA PUBLIC KEY-----\n", suffix: "\n-----END RSA PUBLIC KEY-----")
    print("public key: \n", strPublicKey)

    let strPrivateKey = appendPrefixSuffixTo(prData.base64EncodedString(options: .lineLength64Characters), prefix: "-----BEGIN RSA PRIVATE KEY-----\n", suffix: "\n-----END RSA PRIVATE KEY-----")
    print("private key: \n", strPrivateKey)

辅助功能:

func appendPrefixSuffixTo(_ string: String, prefix: String, suffix: String) -> String {
    return "\(prefix)\(string)\(suffix)"
}

返回公钥/私钥对的generateKeyPair方法

func generateKeyPair(_ publicTag: String, privateTag: String, keySize: Int) -> KeyPair? {
    var sanityCheck: OSStatus = noErr
    var publicKey: SecKey?
    var privateKey: SecKey?
    // Container dictionaries
    var privateKeyAttr = [AnyHashable : Any]()
    var publicKeyAttr = [AnyHashable: Any]()
    var keyPairAttr = [AnyHashable : Any]()
    // Set top level dictionary for the keypair
    keyPairAttr[(kSecAttrKeyType ) as AnyHashable] = (kSecAttrKeyTypeRSA as Any)
    keyPairAttr[(kSecAttrKeySizeInBits as AnyHashable)] = Int(keySize)
    // Set private key dictionary
    privateKeyAttr[(kSecAttrIsPermanent as AnyHashable)] = Int(true)
    privateKeyAttr[(kSecAttrApplicationTag as AnyHashable)] = privateTag
    // Set public key dictionary.
    publicKeyAttr[(kSecAttrIsPermanent as AnyHashable)] = Int(true)
    publicKeyAttr[(kSecAttrApplicationTag as AnyHashable)] = publicTag

    keyPairAttr[(kSecPrivateKeyAttrs as AnyHashable)] = privateKeyAttr
    keyPairAttr[(kSecPublicKeyAttrs as AnyHashable)] = publicKeyAttr
    sanityCheck = SecKeyGeneratePair((keyPairAttr as CFDictionary), &publicKey, &privateKey)
    if sanityCheck == noErr && publicKey != nil && privateKey != nil {
        print("RSA key pair generation Successful")
        return KeyPair(publicKey: publicKey!, privateKey: privateKey!)
    }
    return nil
}

输出如下:

public key: 
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEAz1zfbybUt5jZX5P6ymy+g04wj3iTYCV8eGbkFyqFNsfN8Lnk6x4x
zstfnpE6asV6NkBecQnT1a9X6AVxA4Mxq4CeysR10TRr8HGczQGKl7R3Nbvvmgw+
jX8LZGxsQTO6qYWhMAtOPFfsMW9iy3AsDE7OIYfya6y/l919ExbgPzJ+0nLdiBmd
bmmzOQ1PaKt3OcxG6qZyBoixRTTOm4UDCLDzYdjz5dS1rbvb7pD15TpkZBkuMRm5
QDv+xhKcz1UFGQP7ssZS++ZoQlF2CZJuLz8R1uUYg4xQnF0r1IBBrlVtKnblgMcA
ZykNweGwrdPaWF3PeZmbvG+/m+Kt7/4BJwIDAQAB
-----END RSA PUBLIC KEY-----
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ios、swift 中生成公钥/私钥对,如下所示 的相关文章

随机推荐

  • 如何在运行时知道 POJO 的 ID (@GenerateValue)

    我有一个表格可以填写 POJO 名为Father 在里面 我有一个FotoFather field 当我保存一个新的 Father 时 我会自动保存 FotoFather 对象 使用 Hibernate ORM 模式 FotoFather
  • 扫描 iPhone 范围内的蓝牙设备需要多长时间?

    我知道 iPhone 蓝牙功能要到 3 0 才能通过 SDK 访问 但是需要多长时间才能找到该区域的设备 它取决于该区域的设备数量吗 如果范围内有大约 5 个设备 扫描发现所有设备是否需要花费 30 秒的时间 我知道有很多未知因素 但我试图
  • 如何设置 pygame.transform.rotate() 的枢轴点(旋转中心)?

    我想围绕中心以外的点旋转矩形 到目前为止我的代码是 import pygame pygame init w 640 h 480 degree 45 screen pygame display set mode w h surf pygame
  • Xdebug v3.0.2 与 PHP v8.0.0

    我刚刚使用 XAMPP v3 2 4 迁移到 php v8 0 0 但 Xdebug 不起作用 执行不会在断点处停止 我的安装说明 Download php xdebug 3 0 2 8 0 vs16 x86 64 dll Move the
  • Symfony:解析 web.xml 时出现 InvalidArgumentException

    最近 我将 Symfony 系统移动到另一台服务器 从那时起就出现错误 技术细节是 Windows Server 2012 上的 apache 2 4 服务器 apache可以通过本地网络访问的文件服务器 当我移动 Symfony 页面时
  • ERC721:转账调用者不是所有者也不是批准的

    我有一个 nftToken 合约 可以将代币铸造到 msg sender 然后我在市场合约中有一个函数 可以将 nft 从所有者转移到市场合约 但是 我收到一条错误消息 ERC721 转账调用者不是所有者也不是批准的 这是我的 nftCon
  • ReplaceAll 性能秘诀是什么? [HTML 转义]

    我花了一些时间寻找转义 html 字符串的最佳方法 并发现了一些相关讨论 讨论1 https stackoverflow com questions 24816 escaping html strings with jquery 讨论2 h
  • Android获取recyclerview项目和位置上选定的文本部分

    在我的适配器中 可以选择显示弹出窗口的项目 例如copy cut或等等 现在我怎样才能获得所选的文本部分recyclerView项目和位置 我阅读了更多有关找到此解决方案的文档 但我不知道该怎么做 这是我的适配器 我想获取文本和位置的选定部
  • Python .localize 和 tzinfo 之间的日期时间差异

    为什么这两行会产生不同的结果 gt gt gt import pytz gt gt gt from datetime import datetime gt gt gt local tz pytz timezone America Los A
  • UICollectionView cellForItemAt indexPath 在 iOS 10 中跳过行索引

    I have UICollectionView具有水平滚动和分页功能 当我第一次滚动到下一页或上一页或从左到右更改滚动方向时 indexPath row 的值cellForItemAtIndexPath改变了 3 而不是 1 然后它就可以正
  • css 100%宽度div不占据父级的整个宽度

    我在一个页面上有两个 div 一个带有背景的网格容器和一个需要放置在另一个网格中心的内部网格 我的CSS html body margin 0 padding 0 width 100 grid container background f8
  • 什么是“3D语法”?

    在编写 Racket 宏的上下文中 3D 语法 是什么意思 这句话我听过好几次了 包含一次对宏的引用I正在写作 但那是不久前的事了 我修复了它 现在我不记得我最初做错了什么 另外 是 3D 语法吗always坏的 或者是像eval 如果你认
  • 是否可以将 CSS Scroll Snap 应用于 HTML 标签而不是 Body 标签

    CSS Scroll Snap 允许浏览器捕捉滚动到容器中的元素 要将相同的逻辑应用于垂直页面滚动 我发现它必须应用于而不是 见下文 这不是一个主要问题 但它确实有效地创建了一个滚动区域而不是使用窗口滚动 虽然这看起来不错 但它有一些副作用
  • 在 Xcode Interface Builder 中对场景进行排序

    所以我不知道该怎么称呼它 但它是 Xcode 中 Storyboard Editor 左侧的那个栏 显示所有不同的场景 我喜欢使用故事板 但我对它们最大的不满是场景以完全随机的方式组织在该列表中 每次我向故事板添加新的视图控制器时 它都会被
  • 阻止 Chrome 扩展程序在我的网站上运行

    作为一名网络开发人员 有什么方法可以阻止用户的 Chrome 扩展应用到我的网站吗 即标题 元标记等等 此外 如果有的话 是否还有一种方法可以将特定扩展列入白名单 这是不可能的 在网络服务器端 您只能控制浏览器允许您控制的内容 简单来说 这
  • Derby 还是 MySQL 或者...?

    对于什么类型的需求 您会选择 Apache Derby 或 Java DB 而不是 MySQL 反之亦然 我环顾四周 人们只是比较两者 但没有人谈论何时考虑每一个 我正在使用 Glassfish Java Restlet MySQL 开发一
  • sql从多个记录中仅选择最新的

    我有一个名为 客户年龄 的表 如下所示 ID 1 2 3 4 5 6 7 8 9 NAME JIM JIM JIM NICK NICK NICK Paul Paul Paul VALUE 20 13 12 10 20 8 4 24 14 我
  • 我们可以让 selenium webdriver 在运行时等待用户点击网页链接而不使用隐式等待吗?

    我正在使用 Firefox 驱动程序和 java 并尝试从网站上抓取一些数据 其中涉及人工交互 我必须要求用户输入搜索字符串 然后相应地用户必须通过人眼分析来选择打开哪个搜索结果 我们的努力只是为了通过脚本让一些零碎的东西更快地工作 我的问
  • 检查记录是否存在数据库 - 错误显示

    如何检查用户名或电子邮件是否存在 然后将错误消息放入错误数组中 现在我有 sql SELECT username email FROM users WHERE username username OR email email query m
  • 如何在 ios、swift 中生成公钥/私钥对,如下所示

    这就是我生成公钥 私钥对的方式 var statusCode OSStatus var publicKey SecKey var privateKey SecKey let publicKeyAttribute NSObject NSObj