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



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

RSA 私钥示例--->

-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEApSrpu9xy2MGlmKBpSarF5w2vGk77DXmU3brJyJxKOLzf4ARo
zjNcfO87T/8F23ES5iOU6z8Y6HUfLKkDHa2IwfraUWDoMudDZTCrROH4bA74TFo/
Mlhh1awotNqB1D24H3wnhkd87BcLVZWv2qDV1SVmWu9xW6GrffyjkWojkqzYwSHT
viPKfWzsQ6cbedN7WUyUZt+78YZlY13fMoXLY26xgxuBYld2vLI3qHooJnRTf32u
8aqM+X52h0/6MoYJgc9zwUTNBWrd3G6GHnRXbYpao56IYAoUtwBJHzQ5md0FVUKH
Vqfk8eJp3YKujYyrpSFKj7rKI/pHHZawnmPQLQIDAQABAoIBABNisgRGn4QpVlJP
oYvv60JvLLodwwGV348WuVA+Z8e5A127psFs7dIMEh4VhI54+wrf6j6iLT47YOlQ
/PiiwYZi9vTONvKiihp6V9/B1fJ431O20+wIy5LUngJ8EvjiNZYccFcmVNcw7Tei
Vf2HGxHlTdomeFuU4hfraxdKKdqxFnvT/lfbo/uX5tN660DSAGd1xRmUf08w9OUU
nG0LVk20hz/dn+WUnF+GnZfFjVI06IwvfMiDN2Z7zXP+IBOH7fDwQZUy6ExnesnR
79iswCEyVx0FFveAMpHvLMUhEKg2iYIRXzD/Oy4sX5pDZT2fE289MtkgZbHxXDLJ
cbucSVECgYEA1/tjvX1zdxGG9wT4zld+WYRa9ax+EeECWqOXn95c3BY3bTUlMQlX
4HlOiYUAzwIf58LaKuTYRjUiv9J9Axw7jkxd4P6Y7BYOatdAfv8PG1Y+SA7r0utM
D37DCesroD0C4IuRc+YzVvjdtvsNDgpKf5cXFKWoNQVX4t4UbUcRaA8CgYEAw8VC
vZieW/eM8yKqna8BFt3siun8ucieh/PGutBfq8W7sdqDb0JZpdWYOj12P/0/9gSG
dlaSpTq7svxTj9wdb5kU1Yp56CWM7wy+adCQvWyMXJ6s/CA8SZM9KCmWt6w4vRAm
+6oElxyT4exYFvXebRN6GXs0TWucuqQ64/z+6AMCgYBn1kC5lVqx4AdXM1i7O21P
dEaW3nst9VPAZ+45uhpC5Zt4MZjT3n4VObz8eKlO3OKh9hgVjzg7aMhwGK5plGU9
oJFx3nV+64u66gnkBJQqvGftFN9j5CQJPxRd7GZo/2wmsHMZmY8NPVC67C/2lBQF
C4rZLluUQiFivQptD0HbGQKBgEOAT5vZ9LhXKdVnnZaTEfgVewsG1OomH2tXBa3C
TUqH+ki/xFPnd8uzUzK5oH090AD+3HIPNa8dCj0Tvag7yDaDfOiIP7JoyChgp4MK
s+1scRU6bQDeCIuB5jNj66DXFBU0bYyWudB0vRTIDjOUgSXw8ke48HbFZRwBpoCX
6jiLAoGAGhHvi9NUPaWv3fpPTQnbo2aaYSXyniW7s5bGgUQmIjuFDo/GHomIh6T/
RJgyQYxBlUqCLs/C6YABa6hce/qMSS0JEt10uqknYfYjZ3jZEZSKPy8vpxaZX6ot
dHruKemEoO1yLKhGI56KCdhWMrfsn7VbY+wCX2S1J/MZjWBIKNY=
-----END RSA PRIVATE KEY-----
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)
}

最新更新