iOS 關(guān)于使用ECDH算法遇到的幾個問題

最近在項(xiàng)目中網(wǎng)絡(luò)請求項(xiàng)目需要用到ECDH算法(橢圓曲線選擇P-384),計(jì)算出協(xié)商秘鑰后導(dǎo)出密碼使用HKDF進(jìn)行密鑰擴(kuò)展犁享,這里將算法遇到的幾個問題記錄下來

1乐设、生成公鑰和私鑰

iOS 10.0之后有個類SecKey晨缴,專門用于生成公鑰和私鑰。生成代碼如下圖


var error: Unmanaged<CFError>?
        let attributes: [String: Any] = [kSecAttrKeySizeInBits as String: 384,
                                         kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
                                         kSecAttrKeyClass as String: kSecAttrKeyClassPrivate,
                                         kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false],
                                         kSecPublicKeyAttrs as String:[kSecAttrIsPermanent as String: false]]
        
        self.privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error)
        
        if let privateKey = self.privateKey {
            publicKey = SecKeyCopyPublicKey(privateKey)
        }

其中384表示的是 P-384橢圓曲線两残。另外還有P-224, P-256, P-521這些橢圓曲線

2、密鑰字符串和SecKey的互相轉(zhuǎn)換

使用ECDH加密把跨,必然涉及到服務(wù)端傳給APP公鑰磕昼,APP傳給服務(wù)端公鑰,就這需要密鑰字符串和SecKey的互相轉(zhuǎn)換节猿。在這里就不能不說到一個

SecKey的一個坑:在將密鑰字符串轉(zhuǎn)化為SecKey時票从,會自動的去掉密鑰的ASN.1,所以在轉(zhuǎn)化時得先加上


// MARK: -
public extension SecKey {
    func publicSeckeyToString() -> String? {
        var error:Unmanaged<CFError>?
        if let cfdata = SecKeyCopyExternalRepresentation(self, &error) {
            // 添加secp384r1的asn.1
            let pemPrefixBuffer :[UInt8] = SecKey.getPKCS1SHA384ASN1()
            var finalPemData = Data(bytes: pemPrefixBuffer as [UInt8], count: pemPrefixBuffer.count)
            finalPemData.append(cfdata as Data)
            let finalPemString = finalPemData.base64EncodedString(options: .lineLength64Characters)
            return finalPemString
        }
        return nil
    }
   
    
    // 根據(jù)公鑰字符串生成seckey
    class func initPubkeyString(pubkeyString: String) -> SecKey {
        let pubKeyByte:Array<UInt8> = Data.init(base64Encoded: pubkeyString)!.bytes
        let asn1Byte:Array<UInt8> = SecKey.getPKCS1SHA384ASN1()
        let array = pubKeyByte[asn1Byte.count...]
        
        var error: Unmanaged<CFError>?
        let attributes = [kSecAttrKeySizeInBits as String: 384,
                          kSecAttrKeyType: kSecAttrKeyTypeECSECPrimeRandom,
                        kSecAttrKeyClass: kSecAttrKeyClassPublic] as NSDictionary
        let pubkey = SecKeyCreateWithData(Data(array) as NSData, attributes, &error)
        return pubkey!
    }
    
    class func getPKCS1SHA384ASN1() -> Array<UInt8> {
        return [
            0x30, 0x76,
            0x30, 0x10,
            0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x05,
            0x2b, 0x81, 0x04,
            0x00, 0x22, 0x03, 0x62, 0x00
        ]
    }

}

這里我偷了懶滨嘱,沒有繼續(xù)翻蘋果的文檔看有沒有關(guān)于asn.1的類峰鄙,我是直接用的ASN.1 JavaScript decoder 這個網(wǎng)址去查看了我這所需要的P-384曲線的ASN.1

3、之后就是計(jì)算出協(xié)商秘鑰了太雨,這里代碼很簡單


let exchangeData = exchangeKey(privateKey: privateKey, pubkey: pubkey)!

后面用HKDF算法對協(xié)商密鑰擴(kuò)展我這用的第三方庫CryptoSwift吟榴,代碼


let key = try! HKDF(password: [UInt8](exchangeData), variant: .sha256).calculate()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市囊扳,隨后出現(xiàn)的幾起案子吩翻,更是在濱河造成了極大的恐慌兜看,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狭瞎,死亡現(xiàn)場離奇詭異细移,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)熊锭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門弧轧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碗殷,你說我怎么就攤上這事精绎。” “怎么了锌妻?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵代乃,是天一觀的道長。 經(jīng)常有香客問我仿粹,道長搁吓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任牍陌,我火速辦了婚禮擎浴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毒涧。我一直安慰自己贮预,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布契讲。 她就那樣靜靜地躺著仿吞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捡偏。 梳的紋絲不亂的頭發(fā)上唤冈,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音银伟,去河邊找鬼你虹。 笑死,一個胖子當(dāng)著我的面吹牛彤避,可吹牛的內(nèi)容都是我干的傅物。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼琉预,長吁一口氣:“原來是場噩夢啊……” “哼董饰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卒暂,失蹤者是張志新(化名)和其女友劉穎啄栓,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體也祠,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昙楚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了齿坷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片桂肌。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡数焊,死狀恐怖永淌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情佩耳,我是刑警寧澤遂蛀,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站干厚,受9級特大地震影響李滴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛮瞄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一所坯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挂捅,春花似錦芹助、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至伺糠,卻和暖如春蒙谓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背训桶。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工累驮, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舵揭。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓谤专,卻偏偏與公主長得像,于是被迫代替她去往敵國和親琉朽。 傳聞我的和親對象是個殘疾皇子毒租,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容