如何解析RSA私钥以从中获取模数(n)和指数(e)?
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)
}