我正在尝试用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值?

最佳答案

您正在寻找函数SecKeyCopyAttributes。当传递一个SecKey时,此函数将返回一个包含键的CFDictionary,该键包含描述该键的der编码属性序列:

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
 }

无论如何,这不是一个直接的解决方案,但苹果从未因其直接加密而出名。
现在,您可以实现一个ASN.1解析器,或者尝试找到一个解析器并让它运行起来。但老实说,如果我是你,我会抄近路,把你需要的两个价值观拉出来。
下面是一个类似的ASN.1结构的虚拟分解,它是一个整数序列:
swift - 使用Swift获取RSA私钥的n和d-LMLPHP
它的十六进制表示…
swift - 使用Swift获取RSA私钥的n和d-LMLPHP
这些图像来自于这个excellent ASN.1 decoder here.。十六进制的突出显示部分是列表中的第二个整数,用于可见性。
您可以通过跳过v_Data头并计算每个整数的长度(字节的字面意思是“整数”)来提取所需的值。这样,您就可以精确定位结构中包含您的模和私有指数的位置。
这件事的实施我就交给你了!

10-08 01:59