【问题标题】:Encrypt data with external key in swift快速使用外部密钥加密数据
【发布时间】:2018-11-04 05:35:42
【问题描述】:

我应该使用从服务器通过 HTTPS 发送的字符串公钥加密一些数据并发送回服务器。

我做了很多研究,也研究了这些主题以及很多其他相关的东西,但无法解决我的问题。

我的意思是我不能将字符串转换为 seckey 来使用这个函数。

func SecKeyEncrypt(_ key: SecKey, 
             _ padding: SecPadding, 
             _ plainText: UnsafePointer<UInt8>, 
             _ plainTextLen: Int, 
             _ cipherText: UnsafeMutablePointer<UInt8>, 
             _ cipherTextLen: UnsafeMutablePointer<Int>) -> OSStatus

1-how to encrypt and decrypt a String(Plain Text) with RSA public key in ios, swift

2-https://developer.apple.com/documentation/security/certificate_key_and_trust_services/keys/using_keys_for_encryption

这是用于加密的 MyCode:

let publickey : SecKey = "# -----BEGIN PUBLIC KEY-----  some key  ---- 
END PUBLIC KEY----- #" as! SecKey

let message = "plain text"
let blockSize = SecKeyGetBlockSize(publicKey!)
var messageEncrypted = [UInt8](repeating: 0, count: blockSize)
var messageEncryptedSize = blockSize

var status: OSStatus!
        status = SecKeyEncrypt(publickey!, SecPadding(rawValue: 0), message, 
message.characters.count, &messageEncrypted, &messageEncryptedSize)

app 在第一行就崩溃了。

【问题讨论】:

    标签: ios swift encryption rsa


    【解决方案1】:

    你不能说

    let publickey : SecKey = 
        "# -----BEGIN PUBLIC KEY-----  some key  ----END PUBLIC KEY----- #" as! SecKey
    

    您不能只获取一个字符串,然后以某种方式将其神奇地转换为 SecKey。您必须从公钥派生 SecKey。

    【讨论】:

    • 查看您自己引用的链接,以及stackoverflow.com/questions/28808101/… 和其他链接。
    • 我知道它不起作用但我不知道该怎么做,请告诉我一些关于“从公钥中获取 seckey”的信息 我最近开始 ios 编程并努力学习一些概念..原谅我
    • 您已经有两个带有代码的链接。我只是在解释崩溃! :) 奇怪的是,斯威夫特没有警告演员不能工作,但那是另一回事了。
    • CoreFoundation 类型都是,深入的,void*,所以它们总是成功as! 转换。 let x = "" as! CFArray 也可以。你应该只在 CFTypes 上使用as 强制转换(永远不要使用as! 强制转换),除非你真的很清楚自己在做什么。
    • @RobNapier 谢谢,我知道是这样的,但我觉得 Swift 在这方面应该更聪明。它应该知道哪些 CFRef 类型是免费桥接到哪些对象类型,哪些不是。
    【解决方案2】:

    第一个链接你有 90% 的成功率。重要的是:

    let data2 = Data.init(base64Encoded: serverPublicKey)
    

    它期望输入是 Base64 编码的,你的数据就是这样,除了你还有一个 # -----BEGIN PUBLIC KEY----- 前缀(和后缀)。在尝试对数据进行 base64 解码之前,您需要先完成这些。确保data2 中包含合法数据。

    尝试使用String.dropFirst(Int)String.dropLast(Int),您应该能够将您的输入修剪为只是Base64 的内容。 (您可能还需要通过filter { $0 != "\n" } 运行它。)

    这应该可以让你到达你需要去的地方。如果您仍然卡住,请告诉我;我在某个地方有代码可以做到这一点,但我手头没有。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      相关资源
      最近更新 更多