如何在iOS Swift中从RSA私钥获取模量和指数?

问题描述 投票:0回答:1

如何解析RSA私钥以从中获取模数(n)和指数(e)?

encryption rsa private-key
1个回答
-1
投票
func parsePrivateSecKey(privateKey: SecKey) -> (mod: Data, exp: Data) {
        let pubAttributes = SecKeyCopyAttributes(privateKey) as! [String: Any]

        print("pubAttributes----\(pubAttributes)")

        //        let keydata = pubAttributes[kSecPrivateKeyAttrs as String] as! [String: Any]
        //        print("----key data ------===\(keydata)")

        let data = Data(base64Encoded: "")
        // Check that this is really an RSA key
        guard    Int(pubAttributes[kSecAttrKeyType as String] as! String)
            == Int(kSecAttrKeyTypeRSA as String) else {
                // throw "Tried to parse non-RSA key as RSA key"
                return (mod: data!, exp: data!)
        }

        // Check that this is really a private key
        guard    Int(pubAttributes[kSecAttrKeyClass as String] as! String)
            == Int(kSecAttrKeyClassPrivate as String)
            else {
                // throw "Tried to parse non-private key as private key"
                return (mod: data!, exp: data!)
        }

        let keySize = pubAttributes[kSecAttrKeySizeInBits as String] as! Int

        // Extract values
        let pubData  = pubAttributes[kSecValueData as String] as! Data
        print("pubData---\(pubData)")
        //  SecKeyCopyModulus

        //Find modulus data length
        let modulusLengthData = pubData.subdata(in: 9..<11)
        print(modulusLengthData as NSData)
        let modulusLength = BigUInt(modulusLengthData)
        print("mod lenth ===\(modulusLength)")
        //find MODULUS
        var modulus  = pubData.subdata(in: 11..<(Int(modulusLength) + 11))
        let reqMod = BigUInt(modulus)
        print("final modulus====\(reqMod)")

        //Find exponent data length
        var expDataLength = pubData.subdata(in: (Int(modulusLength) + 11 + 7)..<(Int(modulusLength) + 11 + 7 + 1))
        print(expDataLength as NSData)
        var bytes_to_find : [UInt8] = [0xFF]    //0xFF = 255 size
        let datafind = Data(bytes: &bytes_to_find, count: bytes_to_find.count)
        let range = expDataLength.range(of: datafind, options: [], in: Range(NSRange(location: 0, length: expDataLength.count)))
        var exponentLength = BigUInt(expDataLength)
        print("exponent lenth ===\(exponentLength)")
        //Find EXPONENT
        var exponent  = pubData.subdata(in: (Int(modulusLength) + 11 + 7 + 1)..<(Int(modulusLength) + 11 + 7 + 1 + Int(exponentLength)))
        //check if its size is 255 or more and get data length accordingly
        if range == nil {
            expDataLength = pubData.subdata(in: (Int(modulusLength) + 11 + 7)..<(Int(modulusLength) + 11 + 7 + 2))
            print("0xFF not found...")
            exponentLength = BigUInt(expDataLength)
            print("exponent lenth ===\(exponentLength)")
            //Find EXPONENT
            exponent  = pubData.subdata(in: (Int(modulusLength) + 11 + 7 + 1)..<(Int(modulusLength) + 11 + 7 + 2 + Int(exponentLength)))

        }


        let reqExp = BigUInt(exponent)
        print("final exponent====\(reqExp)")

        if modulus.count > keySize / 8 { // --> 257 bytes
            modulus.removeFirst(1)
        }

        return (mod: modulus, exp: exponent)
    }
© www.soinside.com 2019 - 2024. All rights reserved.