使用Swift获取RSA私钥的n和d

时间:2019-06-15 13:40:51

标签: swift cryptography rsa

我正在尝试在Swift中实现姚明的百万富翁问题算法,并且遇到了麻烦。

要实现此算法,我需要生成一个RSA私钥并获取nd

到目前为止,我已经创建了这样的密钥:

import Security
import Foundation

let tag = "com.example.keys.mykey".data(using: .utf8)!
let attributes: [String: Any] = [kSecAttrKeyType as String: kSecAttrKeyTypeRSA,
    kSecAttrKeySizeInBits as String: 1024,
    kSecPrivateKeyAttrs as String:
        [kSecAttrIsPermanent as String: false,
        kSecAttrApplicationTag as String: tag]
]

var error: Unmanaged<CFError>?
guard let privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error) else {
    throw error!.takeRetainedValue() as Error
}

privateKey似乎是SecKey类型,但我不知道如何从中获取nd

如何生成RSA私钥并获取nd值?

2 个答案:

答案 0 :(得分:2)

您正在寻找功能SecKeyCopyAttributes。传递SecKey时,此函数将返回一个包含密钥CFDictionary的{​​{1}},该密钥包含描述密钥的DER编码属性序列:

v_Data

绝不是直接解决方案,但苹果从未以其直接加密技术而闻名。

现在,您可以实现ASN.1解析器,或者尝试找到一个解析器并将其运行。但老实说,如果我是你,我只是将其快捷方式并仅提取您需要的两个值。

这里是类似ASN.1结构的虚拟细分,该结构是整数序列:

enter image description here

及其十六进制表示形式...

enter image description here

这些图像来自此excellent ASN.1 decoder here.。十六进制的突出显示部分是列表中的 second 整数,以降低可见性。

您可以通过跳过PrivateKey ::= SEQUENCE { version INTEGER, modulus INTEGER, <- n publicExponent INTEGER, privateExponent INTEGER, <- d prime1 INTEGER, prime2 INTEGER, exponent1 INTEGER, exponent2 INTEGER, coefficient INTEGER, otherPrimeInfos OtherPrimeInfos OPTIONAL } 标头并计算每个整数的长度来提取所需的值(SEQUENCE字节的字面意思是“ INTEGER”)。这样做,您可以查明结构中包含模数和私有指数的位置。

我会留给你实现的方法!

答案 1 :(得分:2)

由于卢克(Luke)的回答,我将其按如下方式工作。我决定使用BigInt swift软件包。

import BigInt

var error2: Unmanaged<CFError>?
let privateKeyData = SecKeyCopyExternalRepresentation(privateKey!, &error2) as Data?
let privateKeyDataN = privateKeyData![10...10+128]
let privateKeyDataD = privateKeyData![147...147+127]
let n = BigUInt(privateKeyDataN)
let d = BigUInt(privateKeyDataD)