首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ios/ elliptic中椭圆曲线加密数据的加密

ios/ elliptic中椭圆曲线加密数据的加密
EN

Stack Overflow用户
提问于 2018-04-25 10:04:30
回答 1查看 1.3K关注 0票数 4

我一直试图使用安全快速库使用椭圆曲线加密来加密字符串,并且在使用SecKeyCreateEncryptedData(...)时出现了一个错误:

线程1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP,subcode=0x0)。

我猜数据的长度和格式不符合所选的算法,但我在文档中找不到有关它的任何信息。

代码语言:javascript
复制
let attributes: [String: Any] = [kSecAttrKeySizeInBits as String: 256,
                                 kSecAttrKeyType as String: kSecAttrKeyTypeEC,
                                 kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false]]
var error: Unmanaged<CFError>?
if #available(iOS 10.0, *) {
    guard let privateKey1 = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {return}

    let publicKey1 = SecKeyCopyPublicKey(privateKey1)
    guard let privateKey2 = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {return}

    let publicKey2 = SecKeyCopyPublicKey(privateKey2)

    let dict: [String: Any] = [:]

    guard let shared1 = SecKeyCopyKeyExchangeResult(privateKey1, SecKeyAlgorithm.ecdhKeyExchangeStandardX963SHA256, publicKey2!, dict as CFDictionary, &error) else {return}

    guard let shared2 = SecKeyCopyKeyExchangeResult(privateKey2, SecKeyAlgorithm.ecdhKeyExchangeStandardX963SHA256, publicKey1!, dict as CFDictionary, &error) else {return}

    print(shared1==shared2)

    let str = "Hello"
    let byteStr: [UInt8] = Array(str.utf8)
    let cfData = CFDataCreate(nil, byteStr, byteStr.count)

    guard let encrypted = SecKeyCreateEncryptedData(shared1 as! SecKey, SecKeyAlgorithm.eciesEncryptionStandardX963SHA256AESGCM, cfData!, &error) else {return}

    guard let decrypted = SecKeyCreateDecryptedData(shared2 as! SecKey, SecKeyAlgorithm.eciesEncryptionStandardX963SHA256AESGCM, encrypted, &error) else {return}


    print(decrypted)

} else {
    print("unsupported")
}
EN

回答 1

Stack Overflow用户

发布于 2018-04-25 10:11:53

带着线

代码语言:javascript
复制
SecKeyCreateEncryptedData(shared1 as! SecKey, SecKeyAlgorithm.eciesEncryptionStandardX963SHA256AESGCM, cfData!, &error)

您强制将shared1强制转换为SecKey类型。强制转换(通常)是个坏主意,在您的情况下,它会导致崩溃,因为shared1不是SecKey类型,而是CFData?类型--因为SecKeyCopyKeyExchangeResult返回的就是这种类型。来自文件:

代码语言:javascript
复制
func SecKeyCopyKeyExchangeResult(_ privateKey: SecKey, 
                           _ algorithm: SecKeyAlgorithm, 
                           _ publicKey: SecKey, 
                           _ parameters: CFDictionary, 
                           _ error: UnsafeMutablePointer<Unmanaged<CFError>?>?) -> CFData?

您可以清楚地看到这个函数返回CFData?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50019450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档